صدای خودرو

سیستم‌عامل Android Automotive (AAOS) بر روی پشته صوتی Android ساخته شده است تا از موارد استفاده برای عملکرد به عنوان سیستم اطلاعات سرگرمی در خودرو پشتیبانی کند. AAOS مسئول صداهای سرگرمی اطلاعاتی (یعنی رسانه، ناوبری و ارتباطات) است، اما مستقیماً مسئول زنگ ها و هشدارهایی نیست که الزامات دقیق در دسترس بودن و زمان بندی دارند. در حالی که AAOS سیگنال‌ها و مکانیسم‌هایی را برای کمک به خودرو در مدیریت صدا ارائه می‌کند، در پایان این به خودرو بستگی دارد که تماس بگیرد که چه صداهایی باید برای راننده و سرنشینان پخش شود، و اطمینان حاصل می‌کند که صداهای مهم ایمنی و صداهای نظارتی به درستی شنیده می‌شوند. وقفه

همانطور که Android تجربه رسانه ای خودرو را مدیریت می کند، منابع رسانه خارجی مانند تیونر رادیویی باید توسط برنامه هایی نشان داده شوند که می توانند فوکوس صوتی و رویدادهای کلید رسانه را برای منبع کنترل کنند.

اندروید 11 شامل تغییرات زیر در پشتیبانی صوتی مربوط به خودرو است:

صداها و استریم های اندروید

سیستم‌های صوتی خودرو صداها و جریان‌های زیر را کنترل می‌کنند:

نمودار معماری جریان محور

شکل 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>