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

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