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