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

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

بدءًا من Android 12، تمت إزالة هذه القيود للسماح بحالات استخدام جديدة، مثل البث الصوتي أو البث المتعدد لمجموعة من سماعات الرأس الصوتية التي تتضمّن بلوتوث منخفض الطاقة (BLE) أو اختيار عدّة بطاقات صوت 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

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

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

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

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

في الإصدار 7 من حزمة HIDL HAL للصوت، يتم تسجيل إمكانات الجهاز باستخدام بنية 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;
};

في الصوت HIDL HAL V7، يتم تحديد نوع بيانات AudioPort من خلال بنيتَي AudioTransport وAudioProfile لوصف إمكانات الجهاز.

طرق Audio HAL

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

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

يعرض الرمز البرمجي التالي من 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 API:

/**
 * 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 ويكون إصدار HIDL HAL هو 7 أو أعلى. في هذه الحالة، يُفترض أنّ جميع معدّلات أخذ العينات وقناة التصنيف من get_audio_port متوافقة مع جميع التنسيقات التي يتم عرضها، ما يتيح إجراء ربط مباشر من قيم get_audio_port إلى بنية AudioPort الجديدة.

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

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

يمكنك العثور على مثال على استخدام واجهات برمجة تطبيقات النظام setPreferredDevicesForStrategy getPreferredDevicesForStrategy وremovePreferredDeviceForStrategy OnPreferredDevicesForStrategyChangedListener في الأسلوب PreferredDeviceRoutingTest، والذي يمكن العثور عليه في GTS.

للاطّلاع على مثال على البنية الجديدة في AudioDeviceInfo المستخدَمة، اطّلِع على AudioManagerTest#testGetDevices التي تقع في CTS.

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

التحقُّق

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

اختبارات CTS

يمكن العثور على اختبارات CTS في android.media.cts.AudioManagerTest.

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

  • AudioManagerTest#testGetDevices

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

  • AudioManagerTest#testPreferredDevicesForStrategy و AudioManagerTest#testPreferredDeviceForCapturePreset

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

اختبارات GTS

تقع اختبارات GTS في com.google.android.gts.audioservice.AudioServiceHostTest.

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