การกำหนดเส้นทางเสียง

ใน Android 10 car_audio_configuration.xml จะแทนที่ car_volumes_groups.xml และ IAudioControl.getBusForContext ระบบจะกำหนดรายการโซนในไฟล์การกำหนดค่าใหม่ แต่ละโซนมีอย่างน้อย 1 โซน กลุ่มระดับเสียงพร้อมด้วยอุปกรณ์ที่เกี่ยวข้องกัน และอุปกรณ์แต่ละเครื่องมีบริบท ควรกำหนดเส้นทางภายในโซนนั้น ต้องแสดงบริบททั้งหมด ภายในแต่ละโซน

การกำหนดค่าการกำหนดเส้นทางเสียง

ไฟล์นโยบายเสียง ซึ่งโดยปกติจะอยู่ในพาร์ติชันผู้ให้บริการ จะเป็นตัวแทน การกำหนดค่าฮาร์ดแวร์เสียงของบอร์ด อุปกรณ์ทั้งหมดที่อ้างอิงใน car_audio_configuration.xml ต้องกำหนดไว้ภายใน audio_policy_configuration.xml

กำลังเปิดใช้การกำหนดเส้นทาง AAOS

หากต้องการใช้การกำหนดเส้นทางแบบ AAOS คุณต้องตั้งค่า audioUseDynamicRouting ตั้งค่าสถานะเป็น true:

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

เมื่อ false การกำหนดเส้นทางและ CarAudioService ส่วนใหญ่จะถูกปิดใช้งาน และ ระบบปฏิบัติการจะกลับไปใช้ลักษณะการทำงานเริ่มต้นของ AudioService

โซนหลัก

เสียงทั้งหมดจะส่งไปยังโซนหลักโดยค่าเริ่มต้น มีเพียง เป็นโซนหลัก 1 โซน ซึ่งระบุในการกำหนดค่าโดยแอตทริบิวต์ isPrimary="true"

ตัวอย่างการกำหนดค่า

เช่น ยานพาหนะอาจมี 2 โซน ได้แก่ โซนหลักและเบาะหลัง ระบบความบันเทิง ด้วยเหตุนี้ จึงอาจcar_audio_configuration.xml จะมีคำจำกัดความดังนี้

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

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

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

การกำหนดค่าเสียงในโซนผู้พักอาศัย

ใน Android 11 car_audio_configuration.xmlได้ขยายเพิ่มเติมไปยัง ได้แนะนำฟิลด์ใหม่ 2 ฟิลด์ คือ audioZoneId และ occupantZoneId อย่างแรกคือ audioZoneId จะใช้เพื่อควบคุมการจัดการโซนได้ดียิ่งขึ้น ในทางกลับกัน คุณสามารถใช้ occupantZoneId เพื่อกำหนดค่าตามรหัสผู้ใช้ได้ เส้นทาง

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

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

การกำหนดค่าด้านบนจะกำหนดการแมปสำหรับโซนหลักกับโซน 0 และ audioZoneId 1 ถึง occupantZoneId 1. โดยทั่วไปการแมปใดๆ ระหว่างโซนผู้โดยสารและโซนเสียงได้ แต่การแมปต้องเป็นแบบ 1 ต่อ 1 กฎที่ระบุช่องใหม่ 2 ช่องมีดังนี้

  • audioZoneId สำหรับโซนหลักจะเป็น 0 เสมอ
  • ใช้หมายเลข audioZoneId และ occupantZoneId ซ้ำกันไม่ได้
  • audioZoneId และ occupantZoneId มีการแมปแบบ 1 ต่อ 1 เท่านั้น

การกำหนดเส้นทางผ่าน UID ของแอปพลิเคชัน

มีการเปิดตัวชุด API ที่ซ่อนอยู่ใน CarAudioManager ในปี 1000 เพื่อให้แอปต่างๆ เพื่อค้นหาและตั้งค่าโซนและโฟกัสของเสียง

int[] getAudioZoneIds();
int getZoneIdForUid(int uid);
boolean setZoneIdForUid(int zoneId, int uid);
boolean clearZoneIdForUid(int uid);

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

การเปลี่ยนโซนสำหรับแอป

โดยค่าเริ่มต้น เส้นทางเสียงทั้งหมดไปยังโซนหลัก วิธีอัปเดตแอปพลิเคชันเป็น ไปยังโซนอื่น ให้ใช้ CarAudioManager#setZoneIdForUid:

// Find zone to play
int zoneId = ...

// Find application's uid
Int uid = mContext.getPackageManager()
        .getApplicationInfo(mContext.getPackageName(), 0)
        .uid;

if (mCarAudioManager.setZoneIdForUid(zoneId, info.uid)) {
    Log.d(TAG, "Zone successfully updated");
} else {
    Log.d(TAG, "Failed to change zone");
}

น. หมายเหตุ: สตรีมและโฟกัสจะเปลี่ยนโซนแบบไดนามิกไม่ได้ ดังนั้น การเล่นต้องหยุดลงและขอให้มีการโฟกัสอีกครั้งเพื่อเปลี่ยนโซน

การกำหนดเส้นทางด้วย User ID

แม้ว่าการกำหนดเส้นทางแบบ UID ของแอปพลิเคชันจะช่วยให้การควบคุมแต่ละแอปพลิเคชัน การกำหนดเส้นทางเสียง จะต้องมีการกำหนดการกำหนดเส้นทางเสียงสำหรับแต่ละแอปพลิเคชันก่อน กับแอปพลิเคชันที่ขอโฟกัสเสียงและการเล่นเสียง เพื่อลดปัญหานี้ และอำนวยความสะดวกให้กับแอปพลิเคชันของบุคคลที่สามในการเล่นเสียงโดยไม่มีการปรับเปลี่ยนใดๆ CarAudioService ใช้โซนการควบคุมรถและการแมปโซนเสียงเพื่อกำหนด การกำหนดเส้นทางตาม User-ID ด้วยวิธีนี้ เมื่อผู้ใช้เข้าสู่ระบบโซนที่มีการเข้าใช้ เครื่องเสียงติดรถยนต์ บริการจะได้รับการแจ้งเตือน เมื่อใช้สัญญาณนี้ การจัดการและการกำหนดเส้นทางเสียงจะ ที่กำหนดค่าไว้สำหรับโซนเสียงทั้งหมด

การกำหนดเส้นทางแบบ UID ของแอปพลิเคชันยังคงใช้งานได้ แต่ต้องดำเนินการโดยอิสระจาก การกำหนดเส้นทางรหัสผู้ใช้ ซึ่งหมายความว่าหากการแมปโซนเสียงในรถยนต์มีการแมปโซน กำหนดไว้แล้ว การกำหนดเส้นทางโดยใช้ UID จะถูกปิดใช้งานและพยายามเรียกใช้ CarAudioManager#setZoneidForUid จะแสดงข้อผิดพลาด

ส่วนการกำหนดเส้นทางเสียงและการจัดการการโฟกัสจะเรียบง่ายขึ้นด้วยโซนผู้โดยสาร ระบบยังคงต้องกำหนดผู้ใช้ให้กับโซนที่มีการเข้าใช้ ซึ่งสามารถทำได้โดย โดยใช้ CarOccupantZoneManager#assignProfileUserToOccupantZone ช่วงเวลานี้ API ต้องการสิทธิ์ในการจัดการผู้ใช้ ความคาดหวังในปัจจุบันคือให้ OEM เข้ามาจัดการ ผู้ใช้ที่จะใช้งานการกำหนดโซนผ่าน UI ของระบบบางประเภท เมื่อดำเนินการเสร็จแล้ว การเปิด การกำหนดเส้นทางเสียง และการจัดการโฟกัสจะได้รับการกำหนดค่าให้กับผู้ใช้โดยอัตโนมัติ

การกำหนดเส้นทางด้วย setดีลที่ต้องการ

นอกจากการเปลี่ยนแปลงข้างต้นแล้ว Android 11 ยังมี API ใหม่เพื่อค้นหาอุปกรณ์เอาต์พุตด้วย ที่เชื่อมโยงกับแต่ละโซน CarAudioManager#getOutputDeviceForUsage(intzoneId, intUsage)

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

audioZoneId = ... ;
mediaDeviceInfo = mCarAudioManager
            .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA);
…
mPlayer.setPreferredDevice(mediaDeviceInfo);