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

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

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

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

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

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

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

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

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

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

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

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

يجب تحديد جهاز صوت عند فتح بث إخراج. جهاز الوسائط النشط هو الجهاز المستخدَم عند فتح مصادر البيانات في هذا السياق.

يمكن أن يتغيّر اختيار جهاز الوسائط النشط حسب الأجهزة المتصلة أو غير المتصلة. يستخدم "مدير سياسات الصوت" سلسلة القواعد التالية لاختيار أجهزة الوسائط النشطة:

  1. إذا كانت جميع الأجهزة المفضّلة للوسائط متاحة، سيتم اختيارها كلها كأجهزة نشطة.
  2. وفي حال عدم توفّر أي جهاز، سيتم اختيار آخر جهاز قابل للإزالة تم توصيله.
  3. في حال عدم توصيل أي أجهزة قابلة للإزالة، يتم تطبيق قواعد سياسة الصوت التلقائية لاختيار أجهزة الإخراج من أجل اختيار الأجهزة النشطة.

يجب أن يستوفي بث الإخراج المعايير التالية لإعادة فتحه وتوجيهه إلى الأجهزة النشطة حتى يتم اختيار أفضل إعداد للتشغيل:

  • يجب أن تتوافق ساحة المشاركة مع الأجهزة النشطة.
  • يجب أن يتيح بث الإخراج استخدام الملفات الشخصية الديناميكية.
  • يجب ألا يتم توجيه مصدر البيانات حاليًا إلى أجهزة نشطة.

لتطبيق عملية اختيار جهاز جديد، يغلق Audio Policy Manager ويعيد فتح بث الإخراج عند توصيل الجهاز إذا كان بث الإخراج غير نشط، أو يؤجّل العملية إلى حين وضع بث الإخراج في وضع الاستعداد.

تقدّم "أداة إدارة سياسات الصوت" قائمة واجهات برمجة التطبيقات التالية الخاصة بالنظام(كما هو محدّد في AudioManager.java):

  • setPreferredDeviceForStrategy

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

  • removePreferredDeviceForStrategy

    يزيل هذا الخيار الأجهزة الصوتية المفضّلة التي تم ضبطها مسبقًا باستخدام setPreferredDeviceForStrategy أو setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

    تعرض هذه السمة الجهاز المفضّل لاستراتيجية صوتية تم ضبطها سابقًا باستخدام setPreferredDeviceForStrategy أو setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    تضبط هذه السمة الأجهزة المفضّلة لاستراتيجية معيّنة.

  • getPreferredDevicesForStrategy

    تعرض هذه السمة الأجهزة المفضّلة لاستراتيجية صوتية تم ضبطها سابقًا باستخدام setPreferredDeviceForStrategy أو setPreferredDevicesForStrategy.

  • OnPreferredDevicesForStrategyChangedListener

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

  • addOnPreferredDevicesForStrategyChangedListener

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

  • removeOnPreferredDevicesForStrategyChangedListener

    يزيل هذا الإجراء مستمعًا تمت إضافته سابقًا لتلقّي إشعارات بالتغييرات التي تطرأ على جهاز الصوت المفضّل حسب الاستراتيجية.

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

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

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

في الإصدار 7 من طبقة تجريد الأجهزة (HAL) لواجهة HIDL الصوتية، يتم تسجيل إمكانيات الجهاز باستخدام البنيتين 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 من طبقة تجريد الأجهزة (HAL) لواجهة HIDL الصوتية، يتم تحديد نوع البيانات AudioPort باستخدام البنيتين AudioTransport وAudioProfile لوصف إمكانات الجهاز.

طُرق Audio HAL

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

  • 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) وإثبات صحة مجموعة اختبارات خدمات Google للأجهزة الجوّالة (GTS) في "أداة إدارة الصوت".

اختبارات مجموعة أدوات اختبار التوافق (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.