توفّر ميزة توجيه أجهزة الصوت المجمّعة إمكانية بث الصوت إلى أجهزة صوت متعددة في الوقت نفسه. باستخدام هذه الميزة، يمكن للتطبيقات المميّزة اختيار أجهزة مفضّلة متعددة لاستراتيجية معيّنة من خلال واجهات برمجة تطبيقات النظام. يمكن للتطبيقات اكتشاف إمكانات الأجهزة الصوتية بدقة أكبر باستخدام واجهات برمجة التطبيقات العامة التي تقدّمها هذه الميزة. بالنسبة إلى الإصدارات 11 من Android والإصدارات الأقدم، يتيح تنفيذ إطار عمل الصوت إمكانية محدودة لربط أجهزة صوت متعددة من النوع نفسه (مثل سماعتَي رأس A2DP عبر البلوتوث) في الوقت نفسه. ولا تسمح قواعد التوجيه التلقائي للتوجيه الصوتي أيضًا للمستخدمين باختيار عدّة أجهزة من النوع نفسه لحالة استخدام معيّنة.
بدءًا من Android 12، تمت إزالة هذه القيود للسماح بحالات استخدام جديدة، مثل البث الصوتي أو البث المتعدد لمجموعة من سماعات الرأس الصوتية التي تتضمّن بلوتوث منخفض الطاقة (BLE) أو اختيار عدّة بطاقات صوت USB في الوقت نفسه. التوجيه إلى أجهزة USB متعددة في وقت واحد غير معتمد.
بدءًا من Android 14، يتيح إطار عمل USB توجيه البيانات إلى أجهزة USB متعددة شرط أن تكون أجهزة USB من أنواع مختلفة من أجهزة الصوت، وأن يكون هناك توافق مع نظام التشغيل والمورّد لتوصيل أجهزة USB متعددة في الوقت نفسه.
تتناول هذه الصفحة كيفية توفير إمكانية بث الصوت على أجهزة صوت متعددة، وكيفية التحقّق من صحة تنفيذ هذه الميزة.
إتاحة بث الصوت إلى أجهزة صوتية متعددة
تتوفّر مجموعتَان من واجهات برمجة التطبيقات في Android 12 تتيحان استخدام هذه الميزة:
- تتعامل واجهات برمجة تطبيقات النظام مع أجهزة مفضّلة متعددة لاستراتيجية معيّنة.
- واجهة HIDL التي ينفّذها المورّد كجزء من HAL للصوت، تُبلغ عن إمكانات الجهاز.
تتناول الأقسام التالية كل واجهة برمجة تطبيقات من هذه الواجهات بمزيد من التفصيل.
التعامل مع أجهزة مفضّلة متعددة لاستراتيجية معيّنة
يوفّر "مدير سياسة الصوت" واجهات برمجة تطبيقات للنظام لدعم بث الصوت بشكل أفضل إلى أجهزة صوت متعددة في الوقت نفسه. تتيح واجهات برمجة التطبيقات للنظام هذه إمكانية ضبط الأجهزة المفضّلة المتعدّدة وإزالتها لاستراتيجية معيّنة. وحتى إصدار Android 12، كانت هذه الميزة متاحة لجهاز واحد فقط.
يقدّم "مدير سياسة الصوت" مفهوم أجهزة الوسائط النشطة لتحديد الأجهزة التي يُرجّح اختيارها لتشغيل الوسائط. عند توصيله بجهاز قابل للفصل، قد يكون من الضروري فتح مصادر إخراج HAL الصوتية التي يمكن توجيهها إلى هذا الجهاز وفحصها بحثًا عن السمات المتوافقة.
يجب تحديد جهاز صوت عند فتح بث إخراج. جهاز الوسائط النشط هو الجهاز المستخدَم عند فتح مصادر الإخراج في هذا السياق.
يمكن أن يتغيّر اختيار جهاز الوسائط النشط حسب الأجهزة الفعلية المتصلة أو غير المتصلة. يستخدم "مدير سياسة الصوت" السلسلة التالية من القواعد لاختيار أجهزة الوسائط النشطة:
- إذا كانت جميع الأجهزة المفضّلة للوسائط متاحة، يتم اختيارها كأجهزة نشطة.
- وبخلاف ذلك، يتم اختيار آخر جهاز متصل قابل للإزالة.
- في حال عدم توصيل أي أجهزة قابلة للإزالة، يتم تطبيق قواعد سياسة الصوت التلقائية لاختيار أجهزة الإخراج من أجل اختيار الأجهزة النشطة.
يجب أن يستوفي بث الإخراج المعايير التالية ليتم إعادة فتحه وتوجيهه إلى الأجهزة النشطة حتى يتم اختيار أفضل إعداد لتشغيل المحتوى:
- يجب أن يكون بث الإخراج متوافقًا مع الأجهزة النشطة.
- يجب أن تتوافق مصادر البيانات الناتجة مع الملفات الشخصية الديناميكية.
- يجب ألا يتم توجيه بث الناتج حاليًا إلى أجهزة نشطة.
لتطبيق اختيار جهاز جديد، يغلق "مدير سياسة الصوت" بث الإخراج ويعيد فتحه عند اتصال الجهاز إذا كان بث الإخراج في وضع السكون، أو يُؤجل ذلك إلى وقت وضع بث الإخراج في وضع الاستعداد.
يوفّر "مدير سياسة الصوت" القائمة التالية لواجهات برمجة تطبيقات النظام(على النحو المحدّد في
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
.