การกำหนดเส้นทางเสียงแบบหลายโซน

บริการเครื่องเสียงรถยนต์ใช้นโยบายเสียงแบบไดนามิกของ 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.

ในลำดับนี้ การเข้าสู่ระบบของผู้ใช้จะเผยแพร่ไปยังบริการเครื่องเสียงรถยนต์ผ่านบริการโซนผู้โดยสาร

  1. บริการเครื่องเสียงรถยนต์ (สำหรับโซนเสียงเฉพาะ) ใช้ AudioPolicy#removeUserIdDeviceAffinity API เพื่อลบความเกี่ยวข้องของอุปกรณ์ของผู้ใช้ API นี้รับ ID ผู้ใช้ ในกรณีนี้คือผู้ใช้ของโซนก่อนหน้า

  2. 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>