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

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

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

بدءًا من الإصدار 14 من نظام التشغيل Android، يتوافق إطار عمل 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 للصوت لتتوافق مع أجهزة متعددة.

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

في الصوت HIDL HAL V7، يتم الإبلاغ عن إمكانات الجهاز باستخدام 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:عرض قائمة السمات المتوافقة (مثل أخذ عيّنات) الأسعار والتنسيقات وأقنعة القنوات ووحدات التحكم في الكسب) لمنفذ صوت معين.

الرمز التالي من 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.