บริการเครื่องเสียงรถยนต์ใช้นโยบายเสียงแบบไดนามิกของ Core Audio เพื่ออำนวยความสะดวกในการใช้งานในรถยนต์
แยกการเล่นเสียงสำหรับผู้โดยสารแต่ละคน เรียกว่าเสียงหลายโซน ซึ่งแต่ละโซนสามารถเล่นเสียงพร้อมกันได้
การกำหนดค่าโซนเสียงแบบไดนามิก
เสียงแคสต์โซนหลักของผู้โดยสาร
กระจกเครื่องเสียงผู้โดยสาร
ในแต่ละกรณีการใช้งาน บริการเครื่องเสียงรถยนต์จะใช้นโยบายเสียงแบบไดนามิกเพื่อกำหนดเส้นทางเสียงไปยังอุปกรณ์เอาต์พุตที่กำหนดโดยอัตโนมัติ
เสียงหลายโซน
เสียงแบบหลายโซนช่วยให้ผู้ใช้หลายคนสามารถโต้ตอบกับ AAOS ได้พร้อมกัน ชุดอุปกรณ์เอาต์พุตจะเชื่อมโยงกับโซน และแต่ละโซนจะรักษาโฟกัสเสียงและระดับเสียง ผู้โดยสารสามารถฟังเสียงของตนเองได้ในขณะที่คนขับฟังแหล่งอื่นในโซนหลัก (โดยทั่วไปคือห้องโดยสารหลัก)
สถาปัตยกรรมเสียงแบบหลายโซน
รูปที่ 1 สถาปัตยกรรมบริการเครื่องเสียงรถยนต์
โซนเครื่องเสียงรถยนต์เป็นนามธรรมของเอาต์พุตเสียง โฟกัสเสียง และการตั้งค่าเสียงอื่นๆ ซึ่งทั้งหมดนี้สามารถจัดการได้อย่างอิสระ เพื่อวัตถุประสงค์ในการกำหนดเส้นทาง แต่ละโซนจะถูกกำหนดเป็นชุดของอุปกรณ์บัสเอาต์พุตเสียงตามที่จัดเรียงไว้ในการกำหนดค่านโยบายเสียง อุปกรณ์จะแตกต่างกันไปตามคำจำกัดความของโซนเสียงแต่ละโซน ในรูปที่ 1 อุปกรณ์บัส 1 ถึง 5 อยู่ในโซนศูนย์ อุปกรณ์บัส 6 ถึง 8 อยู่ในโซนหนึ่ง และอุปกรณ์บัส 9 ถึง 11 อยู่ในโซนที่สอง
การกำหนดค่าเครื่องเสียงรถยนต์
โดยทั่วไป อุปกรณ์เอาต์พุตจะถูกกำหนดให้กับโซนเสียงเดียว แต่ละโซนเสียงถูกกำหนดไว้ใน car_audio_configuration.xml
ข้อมูลโค้ดต่อไปนี้แสดงการกำหนดค่าเครื่องเสียงรถยนต์สำหรับรูปที่ 1:
<carAudioConfiguration version="3">
<zones>
<zone name="Zone0" audioZneId="0" occupantZoneI="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
ยังกำหนดการแมปจากโซนผู้ใช้ไปยังจอแสดงผล อุปกรณ์ต่อพ่วงอื่นๆ และผู้ใช้เมื่อผู้ใช้เข้าสู่ระบบจอแสดงผล โซนเสียงมี:
รหัสโซนเสียงและรหัสโซนผู้ครอบครอง
- แมปโซนเสียงกับโซนผู้โดยสาร (ที่นั่ง จอแสดงผล และอุปกรณ์ต่อพ่วงอื่นๆ)
- แม็ป ID ผู้ใช้ที่กำหนดกับโซนเสียงเมื่อเข้าสู่ระบบ
รายการการกำหนดค่าเสียง การกำหนดค่าเสียงแต่ละรายการจะมีชุดกลุ่มระดับเสียง แต่ละกลุ่มวอลุ่มมีชุดอุปกรณ์บัสเสียง
เมื่อระดับเสียงเปลี่ยนไป อุปกรณ์เสียงทั้งหมดในกลุ่มจะถูกควบคุมในลักษณะเดียวกัน
อุปกรณ์เสียงแต่ละเครื่องจะได้รับการกำหนดรายการคุณลักษณะเสียง ข้อมูลนี้ใช้เพื่อสร้างนโยบายเสียงผสมกับแอตทริบิวต์เสียงที่กำหนดต่างกัน
การกำหนดค่านี้ช่วยให้สามารถกำหนดเส้นทางการใช้คุณลักษณะเสียงที่แตกต่างกันไปยังอุปกรณ์เอาต์พุตที่แตกต่างกันในแต่ละโซนได้ เสียงที่แตกต่างกันสามารถเล่นพร้อมกันได้ ขึ้นอยู่กับกรณีการใช้งาน ตัวอย่างเช่น คุณสามารถเลือกกำหนดค่าห้องโดยสารหลัก (โซนหลัก) ให้เล่นเสียงมีเดียบนลำโพงทุกตัว แต่เสียงการนำทางจะดังเฉพาะบนลำโพงที่อยู่ใกล้คนขับที่สุดเท่านั้น ด้วยการเล่นเสียงพร้อมกัน ห้องโดยสารหลักยังคงฟังสื่อในขณะที่ระบบนำทางถูกส่งไปยังคนขับ
เวิร์กโฟลว์การเข้าสู่ระบบผู้โดยสารเสียงแบบหลายโซน
แผนภาพลำดับด้านล่างแสดงขั้นตอนการเปิดใช้งานการกำหนดเส้นทางเสียงเมื่อผู้โดยสารล็อกอินเข้าสู่จอแสดงผลของตน:
รูปที่ 2.
ในลำดับนี้ การเข้าสู่ระบบของผู้ใช้จะเผยแพร่ไปยังบริการเครื่องเสียงรถยนต์ผ่านบริการโซนผู้โดยสาร
บริการเครื่องเสียงรถยนต์ (สำหรับโซนเสียงเฉพาะ) ใช้
AudioPolicy#removeUserIdDeviceAffinity
API เพื่อลบความเกี่ยวข้องของอุปกรณ์ของผู้ใช้ API นี้รับ ID ผู้ใช้ ในกรณีนี้คือผู้ใช้ของโซนก่อนหน้าAudioPolicy#setUserIdDeviceAffinity
API จะกำหนดผู้ใช้ใหม่ให้กับโซน ซึ่งรับ ID ผู้ใช้และอุปกรณ์ทั้งหมดสำหรับการกำหนดค่าโซนเฉพาะ
การกำหนดค่าโซนไดนามิก
ใน Android 14 มีการนำการกำหนดค่าโซนไดนามิกมาใช้เพื่อให้ OEM สามารถกำหนดค่าชุดอุปกรณ์ต่างๆ สำหรับผู้โดยสารได้ กรณีการใช้งานช่วยให้ผู้โดยสารในเบาะหลังสามารถสลับระหว่างลำโพงพนักพิงศีรษะของเบาะหลังและอุปกรณ์ต่อพ่วงหูฟังของเบาะหลังได้
ในกรณีนี้ จำเป็นต้องมีการกำหนดค่าสองรายการ อย่างละหนึ่งอันสำหรับพนักพิงศีรษะของเบาะหลังและอุปกรณ์ต่อพ่วงหูฟัง เสียงสำหรับผู้ใช้เฉพาะจะถูกส่งไปยังการกำหนดค่าครั้งละหนึ่งรายการ เท่านั้น
รูปที่ 3 เวิร์กโฟลว์การกำหนดค่าโซนไดนามิก
รูปที่ 3 แสดงสถาปัตยกรรมสำหรับเวิร์กโฟลว์การกำหนดค่าโซนไดนามิก โซนเสียง 1 มีการกำหนดค่าสองแบบ คือ Config 0
และ Config 1
ซึ่งเชื่อมโยงกับลำโพงของอุปกรณ์เอาต์พุตและพนักพิงศีรษะ ตามลำดับ
เมื่อเข้าสู่ระบบ ผู้ใช้จะได้รับการกำหนดค่าเริ่มต้นโดยอัตโนมัติ เมื่อผู้ใช้เลือกที่จะเปลี่ยนการกำหนดค่า ซึ่งโดยปกติจะผ่านทาง UI ของระบบ บริการเครื่องเสียงรถยนต์จะดำเนินการสลับระหว่างการกำหนดค่าทั้งสอง ด้วยวิธีนี้ อุปกรณ์เอาต์พุตจะสลับระหว่างลำโพง 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 จะเปิดเผยทั้งสองให้ผู้โดยสารเห็น ผู้ใช้สามารถเลือกการกำหนดค่าอื่นได้โดยการแตะคำสั่งสำหรับการกำหนดค่าที่ต้องการ
รูปที่ 4 เวิร์กโฟลว์การกำหนดค่าโซนไดนามิก
เครื่องเสียงผู้โดยสารโซนหลัก
การแคสต์เสียงผู้โดยสารโซนหลักเป็นฟีเจอร์ที่เปิดตัวใน Android 14 เพื่อให้ผู้โดยสารแคสต์เสียงสื่อของตนในโซนหลักได้ ในลักษณะนี้ เสียงสื่อของผู้โดยสารสามารถส่งไปยังห้องโดยสารหลักได้ในขณะที่คนขับยังคงควบคุมได้อย่างเต็มที่
รูปด้านล่างแสดงสถาปัตยกรรมเวอร์ชันที่เรียบง่ายสำหรับสื่อเสียงสำหรับผู้โดยสารโซนหลัก
รูปที่ 5 เวิร์กโฟลว์การกำหนดค่าโซนไดนามิก
รูปภาพแสดงให้เห็นว่าอุปกรณ์ส่งออกสื่อสำหรับคนขับแชร์กับผู้โดยสาร ซึ่งจะเกิดขึ้นเฉพาะในขณะที่ผู้โดยสารอยู่ในโหมดแคสต์ไปยังโหมดโซนหลัก นโยบายเสียงไดนามิกยังใช้เพื่อจัดการการกำหนดเส้นทางเสียงสำหรับไดรเวอร์ แต่ไม่มีการเปลี่ยนแปลงใด ๆ กับความเกี่ยวข้องของอุปกรณ์สำหรับไดรเวอร์ สำหรับผู้โดยสาร รายการอุปกรณ์เอาท์พุตจะมีการเปลี่ยนแปลงดังนี้:
- อุปกรณ์ส่งสัญญาณสื่อสำหรับผู้โดยสารจะถูกลบออกจากรายการอุปกรณ์
- อุปกรณ์เอาท์พุตมีเดียสำหรับไดรเวอร์ถูกเพิ่มเข้าไปในรายการอุปกรณ์
- อุปกรณ์เอาต์พุตที่เหลือสำหรับโซนเสียงผู้โดยสารจะยังคงอยู่ในรายการอุปกรณ์
รายการอุปกรณ์ใหม่นี้ถูกกำหนดให้กับผู้โดยสารโดย AudioPolicy#setUserIdDeviceAffinity
API พารามิเตอร์ที่ส่งไปยัง API คือรายการอุปกรณ์และ ID ผู้ใช้ผู้โดยสาร เมื่อบริการนโยบายเสียงของระบบเสียงสอบถามว่าจะเลือกมิกซ์เสียงใดสำหรับแทร็กสื่อที่เชื่อมโยงกับผู้โดยสาร ระบบจะเลือกมิกซ์เสียงของสื่อที่เชื่อมโยงกับโซนหลัก
ข้อกำหนดหลักสำหรับการแคสต์เสียงในโซนหลักคืออุปกรณ์เอาต์พุตมีเดียของโซนหลักต้องแยกออกจากการใช้งานคุณลักษณะเสียงอื่นๆ มิฉะนั้น ในระหว่างการสร้างมิกซ์เสียง คุณลักษณะเสียงอื่นๆ จะถูกเพิ่มเข้าไปในมิกซ์ เมื่อระบบเสียงทำการเลือกมิกซ์ เสียงทั้งหมดที่เชื่อมต่อกับมิกซ์จะถูกเลือกเพื่อเล่นในห้องโดยสารหลัก
กระจกปรับเสียงโซนผู้โดยสาร
คุณสมบัติกระจกเสียงช่วยให้ผู้โดยสารสามารถแบ่งปันเสียงได้ คุณสมบัติกระจกจะทำซ้ำข้อมูลเสียงในแต่ละโซนเสียง เพื่อให้ผู้โดยสารทุกคนสามารถฟังเสียงเดียวกันได้ ในกรณีนี้ โฟกัสเสียงจะถูกแชร์กับผู้โดยสารที่เกี่ยวข้องกับการสะท้อนเสียง
การกำหนดเส้นทางมิเรอร์เสียง
จำเป็นต้องมีผู้โดยสารอย่างน้อยสองคนเพื่อเปิดใช้งานการสะท้อนเสียง ด้วยเหตุนี้ การกำหนดค่าเสียงที่มีโซนเสียงผู้โดยสารเพียง 2 โซนจึงต้องใช้อุปกรณ์เอาต์พุตมิเรอร์หนึ่งตัว ด้วยคำจำกัดความข้างต้น คุณสามารถเริ่มเซสชันการมิเรอร์พร้อมกันสองเซสชันได้
รูปด้านล่างแสดงแผนผังอย่างง่ายสำหรับการจำลองเสียงแบบหลายโซนระหว่างผู้โดยสารสองคน เสียงจากผู้โดยสารทั้งสองจะถูกส่งไปยังอุปกรณ์มิเรอร์เสียง bus_1000
Audio HAL จำลองสัญญาณไปยังโซนต้นทาง
รูปที่ 6 เวิร์กโฟลว์การกำหนดค่าโซนไดนามิก
การกำหนดเส้นทางนี้จะเปิดใช้งาน เฉพาะ เมื่อผู้โดยสารอยู่ในโหมดมิเรอร์ ถ้าไม่เช่นนั้น อุปกรณ์ที่เกี่ยวข้องสำหรับโซนเสียงจะถูกกำหนดให้กับผู้โดยสาร เมื่อเปิดใช้งานการมิเรอร์เป็นครั้งแรกสำหรับผู้โดยสาร AudioPolicy#setUserIdDeviceAffinity
API จะแก้ไขเส้นทาง:
- อุปกรณ์ส่งสัญญาณสื่อสำหรับผู้โดยสารจะถูกลบออกจากรายการอุปกรณ์
- เพิ่มอุปกรณ์เอาท์พุตมิเรอร์ในรายการอุปกรณ์แล้ว
- อุปกรณ์เอาต์พุตที่เหลือสำหรับโซนเสียงผู้โดยสารจะยังคงอยู่ในรายการอุปกรณ์
ด้วยรายการอุปกรณ์ API จะถูกเรียกพร้อมกับรายการอุปกรณ์ที่อัปเดตและ ID ผู้ใช้ของผู้โดยสาร รูปภาพต่อไปนี้แสดงไดอะแกรมลำดับของเวิร์กโฟลว์มิเรอร์เสียง
รูปที่ 7 เวิร์กโฟลว์มิเรอร์เสียง
ในรูปที่ 7 API ของตัวจัดการเครื่องเสียงรถยนต์สำหรับจัดการการมิเรอร์เสียงจะถูกเรียกจากบริการระบบสื่อ โดยเฉพาะ API เพื่อเปิดใช้งานการมิเรอร์เสียงสำหรับผู้ใช้ 1 และผู้ใช้ 2, CarAudioManager#enableMirrorForAudioZones
บริการเครื่องเสียงรถยนต์จะกำหนดค่าเส้นทางเสียงสำหรับผู้โดยสารของผู้ใช้ตามที่อธิบายไว้ข้างต้น บริการเครื่องเสียงรถยนต์ยังส่งสัญญาณไปยังเสียง HAL เพื่อกำหนดค่าและทำซ้ำเสียงจากอุปกรณ์มิเรอร์ไปยังโซนที่เกี่ยวข้อง
ในภาพด้านบน บริการเครื่องเสียงรถยนต์จะส่ง mirroring_src=bus_1000;mirroring_dest=bus_10,bus_20
ที่ไหน,
bus_1000
เป็นบัสต้นทาง และ bus_10
และ bus_20
เป็นบัสปลายทาง
สิ่งที่ไม่แสดงในแผนภาพลำดับคือสัญญาณที่ส่งผ่าน AudioManager#setParameters
API ซึ่งเข้าถึง HAL ผ่านบริการเสียง
เมื่อปิดการใช้งานมิเรอร์เสียง สัญญาณต่อไปนี้จะถูกส่งไป mirroring_src=bus_1000;mirroring=off
HAL สามารถใช้สัญญาณนี้เพื่อปิดใช้งานการทำสำเนาเสียงเมื่อไม่ได้เปิดใช้งานการมิเรอร์เสียง ในการกำหนดอุปกรณ์มิเรอร์เสียง ไฟล์การกำหนดค่าเครื่องเสียงรถยนต์มีส่วนชื่อ mirroringDevices
ดังที่แสดงในตัวอย่างด้านล่าง
ในตัวอย่างนี้มีการกำหนดอุปกรณ์มิเรอร์สองตัวคือ bus_1000
และ bus_2000
เพื่อให้ผู้โดยสารสี่คนสามารถใช้การมิเรอร์เสียงได้
<carAudioConfiguration version="3">
<mirroringDevices>
<mirroringDevice address="bus_1000"/>
<mirroringDevice address="bus_2000"/>
</mirroringDevices>
<zones>
....
</zones>
</carAudioConfiguration>