توجيه الأجهزة الصوتية المجمّعة

تضيف ميزة توجيه الصوت المجمّع إلى الأجهزة الصوتية إمكانية بث الصوت إلى أجهزة صوتية متعددة في الوقت نفسه. باستخدام هذه الميزة، يمكن للتطبيقات التي لديها أذونات خاصة اختيار أجهزة متعددة مفضّلة لاستراتيجية معيّنة من خلال واجهات برمجة تطبيقات النظام. يمكن للتطبيقات اكتشاف إمكانات الأجهزة الصوتية بدقة أكبر باستخدام واجهات برمجة التطبيقات العامة التي توفّرها هذه الميزة. بالنسبة إلى الإصدارات Android 11 والإصدارات الأقدم، يتيح تنفيذ إطار عمل الصوت إمكانية محدودة لاستخدام أجهزة صوتية متعددة من النوع نفسه (على سبيل المثال، سماعتَي رأس Bluetooth A2DP) متصلتَين في الوقت نفسه. لا تسمح قواعد توجيه الصوت التلقائية أيضًا للمستخدمين باختيار أجهزة متعددة من النوع نفسه لحالة استخدام معيّنة.

بدءًا من Android 12، تمت إزالة هذه القيود للسماح بحالات استخدام جديدة، مثل بث الصوت أو البث المتعدد إلى مجموعة من سماعات الرأس التي تعمل بتكنولوجيا BLE Audio أو اختيار عدة بطاقات صوت USB في الوقت نفسه. لا يتيح توجيه الصوت إلى أجهزة USB متعددة في الوقت نفسه.

بدءًا من Android 14، يتيح إطار عمل USB توجيه الصوت إلى أجهزة USB متعددة بشرط أن تكون أجهزة USB من أنواع مختلفة من الأجهزة الصوتية وأن يكون هناك دعم من النواة والمورّد لتوصيل أجهزة USB متعددة في الوقت نفسه.

توضّح هذه الصفحة كيفية تنفيذ إمكانية بث الصوت إلى أجهزة صوتية متعددة وكيفية التحقّق من صحة عملية تنفيذ هذه الميزة.

إتاحة بث الصوت إلى أجهزة صوتية متعددة

تتوفّر في Android 12 مجموعتان من واجهات برمجة التطبيقات التي تتيح هذه الميزة:

  • تتعامل واجهات برمجة تطبيقات النظام مع أجهزة متعددة مفضّلة لاستراتيجية معيّنة.
  • تُبلغ واجهة HIDL، التي ينفّذها المورّد كجزء من طبقة تجريد الأجهزة الصوتية (HAL)، عن إمكانات الجهاز.

تتناول الأقسام التالية كلًّا من واجهات برمجة التطبيقات هذه بمزيد من التفصيل.

التعامل مع أجهزة متعددة مفضّلة لاستراتيجية معيّنة

يوفّر مدير سياسة الصوت واجهات برمجة تطبيقات النظام لتحسين إمكانية بث الصوت إلى أجهزة صوتية متعددة في الوقت نفسه. تتيح واجهات برمجة تطبيقات النظام هذه ضبط أجهزة متعددة مفضّلة لاستراتيجية معيّنة والحصول عليها وإزالتها. قبل Android 12، كانت هذه الميزة متاحة لجهاز واحد فقط.

يقدّم مدير سياسة الصوت مفهوم أجهزة الوسائط النشطة لوصف الأجهزة التي من المرجّح اختيارها لتشغيل الوسائط. عند توصيل جهاز قابل للفصل، قد يكون من الضروري فتح مصادر بث الصوت في طبقة تجريد الأجهزة الصوتية (HAL) التي يمكن توجيهها إلى هذا الجهاز وفحصها بحثًا عن السمات المتوافقة.

يجب تحديد جهاز صوتي عند فتح مصدر بث. الجهاز الصوتي النشط هو الجهاز المستخدَم عند فتح مصادر البث في هذا السياق.

يمكن أن يتغيّر اختيار الجهاز الصوتي النشط استنادًا إلى الأجهزة المتصلة أو غير المتصلة. يستخدم مدير سياسة الصوت سلسلة القواعد التالية لاختيار الأجهزة الصوتية النشطة:

  1. إذا كانت جميع الأجهزة المفضّلة للوسائط متاحة، يتم اختيارها جميعًا كأجهزة نشطة.
  2. بخلاف ذلك، يتم اختيار آخر جهاز قابل للإزالة تم توصيله.
  3. إذا لم تكن هناك أجهزة قابلة للإزالة متصلة، يتم تطبيق قواعد سياسة الصوت التلقائية لاختيار أجهزة الإخراج لاختيار الأجهزة النشطة.

يجب أن يستوفي مصدر البث المعايير التالية لإعادة فتحه وتوجيهه إلى الأجهزة النشطة حتى يتم اختيار أفضل إعداد للتشغيل:

  • يجب أن يتيح مصدر البث استخدام الأجهزة النشطة.
  • يجب أن يتيح مصدر البث استخدام الملفات الصوتية الديناميكية.
  • يجب ألا يكون مصدر البث موجّهًا حاليًا إلى الأجهزة النشطة.

لتطبيق اختيار جهاز جديد، يغلق مدير سياسة الصوت مصدر البث ويعيد فتحه عند توصيل الجهاز إذا كان مصدر البث غير مستخدَم، أو يؤجّل ذلك إلى أن يتم وضع مصدر البث في وضع الاستعداد.

يوفّر مدير سياسة الصوت قائمة واجهات برمجة تطبيقات النظام التالية(كما هو محدّد في AudioManager.java):

  • setPreferredDeviceForStrategy

    يضبط الجهاز المفضّل لتوجيه الصوت لاستراتيجية معيّنة. يُرجى العِلم أنّ الجهاز قد لا يكون متاحًا في وقت ضبط الجهاز المفضّل، ولكن يتم استخدامه عند إتاحته.

  • removePreferredDeviceForStrategy

    يزيل الأجهزة الصوتية المفضّلة التي تم ضبطها سابقًا باستخدام setPreferredDeviceForStrategy أو setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

    يعرض الجهاز المفضّل لاستراتيجية صوتية تم ضبطها سابقًا باستخدام setPreferredDeviceForStrategy أو setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    يضبط الأجهزة المفضّلة لاستراتيجية معيّنة.

  • getPreferredDevicesForStrategy

    يعرض الأجهزة المفضّلة لاستراتيجية صوتية تم ضبطها سابقًا باستخدام setPreferredDeviceForStrategy أو setPreferredDevicesForStrategy.

  • OnPreferredDevicesForStrategyChangedListener

    يحدّد واجهة للإشعار بالتغييرات في الأجهزة الصوتية المفضّلة التي تم ضبطها لاستراتيجية صوتية معيّنة.

  • addOnPreferredDevicesForStrategyChangedListener

    يضيف مستمعًا لتلقّي إشعارات بالتغييرات في الجهاز الصوتي المفضّل للاستراتيجية.

  • removeOnPreferredDevicesForStrategyChangedListener

    يزيل مستمعًا تمت إضافته سابقًا لتلقّي إشعارات بالتغييرات في الجهاز الصوتي المفضّل للاستراتيجية.

الإبلاغ عن إمكانات الجهاز

كجزء من تنفيذ طبقة تجريد الأجهزة الصوتية (HAL)، ينفّذ المورّدون واجهات برمجة التطبيقات التي تتيح الإبلاغ عن إمكانات الجهاز. يوضّح هذا القسم أنواع البيانات والطرق المستخدَمة للإبلاغ عن إمكانات الجهاز، ويسرد بعض التغييرات التي تم إجراؤها في الإصدار 7 من طبقة تجريد الأجهزة الصوتية (HAL) في HIDL لإتاحة استخدام أجهزة متعددة.

أنواع البيانات

في الإصدار 7 من طبقة تجريد الأجهزة الصوتية (HAL) في HIDL، يتم الإبلاغ عن إمكانات الجهاز باستخدام البنيتَين AudioProfile وAudioTransport. تصف البنية AudioTransport إمكانات منفذ صوتي باستخدام AudioProfile للتنسيقات الصوتية المعروفة، أو باستخدام واصفات الأجهزة الأولية للتنسيقات التي لا تعرفها المنصة. تحتوي البنية AudioProfile على التنسيق الصوتي ومعدّلات البيانات في الملف الصوتي التي يتيحها الملف الصوتي وقائمة أقنعة القنوات، كما هو موضّح في كتلة الرموز البرمجية التالية من types.hal:

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

في الإصدار 7 من طبقة تجريد الأجهزة الصوتية (HAL) في HIDL، يتم تحديد نوع البيانات AudioPort باستخدام البنيتَين AudioTransport وAudioProfile لوصف إمكانات الجهاز.

طُرق طبقة تجريد الأجهزة الصوتية (HAL)

يستخدم مدير سياسة الصوت الطُرق التالية للاستعلام عن إمكانات الجهاز:

  • getParameters:طريقة عامة لاسترداد قيم المعلمات الخاصة بالمورّد، مثل التنسيقات الصوتية المتوافقة ومعدّلات البيانات في الملف الصوتي المقابلة لها.
  • getAudioPort:تعرض قائمة بالسمات المتوافقة (مثل معدّلات البيانات في الملف الصوتي والتنسيقات وأقنعة القنوات وأدوات التحكّم في مستوى الصوت) لمنفذ صوتي معيّن.

يوضّح الرمز البرمجي التالي من IDevice.hal واجهة الطريقة getAudioPort

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

التغييرات في واجهة برمجة التطبيقات القديمة

لإتاحة استخدام ملفات صوتية متعددة، يضيف الإصدار 3.2 من واجهة برمجة التطبيقات القديمة بنية جديدة تُسمّى audio_port_v7. يمكنك الاطّلاع على رمز المصدر لمزيد من التفاصيل.

بسبب إضافة audio_port_v7، يضيف الإصدار 3.2 من واجهة برمجة التطبيقات القديمة واجهة برمجة تطبيقات جديدة تُسمّى get_audio_port_v7 للاستعلام عن إمكانات الأجهزة باستخدام البنية audio_port_v7.

يوضّح الرمز البرمجي التالي من audio.h تعريف واجهة برمجة التطبيقات get_audio_port_v7

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

يجب ملء البيانات من واجهة برمجة التطبيقات القديمة get_audio_port بتنسيق AudioPort الجديد عندما يكون الإصدار الأقدم من واجهة برمجة التطبيقات القديمة أقل من 3.2 والإصدار 7 أو إصدار أحدث من طبقة تجريد الأجهزة الصوتية (HAL) في HIDL. في هذه الحالة، يُفترض أنّ جميع معدّلات البيانات في الملف الصوتي وأقنعة القنوات التي تم الإبلاغ عنها من get_audio_port متوافقة مع جميع التنسيقات المعروضة، ما يتيح إجراء عملية ربط مباشرة من قيم get_audio_port إلى البنية AudioPort الجديدة.

أمثلة على عمليات تنفيذ واجهات برمجة التطبيقات

يوضّح هذا القسم عدة مجموعات اختبارات تحتوي على طُرق تستخدم واجهات برمجة التطبيقات التي تم تناولها في الأقسام السابقة. يُرجى الرجوع إلى هذه الطُرق للاطّلاع على بعض الأمثلة حول كيفية تنفيذ واجهات برمجة التطبيقات هذه واستخدامها.

يتوفّر مثال على استخدام واجهات برمجة تطبيقات النظام setPreferredDevicesForStrategy وgetPreferredDevicesForStrategy وremovePreferredDeviceForStrategy وOnPreferredDevicesForStrategyChangedListener في الطريقة PreferredDeviceRoutingTest، التي تندرج ضمن مجموعة اختبارات خدمات Google (GTS).

للاطّلاع على مثال على البنية الجديدة قيد الاستخدام في AudioDeviceInfo، يُرجى الاطّلاع على الطريقة AudioManagerTest#testGetDevices التي تندرج ضمن مجموعة أدوات اختبار التوافق (CTS).

يتوفّر مثال على عملية تنفيذ get_audio_port_v7 في audio_hal.c ويوضّح كيفية الاستعلام عن إمكانات أجهزة متعددة.

التحقق من صحة البيانات

يقدّم هذا القسم معلومات عن التحقّق من صحة "مدير الصوت" في مجموعة أدوات اختبار التوافق (CTS ) ومجموعة اختبارات خدمات Google للأجهزة الجوّالة (GTS).

اختبارات مجموعة أدوات اختبار التوافق (CTS)

تندرج اختبارات مجموعة أدوات اختبار التوافق (CTS) ضمن android.media.cts.AudioManagerTest.

في ما يلي قائمة باختبارات "مدير الصوت" المتاحة:

  • AudioManagerTest#testGetDevices

    يتحقّق من الإمكانات الدقيقة للجهاز الصوتي. ويتحقّق أيضًا من أنّ الملفات الصوتية المعروضة في البنية AudioDeviceInfo تحتفظ بالمحتوى من تنسيق الصفيف المسطّح الأقدم، ولكنها بالتنسيق AudioProfile الجديد.

  • AudioManagerTest#testPreferredDevicesForStrategy و AudioManagerTest#testPreferredDeviceForCapturePreset

    يتحقّق من اكتمال اختبارات واجهات برمجة التطبيقات ذات الصلة بالأجهزة المفضّلة للاستراتيجية والإعداد المسبق للتسجيل بنجاح.

اختبارات مجموعة اختبارات خدمات Google (GTS)

تندرج اختبارات مجموعة اختبارات خدمات Google (GTS) ضمن com.google.android.gts.audioservice.AudioServiceHostTest.

للتحقّق مما إذا كانت واجهات برمجة التطبيقات للأجهزة المفضّلة للاستراتيجية والإعداد المسبق للتسجيل تعمل بشكلٍ صحيح، يُرجى إجراء الاختبارَين AudioServiceHostTest#testPreferredDeviceRouting وAudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset.