บริการเสียงในรถยนต์ใช้นโยบายเสียงแบบไดนามิกของ Core Audio เพื่ออำนวยความสะดวกในการใช้ เคสในรถยนต์
การเล่นเสียงแยกกันสำหรับผู้โดยสารแต่ละคน ซึ่งเรียกว่าเสียงแบบหลายโซน ซึ่งแต่ละโซนจะอนุญาตให้เล่นเสียงพร้อมกันได้
การกำหนดค่าโซนเสียงแบบไดนามิก
การออกอากาศเสียงในโซนหลักของผู้โดยสาร
มิเรอร์เสียงของผู้โดยสาร
ในแต่ละกรณีการใช้งาน บริการเสียงในรถยนต์จะใช้นโยบายเสียงแบบไดนามิกเพื่อ กำหนดเส้นทางเสียงไปยังอุปกรณ์เอาต์พุตที่กำหนดโดยอัตโนมัติ
เสียงแบบมัลติโซน
ระบบเสียงแบบหลายโซนช่วยให้ผู้ใช้หลายคนโต้ตอบกับ 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
ยังกำหนด
การแมปจากโซนผู้ใช้ไปยังจอแสดงผล อุปกรณ์ต่อพ่วงอื่นๆ และผู้ใช้เมื่อ
ผู้ใช้เข้าสู่ระบบจอแสดงผลด้วย โซนเสียงมีลักษณะดังนี้
รหัสโซนเสียงและรหัสโซนผู้โดยสาร
- แมปโซนเสียงของ Maps กับโซนของผู้โดยสาร (ที่นั่ง จอแสดงผล และอุปกรณ์ต่อพ่วงอื่นๆ)
- แมปว่าระบบกำหนด User-ID ใดให้กับโซนเสียงเมื่อเข้าสู่ระบบ
รายการการกำหนดค่าเสียง การกำหนดค่าเสียงแต่ละรายการมีชุดกลุ่มระดับเสียง กลุ่มระดับเสียงแต่ละกลุ่มมีชุดอุปกรณ์บัสเสียง
เมื่อมีการเปลี่ยนแปลงระดับเสียง ระบบจะควบคุมอุปกรณ์เสียงทั้งหมดในกลุ่มในลักษณะเดียวกัน
ระบบจะกำหนดรายการแอตทริบิวต์เสียงให้กับอุปกรณ์เสียงแต่ละเครื่อง ระบบจะใช้ข้อมูลนี้เพื่อสร้างมิกซ์นโยบายเสียงที่มีแอตทริบิวต์เสียงที่กำหนดค่าแตกต่างกัน
การกำหนดค่านี้ช่วยให้สามารถกำหนดเส้นทางการใช้งานแอตทริบิวต์เสียงต่างๆ ไปยัง อุปกรณ์เอาต์พุตที่แตกต่างกันในแต่ละโซน เสียงต่างๆ สามารถเล่นพร้อมกันได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน เช่น คุณสามารถเลือกกำหนดค่าห้องโดยสารหลัก (โซนหลัก) ให้เล่นเสียงสื่อในลำโพงทั้งหมด แต่ให้เล่นเสียงนำทางเฉพาะในลำโพงที่อยู่ใกล้คนขับมากที่สุด เมื่อเล่นเสียงพร้อมกัน ห้องโดยสารหลักจะยังคงฟังสื่อต่อไปขณะที่ระบบนำทางจะส่งไปยัง ผู้ขับ
เวิร์กโฟลว์การเข้าสู่ระบบของผู้โดยสารที่มีเสียงหลายโซน
แผนภาพลำดับด้านล่างแสดงขั้นตอนการเปิดใช้การกำหนดเส้นทางเสียงเมื่อ ผู้โดยสารเข้าสู่ระบบจอแสดงผลของตน
รูปที่ 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
Audio 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
ที่ไหน
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>