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

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

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

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

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