ใน Android 10 car_audio_configuration.xml
จะแทนที่ car_volumes_groups.xml
และ IAudioControl.getBusForContext
ในไฟล์การกําหนดค่าใหม่จะมีการกำหนดรายการโซน แต่ละโซนจะมีกลุ่มโวลุ่มอย่างน้อย 1 กลุ่มที่มีอุปกรณ์ที่เกี่ยวข้อง และอุปกรณ์แต่ละเครื่องจะมีบริบทที่ควรกำหนดเส้นทางภายในโซนนั้น คุณต้องแสดงบริบททั้งหมดภายในแต่ละโซน
การกำหนดค่าการกำหนดเส้นทางเสียง
ไฟล์นโยบายเสียงซึ่งมักจะอยู่ในพาร์ติชันของผู้ให้บริการจะแสดงการกำหนดค่าฮาร์ดแวร์เสียงของบอร์ด อุปกรณ์ทั้งหมดที่อ้างอิงใน car_audio_configuration.xml
ต้องกำหนดภายใน audio_policy_configuration.xml
การเปิดใช้การกำหนดเส้นทาง AAOS
หากต้องการใช้การกำหนดเส้นทางตาม AAOS คุณต้องตั้งค่า Flag audioUseDynamicRouting
เป็น true
ดังนี้
<resources> <bool name="audioUseDynamicRouting">true</bool> </resources>
เมื่อ false
ระบบจะปิดใช้การกำหนดเส้นทางและ CarAudioService
ส่วนใหญ่ และระบบปฏิบัติการจะกลับไปใช้ลักษณะการทำงานเริ่มต้นของ AudioService
โซนหลัก
โดยค่าเริ่มต้น ระบบจะกำหนดเส้นทางเสียงทั้งหมดไปยังโซนหลัก โซนหลักจะมีได้เพียงโซนเดียว ซึ่งระบุไว้ในการกำหนดค่าด้วยแอตทริบิวต์ 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
สามารถใช้เพื่อกําหนดค่าการกำหนดเส้นทางตามรหัสผู้ใช้
หากต้องการใช้ช่องใหม่เหล่านี้ คุณต้องใช้ car_audio_configuration.xml
เวอร์ชัน 2 กลับไปดูการกำหนดค่าเสียงด้านบน แต่ใช้ช่องใหม่สำหรับการแมปรหัสโซนผู้อยู่อาศัยและรหัสโซนเสียง การกำหนดค่าใหม่ที่ไม่มีการกำหนดกลุ่มระดับเสียงจะตั้งค่าได้ดังนี้
<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
ของปี 2010 เพื่ออนุญาตให้แอปค้นหาและตั้งค่าโซนเสียงและโฟกัส
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"); }
ไม่ หมายเหตุ: สตรีมและโฟกัสจะสลับโซนแบบไดนามิกไม่ได้ ดังนั้นจึงต้องหยุดการเล่นและขอโฟกัสอีกครั้งเพื่อเปลี่ยนโซน
การกำหนดเส้นทางด้วยรหัสผู้ใช้
แม้ว่าการกำหนดเส้นทางตาม UID ของแอปพลิเคชันจะให้คุณควบคุมการกำหนดเส้นทางเสียงของแอปพลิเคชันแต่ละรายการได้อย่างละเอียด แต่ก็กำหนดให้ต้องกำหนดการกำหนดเส้นทางเสียงสำหรับแต่ละแอปพลิเคชันก่อนที่จะมีแอปพลิเคชันขอโฟกัสเสียงและเล่นเสียง CarAudioService
ใช้การแมปโซนผู้นั่งในรถและโซนเสียงเพื่อกำหนดการกำหนดเส้นทางตามรหัสผู้ใช้เพื่อลดปัญหานี้และอำนวยความสะดวกเพิ่มเติมในแอปพลิเคชันของบุคคลที่สามในการเล่นเสียงโดยไม่ต้องแก้ไข วิธีนี้ช่วยให้บริการเสียงของรถยนต์ได้รับการแจ้งเตือนเมื่อผู้ใช้เข้าสู่ระบบโซนคนนั่ง สัญญาณนี้จะทำให้ระบบกำหนดค่าการจัดการโฟกัสเสียงและการกำหนดเส้นทางโดยอัตโนมัติสำหรับโซนเสียงทั้งหมด
คุณยังคงใช้การกำหนดเส้นทางตาม UID ของแอปพลิเคชันได้ แต่จะต้องทำแยกจากการกําหนดเส้นทางตามรหัสผู้ใช้ ซึ่งหมายความว่าหากมีการกำหนดการแมปโซนผู้นั่งกับโซนเสียงของรถยนต์ ระบบจะปิดใช้การกำหนดเส้นทางตาม UID และพยายามเรียกใช้CarAudioManager#setZoneidForUid
จะแสดงข้อผิดพลาด
แม้ว่าการจัดการการกำหนดเส้นทางเสียงและโฟกัสจะง่ายขึ้นด้วยการจัดการโซนผู้โดยสาร แต่ผู้ใช้ยังคงต้องได้รับการกำหนดไปยังโซนผู้โดยสาร ซึ่งทำได้โดย
การใช้ CarOccupantZoneManager#assignProfileUserToOccupantZone
API นี้ต้องมีสิทธิ์ในการจัดการผู้ใช้ ปัจจุบัน OEM มีหน้าที่จัดการการกําหนดผู้ใช้ไปยังโซนผู้อยู่อาศัยผ่าน UI ของระบบ เมื่อดำเนินการเสร็จแล้ว ระบบจะกำหนดค่าการเปิดแอปพลิเคชัน การกำหนดเส้นทางเสียง และการจัดการโฟกัสให้กับผู้ใช้โดยอัตโนมัติ
การกำหนดเส้นทางด้วย setPreferredDevice
นอกจากการเปลี่ยนแปลงข้างต้นแล้ว Android 11 ยังมี API ใหม่สําหรับการค้นหาอุปกรณ์เอาต์พุตที่เชื่อมโยงกับแต่ละโซนด้วย ซึ่งก็คือ CarAudioManager#getOutputDeviceForUsage(int zoneId, int usage)
คุณสามารถใช้ API เพื่อค้นหาอุปกรณ์เอาต์พุตสำหรับโซนและการใช้แอตทริบิวต์เสียงที่เฉพาะเจาะจง วิธีนี้ช่วยให้แอปพลิเคชันของบุคคลที่หนึ่งสามารถกำหนดเส้นทางเสียงไปยังโซนต่างๆ ได้โดยใช้ setPreferredDevice
API ของโปรแกรมเล่น getOutputDeviceForUsage
API ต้องใช้ PERMISSION_CAR_CONTROL_AUDIO_SETTINGS
และเป็น API ของระบบ ด้านล่างนี้คือตัวอย่างการค้นหาอุปกรณ์สื่อสำหรับโซนหนึ่งๆ และการกำหนดเส้นทางไปยังอุปกรณ์นั้นโดยใช้ setPreferredDevice
API
audioZoneId = ... ; mediaDeviceInfo = mCarAudioManager .getOutputDeviceForUsage(audioZoneId, AudioAttributes.USAGE_MEDIA); … mPlayer.setPreferredDevice(mediaDeviceInfo);