فوکوس صوتی

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

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

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

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

  • انحصاری
  • رد کردن
  • هم زمان

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

این مدل تعاملی است که بیشتر در اندروید استفاده می شود.

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

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

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

تعامل همزمان

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

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

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

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

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

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

ماتریس تعامل

جدول زیر ماتریس تعامل را که توسط CarAudioService تعریف شده است نشان می دهد. هر ردیف نشان دهنده 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 ).

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

برای ایجاد درخواستی که می تواند به تعویق بیفتد:

  1. از AudioFocusRequest.Builder#setAcceptsDelayedFocusGain استفاده کنید.

    mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener();
    
    mDelayedFocusRequest = new AudioFocusRequest
         .Builder(AudioManager.AUDIOFOCUS_GAIN)
         .setAudioAttributes(mMusicAudioAttrib)
         .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener)
         .setForceDucking(false)
         .setWillPauseWhenDucked(false)
         .setAcceptsDelayedFocusGain(true)
         .build();
    
  2. هنگام ارسال درخواست، پاسخ 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;
    }
    
  3. هنگامی که درخواست به تأخیر می افتد، شنونده فوکوس تغییرات فوکوس را کنترل می کند:

    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 باید به طور فعال جریان‌های Android را قطع کند تا مطمئن شود که به وضوح شنیده می‌شوند.

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 ، این درخواست‌ها برای اطمینان از عدم تأخیر HAL در هنگام پردازش درخواست تمرکز، oneway هستند. HAL نباید منتظر بماند تا قبل از پخش صداهای مهم ایمنی، تمرکز کند. برای HAL اختیاری است که از طریق IAudioControl#onAudioFocusChange به تغییرات فوکوس صوتی گوش دهد و به آنها پاسخ دهد.

خدمات فوکوس صوتی خودرو OEM

در اندروید 14، AAOS خدمات پلاگین OEM خودرو را برای فعال کردن پیکربندی برای برخی از اجزای خودرو معرفی کرد. برای سرویس پلاگین صدای خودرو ، سرویس پلاگین به OEM ها اجازه می دهد تا درخواست های فوکوس رهگیری شده توسط سرویس صوتی خودرو را مدیریت کنند. این به OEM ها از نظر مدیریت تمرکز مطابق با قوانین و مقررات انعطاف بیشتری می دهد. به این ترتیب، تعامل فوکوس صوتی ممکن است بین سازنده ها و از منطقه ای به منطقه دیگر متفاوت باشد. فرض اصلی برای فوکوس صوتی همچنان پابرجاست، این که برنامه ها همچنان باید برای مدیریت بهتر صدا برای بهبود تجربه کاربر، فوکوس را درخواست کنند. به طور کلی، قوانین خاصی همچنان برای درخواست فوکوس صوتی توسط برنامه ها اعمال می شود:

  • برنامه‌های بدون فوکوس صوتی با اولویت بالا (از جمله تماس تلفنی، هشدار اضطراری یا اعلان ایمنی) باید بتوانند فوکوس صوتی را به‌طور موقت یا دائم به دست آورند.

  • در حالی که تمرکز رسانه فعال است:

    • برنامه‌هایی که فوکوس استفاده از تماس را درخواست می‌کنند باید بتوانند تماس را به صورت همزمان یا انحصاری دریافت کنند.

    • برنامه‌هایی که فوکوس استفاده از ناوبری را درخواست می‌کنند باید بتوانند فوکوس ناوبری را به صورت همزمان یا انحصاری دریافت کنند.

    • برنامه‌هایی که فوکوس استفاده از دستیار را درخواست می‌کنند باید بتوانند فوکوس استفاده را همزمان یا انحصاری دریافت کنند.

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

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