سیستمعامل Android Automotive (AAOS) بر روی پشته صوتی Android ساخته شده است تا از موارد استفاده برای عملکرد به عنوان سیستم اطلاعات سرگرمی در خودرو پشتیبانی کند. AAOS مسئول صداهای سرگرمی اطلاعاتی (یعنی رسانه، ناوبری و ارتباطات) است، اما مستقیماً مسئول زنگ ها و هشدارهایی نیست که الزامات دقیق در دسترس بودن و زمان بندی دارند. در حالی که AAOS سیگنالها و مکانیسمهایی را برای کمک به خودرو در مدیریت صدا ارائه میکند، در پایان این به خودرو بستگی دارد که تماس بگیرد که چه صداهایی باید برای راننده و سرنشینان پخش شود، و اطمینان حاصل میکند که صداهای مهم ایمنی و صداهای نظارتی به درستی شنیده میشوند. وقفه
همانطور که Android تجربه رسانه ای خودرو را مدیریت می کند، منابع رسانه خارجی مانند تیونر رادیویی باید توسط برنامه هایی نشان داده شوند که می توانند فوکوس صوتی و رویدادهای کلید رسانه را برای منبع کنترل کنند.
اندروید 11 شامل تغییرات زیر در پشتیبانی صوتی مربوط به خودرو است:
- انتخاب منطقه صوتی خودکار بر اساس شناسه کاربری مرتبط
- استفاده از سیستم جدید برای پشتیبانی از صداهای خاص خودرو
- پشتیبانی از فوکوس صوتی HAL
- فوکوس صوتی با تأخیر برای جریانهای غیر گذرا
- تنظیمات کاربر برای کنترل تعامل بین پیمایش و تماسها
صداها و استریم های اندروید
سیستمهای صوتی خودرو صداها و جریانهای زیر را کنترل میکنند:
شکل 1. نمودار معماری جریان محور
Android صداهای دریافتی از برنامههای Android را مدیریت میکند، آن برنامهها را کنترل میکند و صداهای آنها را بر اساس نوع صدا به دستگاههای خروجی در HAL هدایت میکند:
- جریانهای منطقی ، که به عنوان منابع در نامگذاری صوتی اصلی شناخته میشوند، با ویژگیهای صوتی برچسبگذاری شدهاند.
- جریانهای فیزیکی ، که به عنوان دستگاهها در نامگذاری صوتی اصلی شناخته میشوند، پس از مخلوط کردن، هیچ اطلاعات زمینهای ندارند.
برای اطمینان، صداهای خارجی (از منابع مستقل مانند زنگ هشدار کمربند ایمنی) خارج از Android، زیر HAL یا حتی در سخت افزار جداگانه مدیریت می شوند. پیادهکنندههای سیستم باید میکسری ارائه کنند که یک یا چند جریان ورودی صدا را از اندروید بپذیرد و سپس آن جریانها را به روشی مناسب با منابع صوتی خارجی مورد نیاز خودرو ترکیب کند.
اجرای HAL و میکسر خارجی وظیفه اطمینان از شنیده شدن صداهای خارجی حیاتی از نظر ایمنی و میکس کردن در استریم های ارائه شده توسط Android و مسیریابی آنها به بلندگوهای مناسب را بر عهده دارند.
صداهای اندروید
برنامهها ممکن است یک یا چند پخش کننده داشته باشند که از طریق APIهای استاندارد Android (مثلاً AudioManager برای کنترل فوکوس یا MediaPlayer برای پخش جریانی) تعامل داشته باشند تا یک یا چند جریان منطقی از دادههای صوتی را منتشر کنند. این دادهها میتوانند تک کانالی تک کانالی یا فراگیر 7.1 باشند، اما بهعنوان یک منبع واحد هدایت میشوند و در نظر گرفته میشوند. جریان برنامه با AudioAttributes مرتبط است که به سیستم نکاتی درباره نحوه بیان صدا می دهد.
جریانهای منطقی از طریق AudioService ارسال میشوند و به یکی (و تنها یکی) از جریانهای خروجی فیزیکی موجود، که هر کدام خروجی یک میکسر در AudioFlinger هستند، هدایت میشوند. پس از اینکه ویژگیهای صوتی در یک جریان فیزیکی ترکیب شدند، دیگر در دسترس نیستند.
سپس هر جریان فیزیکی برای نمایش بر روی سخت افزار به Audio HAL تحویل داده می شود. در برنامههای خودرو، سختافزار رندر میتواند کدکهای محلی (مشابه دستگاههای تلفن همراه) یا یک پردازنده از راه دور در سراسر شبکه فیزیکی خودرو باشد. در هر صورت، این وظیفه اجرای Audio HAL است که دادههای نمونه واقعی را تحویل داده و باعث شنیدن آن شود.
جریان های خارجی
جریانهای صوتی که نباید از طریق Android (به دلایل تأیید یا زمانبندی) هدایت شوند، ممکن است مستقیماً به میکسر خارجی ارسال شوند. از اندروید 11، HAL اکنون میتواند برای اطلاعرسانی به اندروید فوکوس را برای این صداهای خارجی درخواست کند تا بتواند اقدامات مناسبی مانند توقف رسانه یا جلوگیری از تمرکز دیگران را انجام دهد.
اگر جریانهای خارجی منابع رسانهای هستند که باید با محیط صوتی که Android تولید میکند تعامل داشته باشند (به عنوان مثال، پخش MP3 را هنگامی که یک تیونر خارجی روشن است متوقف کنید)، آن جریانهای خارجی باید توسط یک برنامه Android نشان داده شوند. چنین برنامهای به جای HAL، فوکوس صوتی را از طرف منبع رسانه درخواست میکند، و به اعلانهای فوکوس با راهاندازی/توقف منبع خارجی در صورت لزوم برای تناسب با خطمشی فوکوس Android پاسخ میدهد. این برنامه همچنین مسئول رسیدگی به رویدادهای کلیدی رسانه مانند پخش/مکث است. یکی از مکانیسم های پیشنهادی برای کنترل چنین دستگاه های خارجی HwAudioSource است.
دستگاه های خروجی
در سطح صوتی HAL، نوع دستگاه AUDIO_DEVICE_OUT_BUS
یک دستگاه خروجی عمومی را برای استفاده در سیستم های صوتی خودرو ارائه می دهد. دستگاه اتوبوس از پورت های آدرس پذیر (که در آن هر پورت نقطه پایان یک جریان فیزیکی است) پشتیبانی می کند و انتظار می رود تنها نوع دستگاه خروجی پشتیبانی شده در یک وسیله نقلیه باشد.
یک پیاده سازی سیستم می تواند از یک پورت اتوبوس برای همه صداهای اندروید استفاده کند، در این صورت اندروید همه چیز را با هم ترکیب می کند و به صورت یک جریان ارائه می کند. روش دیگر، HAL میتواند یک پورت اتوبوس برای هر CarAudioContext
فراهم کند تا امکان ارسال همزمان هر نوع صدایی را فراهم کند. این امکان را برای اجرای HAL فراهم می کند تا صداهای مختلف را به دلخواه میکس و پخش کند.
تخصیص زمینه های صوتی به دستگاه های خروجی از طریق car_audio_configuration.xml
انجام می شود.
ورودی میکروفون
هنگام ضبط صدا، Audio HAL یک تماس openInputStream
دریافت می کند که شامل یک آرگومان AudioSource
است که نشان می دهد ورودی میکروفون چگونه باید پردازش شود.
منبع VOICE_RECOGNITION
(مخصوصاً دستیار Google) انتظار یک جریان میکروفون استریو را دارد که دارای اثر لغو اکو باشد (در صورت وجود) اما پردازش دیگری روی آن اعمال نشود. انتظار می رود که Beamforming توسط Assistant انجام شود.
ورودی میکروفون چند کاناله
برای ضبط صدا از دستگاهی با بیش از دو کانال (استریو)، به جای ماسک نمایه موقعیتی (مانند 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
(حداکثر دو کانال) استفاده می کند.
ضبط همزمان
از اندروید 10، چارچوب اندروید از ضبط همزمان ورودی ها پشتیبانی می کند، اما با محدودیت هایی برای محافظت از حریم خصوصی کاربر. به عنوان بخشی از این محدودیتها، منابع مجازی مانند 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، کاربردهای سیستمی معرفی شدند. این کاربردها مشابه کاربردهای قبلاً ایجاد شده عمل می کنند، به جز اینکه برای استفاده از APIهای سیستم و همچنین 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
برای تعریف مسیریابی، گروه های صدا و مدیریت فوکوس صوتی استفاده می شود.
زمینه های صوتی در اندروید 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 |
نقشه برداری بین زمینه های صوتی و کاربردها. ردیف های هایلایت شده برای استفاده های جدید سیستم هستند.
صدای چند منطقه ای
با خودرو، مجموعه جدیدی از موارد استفاده در مورد کاربران همزمان که با پلتفرم تعامل دارند و به دنبال مصرف رسانه های جداگانه هستند، ارائه می شود. به عنوان مثال، راننده می تواند در داخل کابین موسیقی پخش کند در حالی که مسافران در صندلی عقب در حال تماشای ویدیوی یوتیوب بر روی صفحه نمایش عقب هستند. صدای چند منطقه ای با اجازه دادن به منابع مختلف صوتی برای پخش همزمان در مناطق مختلف خودرو این امکان را فراهم می کند.
شروع صدای چند منطقه ای در Android 10 به OEM ها امکان می دهد صدا را در مناطق جداگانه پیکربندی کنند. هر منطقه مجموعه ای از دستگاه ها در داخل وسیله نقلیه با گروه های حجم مخصوص به خود، پیکربندی مسیریابی برای زمینه ها و مدیریت تمرکز است. به این ترتیب، کابین اصلی را می توان به عنوان یک منطقه صوتی پیکربندی کرد، در حالی که جک های هدفون نمایشگر عقب به عنوان منطقه دوم پیکربندی می شوند.
مناطق به عنوان بخشی از car_audio_configuration.xml
تعریف می شوند. سپس CarAudioService
پیکربندی را میخواند و به AudioService کمک میکند تا جریانهای صوتی را بر اساس منطقه مرتبط آنها هدایت کند. هر منطقه همچنان قوانینی را برای مسیریابی بر اساس زمینه ها و uid برنامه ها تعریف می کند. هنگامی که یک پخش کننده ایجاد می شود، CarAudioService
تعیین می کند که پخش کننده با کدام منطقه مرتبط است، و سپس بر اساس میزان استفاده، AudioFlinger باید صدا را به کدام دستگاه هدایت کند.
فوکوس نیز به طور مستقل برای هر منطقه صوتی حفظ می شود. این برنامهها را در مناطق مختلف قادر میسازد تا به طور مستقل صدا را بدون تداخل با یکدیگر تولید کنند، در حالی که برنامهها همچنان به تغییرات فوکوس در منطقه خود احترام میگذارند. CarZonesAudioFocus
در CarAudioService
مسئول مدیریت تمرکز برای هر منطقه است.
شکل 2. صدای چند منطقه ای را پیکربندی کنید
HAL صوتی
پیاده سازی های صوتی خودرو بر استاندارد صوتی Android 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>