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

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

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

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

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

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

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

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

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

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

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

يقدّم "مدير سياسة الصوت" مفهوم أجهزة الوسائط النشطة لتحديد الأجهزة التي يُرجّح اختيارها لتشغيل الوسائط. عند توصيله بجهاز قابل للفصل، قد يكون من الضروري فتح مصادر إخراج 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;
};

في الإصدار 7 من حزمة HIDL HAL للصوت، يتم تعريف نوع البيانات 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:

/**
 * 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.