فوکوس صوتی

قبل از شروع یک جریان منطقی، یک برنامه باید فوکوس صوتی را با استفاده از همان ویژگی های صوتی مورد استفاده برای جریان منطقی خود درخواست کند. اگرچه ارسال چنین درخواست فوکوس توصیه می شود، اما توسط سیستم اجرا نمی شود. برخی از برنامه‌ها ممکن است به صراحت از ارسال درخواست برای دستیابی به رفتارهای خاص خودداری کنند (مثلاً برای پخش عمدی صدا در حین تماس تلفنی).

به همین دلیل، باید تمرکز را راهی برای کنترل غیرمستقیم و عدم تضاد پخش در نظر بگیرید، نه به عنوان مکانیزم کنترل اولیه صدا. خودرو نباید برای عملکرد زیرسیستم صوتی به سیستم فوکوس وابسته باشد.

بر تعاملات تمرکز کنید

برای پشتیبانی از نیازهای AAOS، درخواست های فوکوس صوتی بر اساس تعاملات از پیش تعریف شده بین CarAudioContext درخواست و دارندگان فوکوس فعلی انجام می شود. سه نوع تعامل وجود دارد: انحصاری، رد و همزمان.

تعامل انحصاری

در فعل و انفعالات انحصاری فقط یک برنامه مجاز است در یک زمان فوکوس را حفظ کند. بنابراین به درخواست فوکوس دریافتی فوکوس داده می شود در حالی که دارنده فوکوس موجود تمرکز را از دست می دهد. یک مثال از این زمانی است که کاربر یک برنامه موسیقی جدید را در حالی که موسیقی در حال پخش در یک برنامه موجود است راه اندازی می کند. از آنجایی که هر دو در حال پخش رسانه هستند، تنها یکی از برنامه‌ها اجازه دارد هر بار فوکوس را حفظ کند. در نتیجه، درخواست تمرکز برنامه تازه راه‌اندازی شده با AUDIOFOCUS_REQUEST_GRANTED برمی‌گردد و برنامه‌ای که در حال پخش موسیقی است، یک رویداد تغییر تمرکز با وضعیت از دست دادن دریافت می‌کند که مطابق با نوع درخواستی است که انجام شده است. این مدل تعاملی است که بیشتر در اندروید دیده می شود.

تعامل را رد کنید

با تعاملات رد، درخواست ورودی همیشه رد می شود. تلاش برای پخش موسیقی در حالی که تماس در حال انجام است، نمونه ای از تعامل رد شده است. در این حالت، اگر شماره‌گیر در حال حاضر فوکوس صوتی را برای تماس و فوکوس درخواست برنامه دوم برای پخش موسیقی را نگه داشته باشد، برنامه موسیقی در پاسخ به درخواست خود AUDIOFOCUS_REQUEST_FAILED دریافت می‌کند. از آنجایی که درخواست فوکوس رد می شود، هیچ نوع از دست دادن فوکوس به نگهدارنده فوکوس فعلی ارسال نمی شود.

تعامل همزمان

منحصر به فرد ترین برای AAOS تعاملات همزمان است. این به برنامه های درخواست کننده فوکوس صوتی در خودرو این امکان را می دهد که فوکوس را همزمان با سایر برنامه ها حفظ کنند. برای انجام یک تعامل همزمان، شرایط زیر باید رعایت شود. :

اگر این معیارها برآورده شوند، درخواست فوکوس با AUDIOFOCUS_REQUEST_GRANTED برمی‌گردد در حالی که دارنده فوکوس فعلی تغییری در فوکوس ندارد. با این حال، اگر نگهدارنده فوکوس فعلی تصمیم بگیرد که رویدادهای اردک را دریافت کند یا در هنگام قطع شدن مکث کند، دارنده فوکوس فعلی دقیقاً مانند یک تعامل انحصاری تمرکز را از دست می‌دهد.

مدیریت جریان های همزمان

در حالی که تعامل همزمان کاربردهای مفید زیادی دارد، OEM ها باید از اختلاط و اتصال در سطح سخت افزار در دستگاه های خروجی مراقبت کنند. به همین دلیل، اکیداً توصیه می شود که CarAudioContext فقط به همان دستگاه خروجی CarAudioContext هدایت شود که نمی توانند همزمان با آن بازی کنند. با داشتن دستگاه‌های خروجی مجزا برای جریان‌های همزمان، این HAL را قادر می‌سازد تا یکی از جریان‌ها را قبل از اختلاط آنها با یکدیگر بکارد یا جریان‌های فیزیکی را به بلندگوهای مختلف خودرو هدایت کند. اگر جریان های منطقی در اندروید ترکیب شوند، دستاوردهای آنها تغییر نمی کند و به عنوان بخشی از همان جریان فیزیکی ارائه می شود.

به عنوان مثال، هنگامی که ناوبری و رسانه به طور همزمان تحویل داده می شوند، بهره برای جریان رسانه می تواند به طور موقت کاهش یابد (کاهش شود) بنابراین دستورالعمل های ناوبری با وضوح بیشتری شنیده می شود. از طرف دیگر، جریان ناوبری می تواند به بلندگوهای سمت راننده هدایت شود در حالی که پخش رسانه در بقیه کابین ادامه دارد.

ماتریس تعامل

جدول زیر ماتریس تعامل را که توسط CarAudioService تعریف شده است نشان می دهد. سطرها نشان دهنده CarAudioContext دارنده فوکوس فعلی و ستون ها نمایانگر درخواست ورودی هستند.

با نگاهی به یک مثال، جایی که یک برنامه رسانه موسیقی در حال حاضر فوکوس را نگه می‌دارد و یک برنامه ناوبری فوکوس را درخواست می‌کند، ماتریس نشان می‌دهد که این دو تعامل می‌توانند همزمان پخش شوند، با فرض اینکه سایر معیارهای تعاملات همزمان برآورده شوند.

به دلیل تعاملات همزمان، امکان وجود بیش از یک نگهدارنده فوکوس وجود دارد. در این مورد، یک درخواست فوکوس دریافتی با هر یک از دارندگان فوکوس فعلی قبل از تصمیم گیری در مورد اینکه چه نوع تعاملی اعمال شود، مقایسه می شود. در این مورد، محافظه کارانه ترین تعامل برنده می شود (رد، سپس انحصاری، و در نهایت همزمان).

در جدول زیر، تعاملات فوکوس بین CarAudioContext برای درخواست فوکوس دریافتی (ستون ها) و زمینه نگهدارنده های فوکوس موجود (ردیف ها) ارائه شده است. هر سلول نشان دهنده نوع تعامل مورد انتظار برای دو زمینه است.

تعاملات فوکوس صوتی

شکل 1. تعاملات فوکوس صوتی

در اندروید 11، تنظیمات کاربری جدیدی معرفی شده است که به کاربران امکان می دهد رفتار تعامل بین ناوبری و تماس های تلفنی را تغییر دهند. وقتی تنظیم شود، android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL تعامل بین درخواست‌های فوکوس NAVIGATION ورودی و دارندگان فوکوس CALL فعلی را از همزمان به رد تغییر می‌دهد. بنابراین اگر کاربر ترجیح می‌دهد که دستورالعمل‌های ناوبری تماس او را قطع نکند، می‌تواند این تنظیم را فعال کند. این برای کاربر ادامه دارد و می‌تواند به صورت پویا تنظیم شود تا درخواست‌های فوکوس بعدی به مقدار تنظیم جدید احترام بگذارند.

فوکوس صوتی با تاخیر

در اندروید 11، AAOS پشتیبانی از درخواست فوکوس صوتی تاخیری را اضافه کرده است. این اجازه می دهد تا درخواست های فوکوس غیر گذرا زمانی که تعامل آنها با دارندگان فوکوس فعلی معمولاً منجر به رد شدن آنها می شود به تأخیر بیفتد. هنگامی که تغییر در تمرکز منجر به حالتی می شود که در آن درخواست تاخیری می تواند تمرکز پیدا کند، درخواست اعطا می شود.

قوانین مربوط به درخواست های تأخیری فوکوس صوتی

  • فقط درخواست‌های غیر گذرا - همانطور که قبلاً ذکر شد، درخواست تاخیری فقط برای منابع غیر گذرا قابل انجام است. این برای جلوگیری از پخش صدای گذرا مدت طولانی پس از مرتبط بودن آن است.
  • فقط یک درخواست می‌تواند در هر زمان به تأخیر بیفتد - اگر درخواست تاخیری در حالی که قبلاً درخواست تاخیری وجود داشته باشد، ارسال شود، درخواست تاخیری اصلی یک رویداد تغییر AUDIOFOCUS_LOSS دریافت می‌کند و درخواست جدید یک پاسخ همزمان AUDIOFOCUS_REQUEST_DELAYED دریافت می‌کند.
  • درخواست های تاخیری باید دارای OnAudioFocusChangeListener باشند . هنگامی که درخواست به تاخیر افتاد، از شنونده برای اطلاع دادن به درخواست کننده استفاده می شود که در نهایت درخواست اعطا شد ( AUDIOFOCUS_GAIN )، یا اگر بعداً رد شد ( AUDIOFOCUS_LOSS ).

فوکوس تاخیری را درخواست کنید

برای ایجاد درخواستی که می‌تواند به تاخیر بیفتد، از AudioFocusRequest.Builder#setAcceptsDelayedFocusGain استفاده کنید:

mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();

mDelayedFocusRequest = new AudioFocusRequest
     .Builder(AudioManager.AUDIOFOCUS_GAIN)
     .setAudioAttributes(mMusicAudioAttrib)
     .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
     .setForceDucking(false)
     .setWillPauseWhenDucked(false)
     .setAcceptsDelayedFocusGain(true)
     .build();

سپس، هنگام درخواست، پاسخ AUDIOFOCUS_REQUEST_DELAYED را بررسی کنید:

int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest);
if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// start audio playback
return;
}
if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
     // audio playback delayed to audio focus listener
     return;
}

هنگامی که درخواست به تأخیر می افتد، شنونده تمرکز مسئول مدیریت تغییرات در فوکوس است:

private final class MediaWithDelayedFocusListener implements
OnAudioFocusChangeListener {
       @Override
       public void onAudioFocusChange(int focusChange) {
           synchronized (mLock) {
               switch (focusChange) {
                   case AudioManager.AUDIOFOCUS_GAIN:
                        // Start focus playback
                   case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                        // Pause media transiently
                   case AudioManager.AUDIOFOCUS_LOSS:
                        // Stop media

مدیریت فوکوس چند منطقه ای

برای وسایل نقلیه با چندین منطقه صوتی، فوکوس صوتی به طور مستقل برای هر منطقه مدیریت می شود. به این ترتیب، درخواست به یک منطقه، آنچه را که در مناطق دیگر فوکوس را حفظ می‌کند، در نظر نمی‌گیرد، و همچنین باعث می‌شود که دارندگان فوکوس در مناطق دیگر تمرکز خود را از دست بدهند. با این کار، فوکوس کابین اصلی را می توان به طور جداگانه از سیستم سرگرمی صندلی عقب مدیریت کرد، بنابراین از قطع شدن پخش صدا در یک منطقه توسط تغییرات فوکوس در منطقه دیگر جلوگیری کرد.

برای همه برنامه ها مدیریت تمرکز توسط CarAudioService به طور خودکار انجام می شود. منطقه صوتی درخواست فوکوس بر اساس UserId یا UID مرتبط آن تعیین می‌شود. برای جزئیات، به مسیریابی صوتی مراجعه کنید.

درخواست صدا از چندین منطقه به طور همزمان

اگر برنامه‌ای بخواهد صدا را در چندین منطقه به طور همزمان پخش کند، باید فوکوس را برای هر منطقه با گنجاندن AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID در بسته درخواست کند:

// Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
               zoneId);

AudioAttributes attributesWithZone = new AudioAttributes.Builder()
     .setUsage(AudioAttributes.USAGE_MEDIA)
     .addBundle(bundle)
     .build();

// Create focus request using built attributesWithZone

این پارامتر بسته به درخواست کننده اجازه می دهد تا نگاشت منطقه صوتی خودکار را لغو کند تا در عوض از شناسه منطقه مشخص شده استفاده کند. بنابراین، با این یک برنامه می تواند درخواست های جداگانه ای برای مناطق مختلف صوتی صادر کند.

فوکوس صوتی HAL

با شروع اندروید 11، HAL اکنون برای درخواست تمرکز از طرف جریان های خارجی فعال است. در حالی که اختیاری هستند، این APIها به شدت تشویق می شوند تا صداهای خارجی را فعال کنند تا مشارکت بهتری در اکوسیستم اندروید داشته باشند و تجربه کاربری نرم تری ارائه دهند.

به خاطر داشته باشید که HAL همچنان مسئول برقراری تماس نهایی در مورد صداهایی است که باید اولویت داشته باشند. در این حد، صداهای بحرانی اضطراری و ایمنی باید بدون توجه به اینکه آیا HAL فوکوس صوتی دارد یا خیر پخش شود، و حتی اگر HAL فوکوس صوتی را از دست بدهد، باید همچنان پخش شود. همین امر برای هر صدایی که توسط مقررات لازم است صادق است.

در همین راستا، HAL همچنان باید هنگام پخش صداهای حیاتی اضطراری یا ایمنی، به طور پیشگیرانه جریان های اندروید را قطع کند تا مطمئن شود که به وضوح شنیده می شوند.

AudioControl@2.0

نسخه 2.0 AudioControl HAL چندین API جدید را معرفی می کند:

API هدف
IAudioControl#registerFocusListener یک نمونه از IFocusListener را با AudioControl HAL ثبت می کند. این شنونده HAL را قادر می سازد تا فوکوس صوتی را درخواست کند و از آن صرف نظر کند. انتظار می رود HAl یک نمونه ICloseHandle را برای استفاده توسط Android برای لغو ثبت شنونده ارائه دهد.
IAudioControl#onAudioFocusChange HAL را از تغییرات وضعیت برای تمرکز درخواست‌های ارائه شده توسط HAL از طریق IFocusListener مطلع می‌کند. این شامل پاسخ به درخواست های تمرکز اولیه است.
IFocusListener#requestAudioFocus برای استفاده مشخص، شناسه منطقه و نوع فوکوس فوکوس از طرف HAL ​​درخواست می کند.
IFocusListener#abandonAudioFocus درخواست‌های فوکوس HAL موجود برای استفاده مشخص شده و شناسه منطقه را رها می‌کند.

HAL می‌تواند چندین درخواست فوکوس را همزمان داشته باشد، اما به یک درخواست در هر استفاده و جفت‌سازی شناسه منطقه محدود می‌شود. توجه داشته باشید که Android فرض می‌کند که HAL بلافاصله پس از درخواست، شروع به پخش صداها برای استفاده می‌کند و تا زمانی که تمرکز را رها کند، این کار را ادامه می‌دهد.

به غیر از registerFocusListener ، این درخواست‌ها همه oneway هستند تا اطمینان حاصل شود که Android HAL را در حین پردازش یک درخواست تمرکز به تاخیر نمی‌اندازد. HAL نباید منتظر بماند تا قبل از پخش صداهای مهم ایمنی، تمرکز کند. برای HAL اختیاری است که از طریق IAudioControl#onAudioFocusChange به تغییرات فوکوس صوتی گوش دهد و به آن پاسخ دهد، اگرچه در صورت لزوم تشویق می شود.