صوت السيارات

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

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

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

أصوات وتدفقات Android

تتعامل أنظمة الصوت الخاصة بالسيارات مع الأصوات والتدفقات التالية:

مخطط معماري مرتكز على الدفق

الشكل 1. مخطط معماري مرتكز على الدفق

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

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

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

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

أصوات أندرويد

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

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

يتم بعد ذلك تسليم كل دفق فعلي إلى طبقة تجريد الصوت (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) دفق ميكروفون استريو له تأثير إلغاء الصدى (إذا كان متاحًا) ولكن لا يتم تطبيق أي معالجة أخرى عليه. ومن المتوقع أن يتم تنفيذ Beamforming بواسطة المساعد.

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

لالتقاط الصوت من جهاز يحتوي على أكثر من قناتين (ستيريو)، استخدم قناع فهرس القناة بدلاً من قناع الفهرس الموضعي (مثل 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 ، إلا أنه لا ينبغي الاعتماد على هذا السلوك لتشغيل الوسائط.

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

في 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 هي:

CarAudioContext استخدامات السمات المرتبطة
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. تكوين الصوت متعدد المناطق

الصوت هال

تعتمد تطبيقات الصوت الخاصة بالسيارات على نظام 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 .
  • منافذ الجهاز. يحتوي على قائمة بواصفات الأجهزة لجميع أجهزة الإدخال والإخراج (بما في ذلك الأجهزة المتصلة بشكل دائم والأجهزة القابلة للإزالة) التي يمكن الوصول إليها من هذه الوحدة.
    • بالنسبة لكل جهاز إخراج، يمكنك تحديد التحكم في الكسب الذي يتكون من قيم الحد الأدنى/الحد الأقصى/الافتراضي/الخطوة بالملليبل (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>