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

บริการเสียงรถยนต์ใช้นโยบายเสียงแบบไดนามิกของ Core Audio เพื่ออำนวยความสะดวกในการใช้งานในรถยนต์

  • การเล่นเสียงแยกกันสำหรับผู้โดยสารแต่ละคน ซึ่งเรียกว่าเสียงแบบหลายโซน โดยแต่ละโซนจะอนุญาตให้เล่นเสียงพร้อมกันได้

  • การกำหนดค่าโซนเสียงแบบไดนามิก

  • แคสต์เสียงโซนหลักสำหรับผู้โดยสาร

  • มิเรอร์เสียงของผู้โดยสาร

ในแต่ละ Use Case บริการเสียงรถยนต์จะใช้นโยบายเสียงแบบไดนามิกเพื่อกำหนดเส้นทางเสียงไปยังอุปกรณ์เอาต์พุตที่กําหนดโดยอัตโนมัติ

เสียงแบบหลายโซน

เสียงหลายโซนช่วยให้ผู้ใช้หลายคนโต้ตอบกับ 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 ยังกำหนดการแมปจากโซนผู้อยู่อาศัยไปยังจอแสดงผล อุปกรณ์ต่อพ่วงอื่นๆ และผู้ใช้เมื่อผู้ใช้เข้าสู่ระบบจอแสดงผล โซนเสียงมีสิ่งต่อไปนี้

  • รหัสโซนเสียงและรหัสโซนคนอยู่

    • จับคู่โซนเสียงกับโซนผู้นั่ง (ที่นั่ง จอแสดงผล และอุปกรณ์ต่อพ่วงอื่นๆ)
    • จับคู่รหัสผู้ใช้ที่กำหนดให้กับโซนเสียงเมื่อเข้าสู่ระบบ
  • รายการการกำหนดค่าเสียง การกำหนดค่าเสียงแต่ละรายการจะมีชุดกลุ่มระดับเสียง กลุ่มระดับเสียงแต่ละกลุ่มจะมีชุดอุปกรณ์บัสเสียง

    • เมื่อเปลี่ยนระดับเสียง ระบบจะควบคุมอุปกรณ์เสียงทั้งหมดในกลุ่มในลักษณะเดียวกัน

    • อุปกรณ์เสียงแต่ละเครื่องจะได้รับการกำหนดรายการแอตทริบิวต์เสียง ระบบจะใช้ข้อมูลนี้เพื่อสร้างการผสมผสานนโยบายเสียงที่มีแอตทริบิวต์เสียงที่กําหนดไว้แตกต่างกัน

การกำหนดค่านี้ช่วยให้สามารถกำหนดเส้นทางการใช้แอตทริบิวต์เสียงที่แตกต่างกันไปยังอุปกรณ์เอาต์พุตที่แตกต่างกันในแต่ละโซนได้ เสียงต่างๆ อาจเล่นพร้อมกันได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน ตัวอย่างเช่น คุณอาจเลือกกำหนดค่าห้องโดยสารหลัก (โซนหลัก) ให้เล่นเสียงสื่อในลำโพงทั้งหมด แต่ให้เล่นเสียงการนำทางในลำโพงที่ใกล้คนขับที่สุดเท่านั้น เมื่อเล่นเสียงพร้อมกัน ผู้โดยสารในห้องโดยสารหลักจะฟังสื่อต่อไปได้ขณะที่ระบบนำทางส่งข้อมูลไปยังคนขับ

เวิร์กโฟลว์การลงชื่อเข้าใช้ของผู้โดยสารสำหรับระบบเสียงแบบหลายโซน

แผนภาพลำดับด้านล่างแสดงขั้นตอนการเปิดใช้การกำหนดเส้นทางเสียงเมื่อผู้โดยสารเข้าสู่ระบบจอแสดงผลที่เกี่ยวข้อง

ภาพ

รูปที่ 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 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

where

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>