โฟกัสอัตโนมัติ

ก่อนที่จะเริ่มสตรีมแบบลอจิคัล แอพจะขอโฟกัสเสียงโดยใช้คุณลักษณะเสียงเดียวกันกับที่ใช้สำหรับการสตรีมแบบลอจิคัล แอปจะต้องเคารพการสูญเสียโฟกัสเพื่อให้ทำงานได้ตามที่คาดไว้ในกรณีการใช้งานด้านยานยนต์

แม้ว่าแนะนำให้ส่งคำขอโฟกัส แต่ระบบไม่ได้บังคับใช้ ดังนั้น ให้พิจารณาการโฟกัสเป็นวิธีหนึ่งในการควบคุมและหลีกเลี่ยงความขัดแย้งระหว่างการเล่น แทนที่จะเป็นกลไกการควบคุมเสียงหลัก ยานพาหนะไม่ควรขึ้นอยู่กับระบบโฟกัสในการทำงานของระบบย่อยเครื่องเสียง

มุ่งเน้นการโต้ตอบ

เพื่อรองรับ AAOS คำร้องขอโฟกัสเสียงจะได้รับการจัดการตามการโต้ตอบที่กำหนดไว้ล่วงหน้าระหว่าง CarAudioContext ของคำขอและของผู้ถือโฟกัสปัจจุบัน การโต้ตอบมีสามประเภท:

  • พิเศษ
  • ปฏิเสธ
  • พร้อมกัน

ปฏิสัมพันธ์พิเศษ

นี่คือโมเดลการโต้ตอบที่ใช้กันมากที่สุดกับ Android

ในการโต้ตอบ แบบพิเศษ มีเพียงแอปเดียวเท่านั้นที่ได้รับอนุญาตให้จับโฟกัสในแต่ละครั้ง ดังนั้นคำขอโฟกัสที่เข้ามาจะได้รับการโฟกัสในขณะที่ผู้ถือโฟกัสที่มีอยู่สูญเสียโฟกัส เนื่องจากทั้งสองแอปเล่นสื่อ จึงอนุญาตให้มีแอปเดียวเท่านั้นที่จะจับโฟกัสได้ ด้วยเหตุนี้ คำขอโฟกัสของแอปที่เพิ่งเริ่มต้นจะถูกส่งกลับพร้อมกับ AUDIOFOCUS_REQUEST_GRANTED ในขณะที่แอปที่กำลังเล่นเพลงได้รับเหตุการณ์การเปลี่ยนโฟกัสพร้อมสถานะการสูญเสียซึ่งสอดคล้องกับประเภทของคำขอที่ถูกสร้างขึ้น

ปฏิเสธการโต้ตอบ

ด้วยการ โต้ตอบปฏิเสธ คำขอที่เข้ามาจะถูกปฏิเสธเสมอ ตัวอย่างเช่น เมื่อพยายามเล่นเพลงในขณะที่กำลังสนทนาอยู่ ในกรณีนี้ หากตัวโทรออกเก็บโฟกัสเสียงไว้สำหรับการโทรและแอพตัวที่สองร้องขอโฟกัสเพื่อเล่นเพลง แอพเพลงจะได้รับ AUDIOFOCUS_REQUEST_FAILED เพื่อตอบสนองคำขอ เนื่องจากคำขอโฟกัสถูกปฏิเสธ จึงไม่มีการส่งการสูญเสียโฟกัสไปยังตัวยึดโฟกัสปัจจุบัน

ปฏิสัมพันธ์ที่เกิดขึ้นพร้อมกัน

ลักษณะเฉพาะของ AAOS คือการโต้ตอบ ที่เกิดขึ้นพร้อมกัน ซึ่งจะทำให้แอปที่ขอโฟกัสเสียงในรถสามารถจับโฟกัสไปพร้อมกับแอปอื่นๆ ได้ เพื่อให้การโต้ตอบเกิดขึ้นพร้อมกัน ต้องเป็นไปตามเงื่อนไขต่อไปนี้ ที่:

หากตรงตามเกณฑ์เหล่านี้ คำร้องขอโฟกัสจะส่งกลับพร้อมกับ AUDIOFOCUS_REQUEST_GRANTED ในขณะที่ตัวยึดโฟกัสปัจจุบันไม่มีการเปลี่ยนแปลงในโฟกัส อย่างไรก็ตาม หากผู้ถือโฟกัสคนปัจจุบันเลือกที่จะรับเหตุการณ์เป็ดหรือหยุดชั่วคราวเมื่อเป็ด ผู้ถือโฟกัสคนปัจจุบันจะสูญเสียโฟกัส เช่นเดียวกับที่เกิดขึ้นกับการโต้ตอบเฉพาะ

การจัดการกระแสที่เกิดขึ้นพร้อมกัน

แม้ว่าการโต้ตอบที่เกิดขึ้นพร้อมกันจะมีประโยชน์หลายอย่าง แต่ให้ระมัดระวังในการมิกซ์และการลดระดับฮาร์ดแวร์ระหว่างอุปกรณ์เอาท์พุต เราขอแนะนำอย่างยิ่งว่า CarAudioContext ที่ได้รับอนุญาตให้เล่นพร้อมกันควรถูกกำหนดเส้นทางไปยังอุปกรณ์เอาต์พุตอื่น

การมีอุปกรณ์เอาต์พุตแยกกันสำหรับสตรีมพร้อมกัน ช่วยให้ HAL สามารถหลบสตรีมรายการใดรายการหนึ่งก่อนที่จะผสม หรือกำหนดเส้นทางสตรีมจริงไปยังลำโพงต่างๆ ในรถยนต์ หากสตรีมลอจิคัลผสมกันภายใน Android กำไรจะไม่เปลี่ยนแปลงและส่งมอบเป็นส่วนหนึ่งของสตรีมฟิสิคัลเดียวกัน

ตัวอย่างเช่น เมื่อมีการนำเสนอการนำทางและสื่อพร้อมกัน อัตราขยายของสตรีมสื่ออาจลดลงชั่วคราว (หรือลดลง) เพื่อให้สามารถได้ยินคำแนะนำการนำทางได้ชัดเจนยิ่งขึ้น หรืออาจกำหนดเส้นทางการนำทางไปยังลำโพงด้านคนขับในขณะที่สื่อต่างๆ ยังคงเล่นไปทั่วทั้งห้องโดยสาร

เมทริกซ์ปฏิสัมพันธ์

ตารางด้านล่างแสดงเมทริกซ์การโต้ตอบตามที่กำหนดโดย CarAudioService แต่ละแถวแสดงถึง CarAudioContext ของตัวยึดโฟกัสปัจจุบัน และแต่ละคอลัมน์แสดงถึงคำขอที่เข้ามา

ตัวอย่างเช่น เมื่อแอพสื่อเพลงจับโฟกัสในขณะที่แอพการนำทางร้องขอโฟกัส เมทริกซ์จะระบุว่าการโต้ตอบทั้งสองสามารถเล่นพร้อมกันได้ โดยถือว่าเป็นไปตามเกณฑ์อื่น ๆ สำหรับ การโต้ตอบ พร้อมกัน

เนื่องจากการโต้ตอบที่เกิดขึ้นพร้อมกัน คุณจึงสามารถมีที่วางโฟกัสได้มากกว่าหนึ่งอัน ในกรณีนี้ คำขอโฟกัสที่เข้ามาจะถูกเปรียบเทียบกับผู้ถือโฟกัสปัจจุบันแต่ละราย ก่อนที่จะพิจารณาว่าจะใช้การโต้ตอบใด ในกรณีนี้ การโต้ตอบแบบอนุรักษ์นิยมที่สุดจะชนะ ปฏิเสธ จากนั้นเป็นเอกสิทธิ์ และเกิดขึ้นพร้อมกันในที่สุด

เมทริกซ์การโต้ตอบโฟกัสเสียง

รูปที่ 1 เมทริกซ์การโต้ตอบโฟกัสเสียง

ใน Android 11 มีการแนะนำการตั้งค่าผู้ใช้ใหม่เพื่อให้ผู้ใช้สามารถเปลี่ยนพฤติกรรมการโต้ตอบระหว่างการนำทางและการโทรได้ เมื่อตั้งค่า android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL จะเปลี่ยนการโต้ตอบระหว่างคำขอโฟกัส NAVIGATION ขาเข้าและตัวยึดโฟกัส CALL ปัจจุบันจาก พร้อมกัน เป็น ปฏิเสธ หากผู้ใช้ต้องการให้คำแนะนำการนำทางไม่ขัดจังหวะการโทร พวกเขาสามารถเปิดใช้งานการตั้งค่าได้ สิ่งนี้จะคงอยู่สำหรับผู้ใช้ และสามารถตั้งค่าแบบไดนามิกเพื่อให้คำขอโฟกัสที่ตามมาเคารพการตั้งค่าใหม่

โฟกัสเสียงล่าช้า

ใน Android 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. เมื่อคำขอล่าช้า Focus Listener จะจัดการกับการเปลี่ยนแปลงในโฟกัส:

    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

เริ่มตั้งแต่ Android 11 เป็นต้นไป HAL จะเปิดใช้งานเพื่อขอโฟกัสในนามของสตรีมภายนอก แม้ว่าจะเป็นทางเลือก แต่ขอแนะนำให้ใช้ API เหล่านี้เพื่อให้เสียงภายนอกเข้ามามีส่วนร่วมอย่างเหมาะสมที่สุดในระบบนิเวศของ Android และเพื่อมอบประสบการณ์ผู้ใช้ที่ราบรื่น

HAL จะตัดสินใจขั้นสุดท้ายว่าเสียงใดควรได้รับความสำคัญเป็นอันดับแรก ในระดับนี้ ควรเล่นเสียงวิกฤตฉุกเฉินและความปลอดภัย ไม่ว่า HAL จะได้รับการโฟกัสเสียงหรือไม่ก็ตาม และควรเล่นต่อไปตามความเหมาะสม แม้ว่า HAL จะสูญเสียโฟกัสเสียงก็ตาม เช่นเดียวกับเสียงใดๆ ที่กำหนดโดยกฎระเบียบของรัฐบาล

HAL ควรปิดเสียงสตรีมของ Android ในเชิงรุกตามความเหมาะสมเมื่อเล่นเสียงฉุกเฉินหรือเสียงที่มีความสำคัญต่อความปลอดภัย เพื่อให้แน่ใจว่าจะได้ยินอย่างชัดเจน

ระบบควบคุมเสียง@2.0

AudioControl HAL เวอร์ชัน 2.0 แนะนำ 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

บริการเน้นเครื่องเสียงรถยนต์ OEM

ใน Android 14 AAOS ได้เปิดตัวบริการปลั๊กอิน OEM ของรถยนต์เพื่อให้สามารถกำหนดค่าส่วนประกอบบางอย่างของรถยนต์ได้ สำหรับ บริการปลั๊กอินเครื่องเสียงรถยนต์ บริการปลั๊กอินช่วยให้ OEM สามารถจัดการคำขอโฟกัสที่ถูกดักฟังโดยบริการเครื่องเสียงรถยนต์ได้ สิ่งนี้ทำให้ OEM มีความยืดหยุ่นมากขึ้นในแง่ของการจัดการจุดมุ่งเน้นตามกฎและข้อบังคับ ด้วยเหตุนี้ การตอบสนองของโฟกัสเสียงอาจแตกต่างกันระหว่างผู้ผลิต และจากภูมิภาคหนึ่งไปอีกภูมิภาคหนึ่ง หลักการพื้นฐานสำหรับการโฟกัสเสียงยังคงอยู่ คือแอปควรขอโฟกัสเพื่อการจัดการเสียงที่ดีขึ้น เพื่อปรับปรุงประสบการณ์ผู้ใช้ โดยทั่วไป กฎบางอย่างยังคงใช้กับคำขอเน้นเสียงโดยแอป:

  • แอปที่ไม่มีโฟกัสเสียงแบบยืนและมีลำดับความสำคัญสูง (รวมถึงการโทร การแจ้งเตือนเหตุฉุกเฉิน หรือการแจ้งเตือนด้านความปลอดภัย) ควรสามารถรับโฟกัสเสียงได้ชั่วคราวหรือถาวร

  • ในขณะที่มีเดียโฟกัสทำงานอยู่:

    • แอปที่ขอเน้นการใช้งานการโทรควรสามารถรับสายพร้อมกันหรือแบบเฉพาะได้

    • แอปที่ขอโฟกัสการใช้งานการนำทางควรสามารถรับโฟกัสการนำทางพร้อมกันหรือแบบเฉพาะได้

    • แอปที่ขอโฟกัสการใช้งานของผู้ช่วยควรจะสามารถรับโฟกัสการใช้งานพร้อมกันหรือแบบเฉพาะได้

  • ขณะที่แอปโฟกัสเสียงที่มีลำดับความสำคัญสูงแบบยืน (รวมถึงการโทร การเตือนเหตุฉุกเฉิน หรือการแจ้งเตือนด้านความปลอดภัย) ทำงานอยู่ คำขอโฟกัสเสียงที่ล่าช้าที่เข้ามาใดๆ ควรได้รับหรือล่าช้าตามความจำเป็น

แม้ว่าคำแนะนำข้างต้นจะไม่ได้ครอบคลุมทั้งหมด แต่ก็สามารถช่วยแอปที่ขอโฟกัสเพื่อให้ได้โฟกัสได้ หากไม่มีเสียงที่มีลำดับความสำคัญสูงที่ใช้งานอยู่ แม้ว่าเสียงที่มีลำดับความสำคัญสูงจะทำงานอยู่ แต่คำขอโฟกัสที่ล่าช้าก็ควรได้รับการเคารพ และควรจะสามารถได้รับการโฟกัสได้เมื่อเสียงที่มีลำดับความสำคัญสูงหยุดลง