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

تتيح ميزة توجيه الأجهزة الصوتية المدمجة بث الصوت إلى أجهزة صوتية متعددة في الوقت نفسه. وباستخدام هذه الميزة، يمكن للتطبيقات الحاصلة على الأذونات اختيار عدّة أجهزة مفضّلة لوضع استراتيجية معيّنة عن طريق واجهات برمجة تطبيقات النظام. يمكن للتطبيقات اكتشاف إمكانات الأجهزة الصوتية بشكل أكبر وذلك تحديدًا من خلال استخدام واجهات برمجة التطبيقات العامة التي توفرها هذه الميزة. في إصدارات Android 11 والإصدارات الأقدم، تمت إضافة إطار عمل صوتي توافق محدود مع عدّة أجهزة صوتية من النوع نفسه (مثلاً، 2 سماعات رأس بلوتوث 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

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

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

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

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

في الصوت 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 لوصف بنية الجهاز والإمكانات.

طرق 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 للأجهزة الجوّالة) للتحقق من مدير الصوت.

اختبارات 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.