أجهزة صوت للسيارات

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

بما أنّ Android يدير تجربة الوسائط في المركبة، فإن مصادر الوسائط الخارجية مثل موالف الراديو، الذي ينبغي أن يتم تمثيله بواسطة التطبيقات التي يمكنها معالجة الصوت والأحداث الرئيسية والوسائط للمصدر.

يتضمّن Android 11 التغييرات التالية على الصوت المتعلق بالسيارات الدعم:

الأصوات والبث في Android

تعالج الأنظمة الصوتية للسيارات الأصوات وعمليات البث التالية:

مخطّط بياني لبنية تركّز على البث

الشكل 1. مخطّط بياني لبنية تركّز على البث

يدير Android الأصوات الصادرة من تطبيقات Android ويتحكّم في هذه التطبيقات وتوجيه أصواتهم إلى أجهزة الإخراج في HAL بناءً على نوع الصوت:

  • أحداث البث المنطقية، والمعروفة باسم مصادر المحتوى الصوتي الأساسي يتم وضع علامة سمات الصوت عليها.
  • البث المباشر، المعروف باسم "الأجهزة في الصوت الأساسي" لا تحتوي على معلومات سياقية بعد المزج.

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

يُعد تنفيذ HAL والخلاط الخارجي مسؤولين عن ضمان يتم سماع الأصوات الخارجية المهمة المتعلقة بالسلامة ومزجها في أجهزة Android ببثها وتوجيهها إلى مكبرات صوت مناسبة

أصوات Android

يمكن أن يكون للتطبيقات مشغِّل واحد أو أكثر يتفاعل مع نظام Android العادي. واجهات برمجة التطبيقات (مثل AudioManager للتحكم في التركيز أو MediaPlayer للبث) لإنتاج واحد أو أكثر من مصادر البيانات الصوتية المنطقية. هذه البيانات قد يكون عبارة عن قناة أحادية القناة أو صوت محيطي 7.1، ولكن يتم توجيهه ومعالجتها على أنها مصدر واحد. مصدر بيانات التطبيق مرتبط بـ AudioAttributes. تقدّم للنظام تلميحات حول كيفية التعبير عن الصوت.

يتم إرسال مجموعات البث المنطقية من خلال AudioService وتوجيهها إلى بث مباشر واحد ( واحد فقط) من مصادر الإخراج المادية المتاحة، وكل منها هو الناتج في أداة المزج داخل AudioFlinger. بعد مزج سمات الصوت بث محتوى مادي، فلن تكون متوفرة بعد الآن.

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

ساحات المشاركات الخارجية

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

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

أجهزة إخراج

على مستوى HAL للصوت، يجب أن يكون نوع الجهاز AUDIO_DEVICE_OUT_BUS. جهاز إخراج عامًا للاستخدام في الأنظمة الصوتية للمركبات الحافلة المنافذ التي يمكن الوصول إليها من خلال الجهاز (حيث يكون كل منفذ نقطة نهاية الفعلي) ومن المتوقع أن يكون نوع جهاز الإخراج الوحيد المتوافق في مركبة.

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

يتم تعيين السياقات الصوتية لأجهزة الإخراج من خلال car_audio_configuration.xml

إدخال الميكروفون

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

مصدر VOICE_RECOGNITION ويتوقع (مساعد Google تحديدًا) بث ميكروفون استيريو تأثير إلغاء صدى الصوت (إذا كان متاحًا) ولكن لم يتم تطبيقه عليه من المتوقّع أن يتولّى "مساعد Google" إجراء عملية إنشاء الشعاع.

إدخال ميكروفون متعدد القنوات

لالتقاط صوت من جهاز عبر أكثر من قناتين (استيريو)، استخدِم قناع فهرس القناة بدلاً من قناع الفهرس الموضعي (مثل CHANNEL_IN_LEFT). مثال:

final AudioFormat audioFormat = new AudioFormat.Builder()
    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    .setSampleRate(44100)
    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
    .build();
final AudioRecord audioRecord = new AudioRecord.Builder()
    .setAudioFormat(audioFormat)
    .build();
audioRecord.setPreferredDevice(someAudioDeviceInfo);

عند اختيار كل من setChannelMask وsetChannelIndexMask يتم تعيينها، لا يستخدم AudioRecord سوى القيمة التي تحددها setChannelMask (قناتان كحد أقصى).

التقاط متزامن

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

التطبيقات المصمّمة للعمل على أجهزة AUDIO_DEVICE_IN_BUS أو الأجهزة المزوّدة يجب الاعتماد بشكل صريح على أجهزة AUDIO_DEVICE_IN_FM_TUNER الثانوية. تحديد هذه الأجهزة واستخدام AudioRecord.setPreferredDevice() لتجاوز منطق اختيار المصدر التلقائي في Android

استخدامات الصوت

إنّ نظام التشغيل Android Automotive (AAOS) يستخدم AudioAttributes.AttributeUsages بشكل أساسي. من أجل التوجيه وتعديل مستوى الصوت وإدارة التركيز. الاستخدامات تمثيلاً لـ "لماذا" تشغيل البث وبالتالي، لا شك في أنّ جميع أحداث البث وطلبات تركيز الصوت عند تحديد استخدام لتشغيل الصوت. فعندما تحديدًا عند إنشاء كائن AudioAttributes، فسيتم استخدام تم ضبط القيمة التلقائية على USAGE_UNKNOWN. يتم التعامل مع هذه الطريقة حاليًا بالطريقة نفسها مثل USAGE_MEDIA، يجب عدم الاعتماد على هذا السلوك في الوسائط التشغيل.

استخدامات النظام

في Android 11، تم تقديم استخدامات النظام. تؤدي هذه الاستخدامات إلى بشكل مشابه للاستخدامات القائمة سابقًا، باستثناء أنّها تتطلّب واجهات برمجة تطبيقات للنظام لاستخدامه بالإضافة إلى android.permission.MODIFY_AUDIO_ROUTING. استخدامات النظام هي:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

لإنشاء AudioAttributes مع استخدام النظام، استخدِم AudioAttributes.Builder#setSystemUsage بدلاً من setUsage. استدعاء هذه الطريقة باستخدام غير تابع للنظام سيؤدي إلى رمي IllegalArgumentException. أيضًا، إذا تم تعيين كلٍ من استخدام النظام والاستخدام على أداة إنشاء، فستعرض IllegalArgumentException عند البناء.

للتحقّق من الاستخدام المرتبط بوحدة AudioAttributes على سبيل المثال، اتصال AudioAttributes#getSystemUsage. يعرض هذا الإجراء الاستخدام أو استخدام النظام المرتبط.

السياقات الصوتية

لتبسيط عملية ضبط صوت AAOS، تم تجميع الاستخدامات المماثلة. إلى CarAudioContext. تُستخدم السياقات الصوتية هذه طوال CarAudioService لتحديد التوجيه ومجموعات مستوى الصوت والتركيز على الصوت المشروع.

في ما يلي سياقات الصوت في Android 11:

سياق صوت السيارة استخدامات السمات المرتبطة
MUSIC UNKNOWN, GAME, MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT, ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION, NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

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

صوت متعدّد المناطق

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

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

ويتم تحديد المناطق كجزء من car_audio_configuration.xml. يقرأ CarAudioService بعد ذلك الإعدادات ويساعد AudioService. توجيه البث الصوتي استنادًا إلى المنطقة المرتبطة به. ما زالت كل منطقة تحدد للتوجيه على أساس السياقات ومعرّف التطبيقات. عندما يكون اللاعب تم الإنشاء، يحدّد CarAudioService المنطقة التي يتم إنشاء المشغّل فيها المرتبطة به، ثم حسب الاستخدام، أي جهاز AudioFlinger يجب توجيه الصوت إليه.

ويتم أيضًا الحفاظ على التركيز بشكل مستقل لكل منطقة صوتية. وهذا يمكّن تطبيقات في مناطق مختلفة لإنتاج صوت بشكل مستقل بدون مع بعضها البعض مع جعل التطبيقات لا تزال تحترم التغييرات في التركيز داخل منطقتهم. CarZonesAudioFocus في نطاق تقع على عاتق CarAudioService مسؤولية إدارة التركيز لكل المنطقة.

ضبط إعدادات الصوت المتعدّد المناطق

الشكل 2. ضبط إعدادات الصوت المتعدّد المناطق

طبقة تجريد الأجهزة (HAL) للصوت

تعتمد عمليات تنفيذ الإعدادات الصوتية في السيارات على طبقة تجريد الأجهزة (HAL) للصوت العادي في Android والتي تتضمّن ما يلي:

  • IDevice.hal تنشئ مصادر الإدخال والمخرجات تتعامل مع مستوى الصوت الرئيسي وكتم الصوت، وتستخدم:
    • createAudioPatch لإنشاء رموز تصحيح خارجية وخارجية بين الأجهزة
    • IDevice.setAudioPortConfig() لتوفير مستوى الصوت لكل بث فعلي.
  • IStream.hal وجنبًا إلى جنب مع متغيرات الإدخال والمخرجات، يدير بث العينات الصوتية من الأجهزة وإليها.

أنواع أجهزة السيارات

إنّ أنواع الأجهزة التالية ذات صلة بالأنظمة الأساسية للسيارات.

نوع الجهاز الوصف
AUDIO_DEVICE_OUT_BUS المخرجات الأساسية من Android (هذه هي الطريقة التي يستخدم بها كل المحتوى الصوتي في Android تسليمه إلى المركبة). يُستخدم كعنوان للتفريق بين أحداث البث لكل سياق.
AUDIO_DEVICE_OUT_TELEPHONY_TX يتم استخدامه للصوت الموجَّه إلى لاسلكي خلوي لإرساله.
AUDIO_DEVICE_IN_BUS تُستخدَم للإدخالات غير المصنَّفة.
AUDIO_DEVICE_IN_FM_TUNER يُستخدم فقط لإدخال البث اللاسلكي.
AUDIO_DEVICE_IN_TV_TUNER يتم استخدامه لجهاز تلفزيون إن كان متوفرًا.
AUDIO_DEVICE_IN_LINE يُستخدم لمقبس إدخال AUX.
AUDIO_DEVICE_IN_BLUETOOTH_A2DP الموسيقى المستلَمة عبر البلوتوث.
AUDIO_DEVICE_IN_TELEPHONY_RX يُستخدم للصوت المستلَم من الراديو الخلوي المرتبط بهاتف الاتصال.

جارٍ ضبط الأجهزة السماعية

يجب تحديد الأجهزة السماعية المرئية لنظام التشغيل Android في /audio_policy_configuration.xml، والذي يتضمّن المكوّنات التالية:

  • اسم الوحدة. يتوافق مع "الأساسية" (تُستخدم في حالات استخدام السيارات) "A2DP" و"remote_submix" و"USB". اسم الوحدة والصوت المرتبط بها يجب تجميع برنامج التشغيل في audio.primary.$(variant).so.
  • منافذ الجهاز. يحتوي على قائمة بواصفات الأجهزة لجميع عناصر الإدخال والمخرجات الأجهزة (بما في ذلك الأجهزة المتصلة بشكل دائم والأجهزة القابلة للإزالة) التي يمكن يتم الوصول إليها من هذه الوحدة.
    • لكل جهاز إخراج، يمكنك تحديد عنصر تحكم يتكون من القيم الدنيا/الأقصى/الافتراضية/الخطوة بالملليبل (1 ميليبل = 1/100 ديسيبل = 1/1000 بيل).
    • يمكن استخدام سمة العنوان على مثيل devicePort للعثور على جهازك، حتى إذا كانت هناك أجهزة متعددة من نوع الجهاز نفسه مثل AUDIO_DEVICE_OUT_BUS
  • MixPorts. يحتوي على قائمة بجميع مصادر بيانات الإخراج والإدخال التي تم الكشف عنها من خلال HAL للصوت. يمكن اعتبار كل مثيل من مثيلات المزيج كبث مباشر Android AudioService.
  • والمسارات. تحدد قائمة بالاتصالات المحتملة بين الإدخال والإخراج الأجهزة أو بين جهاز البث والجهاز

يحدد المثال التالي جهاز إخراج Built0_phone_out والذي تكون فيه جميع ويتم مزج عمليات البث الصوتي في Android بواسطة Mier_bus0_phone_out. ويأخذ المسار بث إخراج "mixer_bus0_phone_out" إلى الجهاز bus0_phone_out

<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_phone_out</item>
<defaultOutputDevice>bus0_phone_out</defaultOutputDevice>
            <mixPorts>
                <mixPort name="mixport_bus0_phone_out"
                         role="source"
                         flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_phone_out"
                            role="sink"
                            type="AUDIO_DEVICE_OUT_BUS"
                            address="BUS00_PHONE">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400"
                                maxValueMB="4000"
                                defaultValueMB="0"
                                stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_phone_out"
                       sources="mixport_bus0_phone_out"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>