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

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

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

يتضمّن الإصدار 11 من Android التغييرات التالية في ميزات دعم الوسائط المخصّصة للسيارات:

مصادر بيانات وأصوات Android

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

مخطّط بياني للبنية المستندة إلى أحداث البث

الشكل 1: مخطّط بياني للبنية المستندة إلى أحداث البث

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

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

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

يتولّى تنفيذ HAL وجهاز الخلط الخارجي ضمانسماع الأصوات الخارجية المهمة للسلامة، بالإضافة إلى خلط البث المباشر الذي يوفّره Android وتوجيهه إلى السماعات المناسبة.

أصوات Android

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

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

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

مصادر البيانات الخارجية

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

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

أجهزة الإخراج

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

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

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

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

عند تسجيل الصوت، يتلقّى Audio 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.

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

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

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

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

CarAudioContext Associated AttributeUsages
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 ضبط الصوت في عدة مناطق

Audio HAL

تعتمد عمليات تنفيذ الصوت في السيارات على واجهة برمجة التطبيقات العادية لنظام Android Audio HAL، التي تتضمّن ما يلي:

  • 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.
  • devicePorts. يحتوي على قائمة بأوصاف الأجهزة لجميع أجهزة الإدخال والإخراج (بما في ذلك الأجهزة المُثبَّتة بشكل دائم والأجهزة القابلة للإزالة) التي يمكن الوصول إليها من هذه الوحدة.
    • بالنسبة إلى كل جهاز إخراج، يمكنك تحديد وحدة التحكّم في الكسب التي تتألف من قيم الحد الأدنى/الحد الأقصى/التلقائي/الخطوة بمللي بيل (1 مللي بيل = 1/100 ديسيبل = 1/1000 بيل).
    • يمكن استخدام سمة العنوان في مثيل devicePort للعثور على الجهاز، حتى إذا كانت هناك أجهزة متعددة بنوع الجهاز نفسه مثل AUDIO_DEVICE_OUT_BUS.
  • mixPorts يحتوي على قائمة بجميع مصادر ومصادر الإخراج التي يعرضها ملف تعريف برمجة التطبيقات HAL للصوت. يمكن اعتبار كل مثيل من mixPort بثًا ماديًا للخدمة Android AudioService.
  • المسارات تُحدِّد قائمة بالاتصالات المحتملة بين أجهزتَي الإدخال والإخراج أو بين البث والجهاز.

يحدِّد المثال التالي جهاز إخراج bus0_phone_out يتم فيه دمج جميع مجرى ملفّات صوت Android من خلال mixer_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>