ใน 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);