บริการเสียงรถยนต์ใช้นโยบายเสียงแบบไดนามิกของ Core Audio เพื่ออำนวยความสะดวกในการใช้งานในรถยนต์
การเล่นเสียงแยกกันสำหรับผู้โดยสารแต่ละคน ซึ่งเรียกว่าเสียงแบบหลายโซน โดยแต่ละโซนจะอนุญาตให้เล่นเสียงพร้อมกันได้
การกำหนดค่าโซนเสียงแบบไดนามิก
แคสต์เสียงโซนหลักสำหรับผู้โดยสาร
มิเรอร์เสียงของผู้โดยสาร
ในแต่ละ Use Case บริการเสียงรถยนต์จะใช้นโยบายเสียงแบบไดนามิกเพื่อกำหนดเส้นทางเสียงไปยังอุปกรณ์เอาต์พุตที่กําหนดโดยอัตโนมัติ
เสียงแบบหลายโซน
เสียงหลายโซนช่วยให้ผู้ใช้หลายคนโต้ตอบกับ AAOS ได้พร้อมกัน ชุดอุปกรณ์เอาต์พุตจะเชื่อมโยงกับโซน และแต่ละโซนจะรักษาโฟกัสเสียงและระดับเสียงไว้ โดยผู้โดยสารจะฟังเสียงได้ขณะที่คนขับฟังแหล่งที่มาอื่นในโซนหลัก (โดยปกติคือห้องโดยสารหลัก)
สถาปัตยกรรมเสียงแบบหลายโซน
รูปที่ 1 สถาปัตยกรรมบริการเสียงรถยนต์
โซนเสียงของรถยนต์เป็นแนวคิดนามธรรมของเอาต์พุตเสียง โฟกัสเสียง และการตั้งค่าเสียงอื่นๆ ซึ่งทั้งหมดนี้จัดการแยกกันได้ สำหรับการกําหนดเส้นทาง แต่ละโซนจะหมายถึงชุดอุปกรณ์บัสเอาต์พุตเสียงตามที่จัดเรียงไว้ในการกำหนดค่านโยบายเสียง อุปกรณ์แต่ละเครื่องจะมีการกำหนดโซนเสียงแตกต่างกัน ในรูปที่ 1 อุปกรณ์บัส 1 ถึง 5 อยู่ในโซน 0, อุปกรณ์บัส 6 ถึง 8 อยู่ในโซน 1 และอุปกรณ์บัส 9 ถึง 11 อยู่ในโซน 2
การกำหนดค่าระบบเสียงของรถยนต์
โดยทั่วไปแล้ว อุปกรณ์เอาต์พุตจะกำหนดให้กับโซนเสียง 1 โซน โซนเสียงแต่ละโซนจะกำหนดไว้ใน car_audio_configuration.xml
ข้อมูลโค้ดต่อไปนี้แสดงการกำหนดค่าเสียงรถยนต์สำหรับรูปที่ 1
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneId="0">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGoups>
<group>
<device address="bus_1">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_2">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="config0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_6">
<context context="music"/>
</device>
</group>
<group>
<device address="bus_7">
<context context="navigation"/>
</device>
</group>
...
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
...
...
</zones>
</carAudioConfiguration>
occupantZoneId
เป็นคำจำกัดความของบริการรถยนต์ที่จัดการโดย
CarOccupantZoneManager
ซึ่งใช้ในรถยนต์เพื่อกำหนดการแมปผู้ใช้ในรถไปยังตำแหน่งที่นั่งที่เฉพาะเจาะจง CarOccupantZoneService
ยังกำหนดการแมปจากโซนผู้อยู่อาศัยไปยังจอแสดงผล อุปกรณ์ต่อพ่วงอื่นๆ และผู้ใช้เมื่อผู้ใช้เข้าสู่ระบบจอแสดงผล โซนเสียงมีสิ่งต่อไปนี้
รหัสโซนเสียงและรหัสโซนคนอยู่
- จับคู่โซนเสียงกับโซนผู้นั่ง (ที่นั่ง จอแสดงผล และอุปกรณ์ต่อพ่วงอื่นๆ)
- จับคู่รหัสผู้ใช้ที่กำหนดให้กับโซนเสียงเมื่อเข้าสู่ระบบ
รายการการกำหนดค่าเสียง การกำหนดค่าเสียงแต่ละรายการจะมีชุดกลุ่มระดับเสียง กลุ่มระดับเสียงแต่ละกลุ่มจะมีชุดอุปกรณ์บัสเสียง
เมื่อเปลี่ยนระดับเสียง ระบบจะควบคุมอุปกรณ์เสียงทั้งหมดในกลุ่มในลักษณะเดียวกัน
อุปกรณ์เสียงแต่ละเครื่องจะได้รับการกำหนดรายการแอตทริบิวต์เสียง ระบบจะใช้ข้อมูลนี้เพื่อสร้างการผสมผสานนโยบายเสียงที่มีแอตทริบิวต์เสียงที่กําหนดไว้แตกต่างกัน
การกำหนดค่านี้ช่วยให้สามารถกำหนดเส้นทางการใช้แอตทริบิวต์เสียงที่แตกต่างกันไปยังอุปกรณ์เอาต์พุตที่แตกต่างกันในแต่ละโซนได้ เสียงต่างๆ อาจเล่นพร้อมกันได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน ตัวอย่างเช่น คุณอาจเลือกกำหนดค่าห้องโดยสารหลัก (โซนหลัก) ให้เล่นเสียงสื่อในลำโพงทั้งหมด แต่ให้เล่นเสียงการนำทางในลำโพงที่ใกล้คนขับที่สุดเท่านั้น เมื่อเล่นเสียงพร้อมกัน ผู้โดยสารในห้องโดยสารหลักจะฟังสื่อต่อไปได้ขณะที่ระบบนำทางส่งข้อมูลไปยังคนขับ
เวิร์กโฟลว์การลงชื่อเข้าใช้ของผู้โดยสารสำหรับระบบเสียงแบบหลายโซน
แผนภาพลำดับด้านล่างแสดงขั้นตอนการเปิดใช้การกำหนดเส้นทางเสียงเมื่อผู้โดยสารเข้าสู่ระบบจอแสดงผลที่เกี่ยวข้อง
รูปที่ 2
ในลำดับนี้ ระบบจะส่งต่อการเข้าสู่ระบบของผู้ใช้ไปยังบริการเสียงของรถยนต์ผ่านบริการโซนคนนั่ง
บริการเสียงของรถยนต์ (สําหรับโซนเสียงที่เฉพาะเจาะจง) ใช้
AudioPolicy#removeUserIdDeviceAffinity
API เพื่อนําความเกี่ยวข้องของอุปกรณ์ผู้ใช้ออก API นี้ใช้รหัสผู้ใช้ ในกรณีนี้คือผู้ใช้ของโซนก่อนหน้าAudioPolicy#setUserIdDeviceAffinity
API จะกำหนดผู้ใช้ใหม่ไปยังโซน ซึ่งจะรับรหัสผู้ใช้และอุปกรณ์ทั้งหมดสำหรับการกำหนดค่าโซนหนึ่งๆ
การกําหนดค่าโซนแบบไดนามิก
ใน Android 14 จะมีการเปิดตัวการกำหนดค่าโซนแบบไดนามิกเพื่อให้ OEM กำหนดค่าอุปกรณ์ชุดต่างๆ สำหรับผู้โดยสารได้ กรณีการใช้งานนี้ช่วยให้ผู้โดยสารเบาะหลังสลับระหว่างลำโพงบนพนักพิงศีรษะเบาะหลังกับอุปกรณ์ต่อพ่วงหูฟังเบาะหลังได้
ในกรณีนี้ คุณต้องกำหนดค่า 2 รายการ 1 รายการสำหรับพนักพิงศีรษะของเบาะหลังและอุปกรณ์ต่อพ่วงหูฟัง ระบบจะกำหนดเส้นทางเสียงของผู้ใช้ที่เฉพาะเจาะจงไปยังการกำหนดค่ารายการเดียวเท่านั้นในแต่ละครั้ง
รูปที่ 3 เวิร์กโฟลว์การกำหนดค่าโซนแบบไดนามิก
รูปที่ 3 แสดงสถาปัตยกรรมสำหรับเวิร์กโฟลว์การกำหนดค่าโซนแบบไดนามิก โซนเสียง 1 มีการกําหนดค่า 2 รายการ ได้แก่ Config 0
และ Config 1
ซึ่งเชื่อมโยงกับลําโพงและพนักศีรษะของอุปกรณ์เอาต์พุตตามลําดับ
เมื่อเข้าสู่ระบบ ผู้ใช้จะได้รับการกำหนดค่าเริ่มต้นโดยอัตโนมัติ เมื่อผู้ใช้เลือกที่จะเปลี่ยนการกำหนดค่า ซึ่งโดยปกติแล้วจะทำผ่าน UI ของระบบ บริการเสียงรถยนต์จะดำเนินการสลับระหว่างการกำหนดค่า 2 รูปแบบ วิธีนี้จะเป็นการสลับอุปกรณ์เอาต์พุตระหว่างลำโพง Z1 กับพนักพิงศีรษะ Z1
ข้อมูลโค้ดด้านล่างแสดงการตั้งค่าสําหรับการกําหนดค่าโซนแบบไดนามิกนี้
<carAudioConfiguration version="3">
<zones>
<zone name="Zone1" audioZoneId="1" occupantZoneId="1">
<zoneConfigs>
<zoneConfig name="Zone 1 Config 0" isDefault="true">
<volumeGroups>
<group>
<device address="bus_100">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
<zoneConfig name="Zone 1 Config 1">
<volumeGroups>
<group>
<device address="bus_101">
<context context="music"/>
***
</device>
</group>
</volumeGroups>
</zoneConfig>
</zoneConfigs>
</zone>
</zones>
ผู้จัดการเสียงรถยนต์จะแสดง API เพื่อจัดการการกําหนดค่าต่อไปนี้เพื่ออำนวยความสะดวกในการจัดการการกําหนดค่าเสียง
- การกําหนดค่าการค้นหาที่ใช้ได้กับโซน
- ค้นหาการกําหนดค่าที่กําหนดไว้ในปัจจุบันสําหรับโซน
- เปลี่ยนไปใช้การกำหนดค่าอื่น
แอปหรือบริการ UI ของระบบสามารถใช้ API เหล่านี้เพื่อจัดการการกำหนดค่าสำหรับโซนเสียงดังที่แสดงในรูปที่ 4 Query API จะแสดงข้อมูลทั้ง 2 รายการต่อผู้โดยสาร ผู้ใช้สามารถเลือกการกำหนดค่าอื่นได้โดยแตะคำสั่งสำหรับการกำหนดค่าที่ต้องการ
รูปที่ 4 เวิร์กโฟลว์การกำหนดค่าโซนแบบไดนามิก
แคสต์เสียงสำหรับผู้โดยสารในโซนหลัก
การแคสต์เสียงสำหรับผู้โดยสารในโซนหลักเป็นฟีเจอร์ที่เปิดตัวใน Android 14 เพื่ออนุญาตให้ผู้โดยสารแคสต์เสียงสื่อในโซนหลัก วิธีนี้ช่วยให้สามารถแคสต์เสียงสื่อของผู้โดยสารไปยังห้องโดยสารหลักได้ ขณะที่ผู้ขับขี่ยังคงควบคุมได้อย่างเต็มที่
รูปภาพด้านล่างแสดงสถาปัตยกรรมเวอร์ชันที่เรียบง่ายสำหรับการแคสต์เสียงสื่อของผู้โดยสารในโซนหลัก
รูปที่ 5 เวิร์กโฟลว์การกำหนดค่าโซนแบบไดนามิก
รูปภาพแสดงว่าอุปกรณ์เอาต์พุตสื่อสำหรับผู้ขับขี่มีการแชร์กับผู้โดยสาร ซึ่งจะเกิดขึ้นเฉพาะในขณะที่ผู้โดยสารอยู่ในโหมดแคสต์ไปยังโซนหลักเท่านั้น นอกจากนี้ นโยบายเสียงแบบไดนามิกยังใช้เพื่อจัดการการกำหนดเส้นทางเสียงสำหรับผู้ขับขี่ด้วย แต่จะไม่มีการเปลี่ยนแปลงความเกี่ยวข้องของอุปกรณ์สำหรับผู้ขับขี่ สำหรับผู้โดยสาร รายการอุปกรณ์เอาต์พุตจะเปลี่ยนแปลงดังนี้
- นำอุปกรณ์เอาต์พุตสื่อสำหรับผู้โดยสารออกจากรายการอุปกรณ์
- ระบบจะเพิ่มอุปกรณ์เอาต์พุตสื่อสำหรับไดรเวอร์ลงในรายการอุปกรณ์
- อุปกรณ์เอาต์พุตที่เหลือสำหรับโซนเสียงสำหรับผู้โดยสารจะยังคงอยู่ในรายการอุปกรณ์
รายการอุปกรณ์ใหม่นี้กำหนดให้กับผู้โดยสารโดย AudioPolicy#setUserIdDeviceAffinity
API พารามิเตอร์ที่ส่งไปยัง API คือรายการอุปกรณ์และรหัสผู้ใช้ผู้โดยสาร เมื่อบริการนโยบายเสียงของระบบเสียงค้นหาว่าควรเลือกการผสมเสียงใดสำหรับแทร็กสื่อที่เชื่อมโยงกับผู้โดยสาร ระบบจะเลือกการผสมเสียงสื่อที่เชื่อมโยงกับโซนหลัก
ข้อกำหนดหลักสำหรับการแคสต์เสียงของโซนหลักคืออุปกรณ์เอาต์พุตสื่อของโซนหลักต้องแยกออกจากการใช้แอตทริบิวต์เสียงอื่นๆ มิเช่นนั้น ระบบจะเพิ่มแอตทริบิวต์เสียงอื่นๆ ลงในมิกซ์ระหว่างการสร้างมิกซ์เสียง เมื่อระบบเสียงทำการเลือกมิกซ์ ระบบจะเลือกเสียงทั้งหมดที่แนบมากับมิกซ์นั้นเพื่อเล่นในห้องโดยสารหลัก
มิเรอร์เสียงสำหรับผู้โดยสาร
ฟีเจอร์มิเรอร์เสียงช่วยให้ผู้โดยสารแชร์เสียงได้ ฟีเจอร์มิเรอร์จะคัดลอกข้อมูลเสียงในแต่ละโซนเสียงเพื่อให้ผู้โดยสารทุกคนฟังเสียงเดียวกันได้ ในกรณีนี้ ระบบจะแชร์โฟกัสเสียงกับผู้โดยสารที่ร่วมมิเรอร์เสียง
การกำหนดเส้นทางมิเรอร์เสียง
ต้องมีผู้โดยสารอย่างน้อย 2 คนเพื่อเปิดใช้การมิเรอร์เสียง ด้วยเหตุนี้ การกำหนดค่าเสียงที่มีโซนเสียงสำหรับผู้โดยสารเพียง 2 โซนจึงต้องใช้อุปกรณ์เอาต์พุตมิเรอร์ 1 เครื่อง เมื่อใช้คําจํากัดความข้างต้น คุณจะเริ่มต้นเซสชันการมิเรอร์พร้อมกันได้ 2 รายการ
รูปภาพด้านล่างแสดงแผนภาพแบบง่ายสำหรับการมิเรอร์เสียงแบบหลายโซนระหว่างผู้โดยสาร 2 คน ระบบจะส่งเสียงจากผู้โดยสารทั้ง 2 คนไปยังอุปกรณ์มิเรอร์เสียง bus_1000
HAL เสียงจะคัดลอกสัญญาณไปยังโซนแหล่งที่มา
รูปที่ 6 เวิร์กโฟลว์การกำหนดค่าโซนแบบไดนามิก
ระบบจะเปิดใช้การกำหนดเส้นทางนี้เฉพาะเมื่อผู้โดยสารอยู่ในโหมดมิเรอร์เท่านั้น หากไม่ได้เลือก อุปกรณ์ที่เกี่ยวข้องสำหรับโซนเสียงจะกำหนดให้กับผู้โดยสาร
เมื่อเปิดใช้การมิเรอร์เป็นครั้งแรกสำหรับผู้โดยสาร
AudioPolicy#setUserIdDeviceAffinity
API จะแก้ไขการกำหนดเส้นทาง ดังนี้
- ระบบนำอุปกรณ์เอาต์พุตสื่อสำหรับผู้โดยสารออกจากรายการอุปกรณ์
- เพิ่มอุปกรณ์เอาต์พุตมิเรอร์ลงในรายการอุปกรณ์
- อุปกรณ์เอาต์พุตที่เหลือสำหรับโซนเสียงผู้โดยสารจะยังคงอยู่ในรายการอุปกรณ์
เมื่อใช้รายการอุปกรณ์ ระบบจะเรียก API ด้วยรายการอุปกรณ์ที่อัปเดตแล้วและรหัสผู้ใช้ของผู้โดยสาร รูปภาพต่อไปนี้แสดงผังลำดับเวิร์กโฟลว์การมิเรอร์เสียง
รูปที่ 7 เวิร์กโฟลว์การมิเรอร์เสียง
ในรูปที่ 7 ระบบเรียก API ของเครื่องมือจัดการเสียงของรถสำหรับการจัดการการมิเรอร์เสียงจากบริการระบบสื่อ กล่าวโดยละเอียดคือ API เพื่อเปิดใช้การมิเรอร์เสียงสำหรับผู้ใช้ 1 และผู้ใช้ 2, CarAudioManager#enableMirrorForAudioZones
บริการเสียงรถยนต์จะกำหนดค่าการกำหนดเส้นทางเสียงสำหรับผู้โดยสารตามที่อธิบายไว้ข้างต้น บริการเสียงของรถยนต์จะส่งสัญญาณไปยัง HAL เสียงเพื่อกำหนดค่าและคัดลอกเสียงจากอุปกรณ์มิเรอร์ไปยังโซนที่เกี่ยวข้องด้วย
ในรูปภาพด้านบน บริการเสียงรถยนต์จะส่ง
mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20
where
bus_1000
คือรถบัสต้นทาง และ bus_10
และ bus_20
คือรถบัสปลายทาง
สัญญาณที่ส่งผ่าน AudioManager#setParameters
API ซึ่งไปถึง HAL ผ่านบริการเสียงจะไม่แสดงในผังลำดับการทำงาน
เมื่อปิดใช้การมิเรอร์เสียง ระบบจะส่งสัญญาณต่อไปนี้
mirroring_src=bus_1000;mirroring=off
HAL สามารถใช้สัญญาณนี้เพื่อปิดใช้การคัดลอกเสียงเมื่อไม่ได้เปิดใช้การมิเรอร์เสียง หากต้องการกำหนดอุปกรณ์มิเรอร์เสียง ไฟล์การกำหนดค่าเสียงของรถยนต์จะมีส่วนที่มีชื่อว่า mirroringDevices
ดังที่แสดงในข้อมูลโค้ดด้านล่าง
ในข้อมูลโค้ดนี้ มีการกําหนดอุปกรณ์มิเรอร์ 2 เครื่อง ได้แก่ bus_1000
และ bus_2000
เพื่อให้ผู้โดยสาร 4 คนใช้การมิเรอร์เสียงได้
<carAudioConfiguration version="3">
<mirroringDevices>
<mirroringDevice address="bus_1000"/>
<mirroringDevice address="bus_2000"/>
</mirroringDevices>
<zones>
....
</zones>
</carAudioConfiguration>