الجمع بين توجيه جهاز الصوت

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

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

بدءًا من Android 14، يدعم إطار عمل USB التوجيه إلى أجهزة USB متعددة بشرط أن تكون أجهزة USB من أنواع مختلفة من أجهزة الصوت، ويوجد دعم kernel والبائعين لتوصيل أجهزة 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، يقوم البائعون بتنفيذ واجهات برمجة التطبيقات التي تدعم إمكانات جهاز إعداد التقارير. يشرح هذا القسم أنواع البيانات والأساليب المستخدمة للإبلاغ عن إمكانيات الجهاز ويسرد بعض التغييرات التي تم إجراؤها في الصوت HIDL HAL V7 لدعم أجهزة متعددة.

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

في 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 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 الجديدة.

أمثلة على تطبيقات API

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

مثال على استخدام واجهات برمجة التطبيقات الخاصة بنظام setPreferredDevicesForStrategy و getPreferredDevicesForStrategy و removePreferredDeviceForStrategy و OnPreferredDevicesForStrategyChangedListener في أسلوب PreferredDeviceRoutingTest ، الموجود في GTS.

لرؤية مثال على البنية الجديدة في AudioDeviceInfo قيد الاستخدام، راجع طريقة AudioManagerTest#testGetDevices الموجودة في CTS.

يوجد مثال لتطبيق get_audio_port_v7 في audio_hal.c ويوضح كيفية الاستعلام عن القدرات لأجهزة متعددة.

تصديق

يقدم هذا القسم معلومات حول التحقق من صحة CTS وGTS (مجموعة اختبار خدمات الهاتف المحمول من Google) لمدير الصوت.

اختبارات سي تي إس

توجد اختبارات CTS في android.media.cts.AudioManagerTest .

فيما يلي قائمة باختبارات Audio Manager المتاحة:

  • AudioManagerTest#testGetDevices

    يتحقق من القدرات الدقيقة لجهاز الصوت. كما أنه يتحقق من أن ملفات تعريف الصوت التي تم إرجاعها في بنية AudioDeviceInfo تحافظ على المحتوى من تنسيق الصفيف المسطح الأقدم، ولكنها موجودة بتنسيق AudioProfile الجديد.

  • AudioManagerTest#testPreferredDevicesForStrategy و AudioManagerTest#testPreferredDeviceForCapturePreset

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

اختبارات جي تي اس

توجد اختبارات GTS في com.google.android.gts.audioservice.AudioServiceHostTest .

للتحقق من صحة ما إذا كانت واجهات برمجة التطبيقات للأجهزة المفضلة للاستراتيجية والتقاط الإعداد المسبق تعمل بشكل صحيح، قم بتشغيل اختبارات AudioServiceHostTest#testPreferredDeviceRouting و AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset .