การกำหนดค่าระบบเสียงของรถยนต์

ใน Android 10 car_audio_configuration.xml ได้แทนที่ car_volumes_groups.xml และ IAudioControl.getBusForContext ไฟล์นโยบายเสียง ซึ่งโดยปกติจะอยู่ในพาร์ติชันของผู้ให้บริการ จะแสดงการกำหนดค่าฮาร์ดแวร์เสียง ของบอร์ด ต้องกำหนดอุปกรณ์ทั้งหมดที่อ้างอิงใน car_audio_configuration.xml ใน audio_policy_configuration.xml

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

ภาพรวมสถาปัตยกรรมเสียงในรถยนต์

รูปที่ 1 ภาพรวมสถาปัตยกรรมเสียงในรถยนต์

วางไฟล์การกำหนดค่าเสียงในรถยนต์ใน vendor/etc/ หรือ system/etc/ ในอุปกรณ์ โดยบริการเสียงในรถยนต์จะค้นหาไฟล์ใน vendor/etc/ เป็นที่แรก บริการเสียงของรถยนต์ จะอ่าน car_audio_configuration.xml เพื่อกำหนดค่าเสียง

โซนเสียงในรถยนต์

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

    • โฟกัสอัตโนมัติ
    • การกำหนดเส้นทางเสียง
    • การลดเสียง
  • กลุ่มระดับเสียงของรถยนต์

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

    • การแมปบริบทเสียงกับอุปกรณ์เสียง ใช้เพื่อสร้างมิกซ์เสียง ที่แมปการใช้งานเสียงกับอุปกรณ์เอาต์พุต

    • บริบทเสียงทั้งหมดควรแสดงภายในโซน ซึ่งจะช่วยให้ ตั้งค่าการกำหนดเส้นทางเสียงได้อย่างถูกต้องสำหรับการใช้งานแอตทริบิวต์เสียงทั้งหมด

บริบทของเสียง

เราได้จัดกลุ่มการใช้งานที่คล้ายกันไว้ใน CarAudioContexts เพื่อให้การกำหนดค่าเสียง AAOS ง่ายขึ้น บริบทเสียงเหล่านี้ใช้ใน CarAudioService เพื่อกำหนดการกำหนดเส้นทาง กลุ่มระดับเสียง โฟกัสเสียง และการจัดการการลดระดับเสียง บริบทเสียงแบบคงที่ใน AAOS แสดงอยู่ในตารางนี้

ตารางนี้อธิบายการเชื่อมโยงระหว่างบริบทเสียงและการใช้งาน แถวที่ไฮไลต์ มีไว้สำหรับการใช้งานระบบใหม่

CarAudioContext Associated AttributeUsages
MUSIC UNKNOWN
GAME
MEDIA
NAVIGATION ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
CALL VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
ALARM ALARM
NOTIFICATION NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
EMERGENCY EMERGENCY
SAFETY SAFETY
VEHICLE_STATUS VEHICLE_STATUS
ANNOUNCEMENT ANNOUNCEMENT

เปิดใช้การกำหนดเส้นทาง AAOS

หากต้องการใช้การกำหนดเส้นทางที่อิงตาม AAOS คุณต้องตั้งค่าaudioUseDynamicRoutingเป็น true

<resources>
    <bool name="audioUseDynamicRouting">true</bool>
</resources>

เมื่อปิดใช้ false การกำหนดเส้นทาง และCarAudioService ส่วนใหญ่ AAOS จะกลับไปใช้ลักษณะการทำงานเริ่มต้นของ AudioService

เครื่องมือจัดการนโยบายเสียงที่กำหนดค่าได้

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

คุณเปิดใช้เครื่องมือ Configurable audio policy (CAP) ได้โดยใช้ useCoreAudioVolume และ useCoreAudioRouting โปรดดูรายละเอียดที่ เครื่องมือ Configurable audio policy

โซนหลัก

โดยค่าเริ่มต้น ระบบจะกำหนดเส้นทางเสียงทั้งหมดไปยังโซนหลัก มีโซนหลักเพียงโซนเดียว ซึ่งระบุในการกำหนดค่าโดยแอตทริบิวต์ isPrimary="true" ระบบจะกำหนดAudiomanager.PRIMARY_AUDIO_ZONEให้โซนหลักโดยอัตโนมัติ

ตัวอย่างการกำหนดค่า (เวอร์ชัน 2)

เช่น รถยนต์อาจมี 2 โซน ได้แก่ โซนหลักและระบบความบันเทิงที่เบาะหลัง ในสถานการณ์นี้ คุณสามารถออกแบบ car_audio_configuration.xmlเวอร์ชัน 2 ที่เป็นไปได้ได้ดังนี้

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

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

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

ในตัวอย่างโซนรอง บริบทเสียงทั้งหมดจะ กำหนดเส้นทางไปยังอุปกรณ์เดียวและกลุ่มระดับเสียงเดียว

คำจำกัดความของกลุ่มวอลุ่มสำหรับเครื่องมือ CAP

หากต้องการใช้การจัดการระดับเสียงผ่านเครื่องมือ CAP ตามที่ระบุไว้ใน เครื่องมือการกำหนดนโยบายเสียงที่กำหนดค่าได้ คำจำกัดความของกลุ่มระดับเสียง ต้องมีชื่อด้วย


<group name="media">
  <device address="bus0_media_out">
    <context context="music"/>
    <context context="announcement"/>
  </device>
  <device address="bus3_call_ring_out">
     <context context="call_ring"/>
  </device>
  <device address="bus6_notification_out">
    <context context="notification"/>
  </device>
</group>
<group name="navigation">
  <device address="bus1_navigation_out">
    <context context="navigation"/>
  </device>
  <device address="bus2_voice_command_out">
    <context context="voice_command"/>
  </device>
</group>

ชื่อกลุ่มวอลุ่มนี้ ต้องตรงกับชื่อวอลุ่มที่กำหนดไว้ในเครื่องมือ CAP นอกจากนี้ คุณต้องตั้งค่า useFixedVolume เป็น false ด้วย ดูรายละเอียดได้ที่ แฟล็กการกำหนดค่าเสียงของ AAOS

การกำหนดค่าเสียงในโซนผู้โดยสาร

ใน Android 11 car_audio_configuration.xml ได้เปิดตัว ฟิลด์ใหม่ 2 รายการ ได้แก่ audioZoneId และ occupantZoneId คุณใช้ audioZoneId เพื่อควบคุมการจัดการโซนเสียงได้ คุณใช้ occupantZoneId เพื่อกำหนดค่า การกำหนดเส้นทางตามรหัสผู้ใช้ได้

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

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

การกำหนดค่าจะกำหนดการแมปสำหรับโซนหลักกับโซนผู้ใช้ 0 และ audioZoneId 1 กับ occupantZoneId 1 คุณกำหนดค่าการแมประหว่างโซนผู้โดยสาร กับโซนเสียงได้ อย่างไรก็ตาม การแมปต้องเป็นแบบหนึ่งต่อหนึ่ง กฎที่กำหนดฟิลด์ใหม่ 2 รายการมีดังนี้

  • audioZoneId สำหรับโซนหลักจะเป็นรหัส PRIMARY_AUDIO_ZONE เสมอ หากกำหนด isPrimary="true" ไว้ ก็ไม่จำเป็นต้องใช้ audioZoneId

  • หมายเลข audioZoneId และ occupantZoneId ต้องไม่ซ้ำกัน

  • audioZoneId และ occupantZoneId มีการแมปแบบหนึ่งต่อหนึ่งได้เท่านั้น

การกำหนดค่าเสียงในรถยนต์ของ Android 14

ใน Android 14, AAOS ได้เปิดตัวบริการปลั๊กอิน OEM ซึ่งช่วยให้คุณจัดการลักษณะการทำงานของเสียงที่ดูแลโดยบริการเสียงของรถยนต์ได้ นอกเหนือจากบริการปลั๊กอินใหม่แล้ว เรายังได้เพิ่มการเปลี่ยนแปลงต่อไปนี้ ลงในไฟล์การกำหนดค่าเสียงในรถยนต์ด้วย

  • บริบทเสียงในรถที่ OEM กำหนด
  • การกำหนดค่าแบบไดนามิกของโซนที่ไม่ใช่โซนหลัก

บริบทเสียงในรถที่ OEM กำหนด

ใน Android 14 บริการเสียงในรถยนต์จะอนุญาตให้จัดกลุ่มการใช้งานเสียงแตกต่างจากบริบทเสียงแบบคงที่ที่กำหนดไว้ เพื่อให้กำหนดค่าเสียงได้อย่างยืดหยุ่น บริบทที่ OEM กำหนดนี้จะกำหนดได้ในไฟล์ car_audio_configuration.xml เวอร์ชัน 3

ระบบจะใช้บริบทเสียงแบบคงที่ที่กำหนดไว้ล่วงหน้าแทน รูปแบบทั่วไป ของบริบทเสียงในรถยนต์ที่ OEM กำหนดจะแสดงในภายหลัง

บริบท OEM แต่ละรายการต้องมี name พร้อมกับรายการแอตทริบิวต์เสียง การใช้งานที่กำหนดให้กับบริบท ในตัวอย่างก่อนหน้านี้ มีการกำหนดบริบท 2 อย่างดังนี้

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • บริบท media มี AUDIO_USAGE_MEDIA และ AUDIO_USAGE_UNKNOWN
  • game บริบทมีเฉพาะ AUDIO_USAGE_GAME

ต้องกำหนดบริบทที่ด้านบนของไฟล์ car_audio_configuration.xml เมื่อกำหนดบริบท OEM แล้ว การกำหนดค่าเสียงในรถยนต์ส่วนที่เหลือ จะดำเนินการต่อได้เช่นเดิม กฎต่อไปนี้จะมีผลกับบริบทของเครื่องเสียงในรถยนต์

  • คำจำกัดความบริบทของ OEM เป็นตัวเลือกที่ไม่บังคับ ระบบจะใช้บริบทเสียงแบบคงที่แทน

  • อย่าใช้ชื่อบริบทซ้ำ

  • อย่ากำหนดการใช้งานแอตทริบิวต์เสียงให้กับหลายบริบท

  • ควรใช้การใช้งานเสียงทั้งหมดที่กำหนดไว้ใน AudioAttributes เพื่อสร้างบริบท

กล่าวอย่างเคร่งครัดคือ ต้องใช้android.audio.policy.configuration.V7_0.AudioUsage การแสดงสตริงของการใช้งานเสียงสำหรับคำจำกัดความบริบทเสียงของ OEM ในอนาคต ระบบจะกำหนดการใช้งานแอตทริบิวต์เสียงเวอร์ชันใหม่กว่าให้กับบริบทที่เหมาะสมที่สุดเพื่อลดข้อผิดพลาดขณะย้ายข้อมูลจาก Android เวอร์ชันหนึ่งไปยังอีกเวอร์ชันหนึ่ง

แม้ว่าบริบทที่ OEM กำหนดจะเปิดตัวเพื่อขยายบริการเสียงของปลั๊กอิน OEM ให้มากยิ่งขึ้น แต่ก็ยังคงใช้ได้โดยไม่ต้องใช้บริการปลั๊กอิน OEM ลักษณะการทำงานของเสียง จะคล้ายกับบริการเสียงแบบคงที่ ดังนี้

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

  • ระบบจะใช้องค์ประกอบเสียงควบคุมระดับเสียงเพื่อพิจารณาการจับคู่ที่ดีที่สุด

    • กลุ่มระดับเสียงตามบริบทที่ OEM กำหนด
    • ลำดับความสำคัญจากรายการโวลุ่มแบบคงที่ที่กำหนดค่าไว้
  • ลักษณะการทำงานของการลดเสียง

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

    • ระบบจะใช้แอตทริบิวต์เสียงเพื่อแมปบริบทแบบคงที่ที่เกี่ยวข้องกับการดั๊ก ตามเมทริกซ์การดั๊กเสียงแบบคงที่

กลยุทธ์ผลิตภัณฑ์ของเครื่องมือ CAP

เมื่ออุปกรณ์ต้องใช้เครื่องมือ CAP สำหรับการจัดการระดับเสียงหรือการกำหนดเส้นทาง บริบทที่ OEM กำหนดต้องตรงกับคำจำกัดความกลยุทธ์ผลิตภัณฑ์ของเครื่องมือ CAP หากไม่เป็นเช่นนั้น คุณสามารถใช้บริบทที่ OEM กำหนดได้โดยไม่ต้องใช้เครื่องมือ CAP

ดูข้อมูลเพิ่มเติมได้ที่กลยุทธ์ผลิตภัณฑ์ ของเครื่องมือ CAP ใน AAOS

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

ใน Android 14 เราได้อัปเดตสคีมาการกำหนดค่าเสียงในรถยนต์สำหรับกำหนดโซนเสียงเป็นเวอร์ชัน 3 เพื่อรองรับการกำหนดค่าโซนเสียงแบบไดนามิก สคีมาใหม่กำหนดให้ต้องตั้งค่า สำหรับแต่ละโซน

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

ดูข้อมูลเพิ่มเติมได้ที่ไฟล์เวอร์ชัน 3 ที่กำหนดไว้ใน device/generic/car/emulator/audio/car_audio_configuration.xml ตั้งแต่ Android 14 เป็นต้นไป โซนหลักจะมีได้เพียง 1 การกำหนดค่าเท่านั้น โซนที่ไม่ใช่โซนหลักสามารถมีการกำหนดค่าหลายรายการได้ กฎต่อไปนี้มีผลกับการกำหนดค่าเครื่องเสียงในรถยนต์

  • โซนเสียงหลักมีการกำหนดค่าได้เพียงรายการเดียว

  • โซนเสียงที่ไม่ใช่โซนหลักสามารถมีการกำหนดค่าได้หลายแบบ

  • ชื่อต้องไม่ซ้ำกันสำหรับโซนเสียงและการกำหนดค่าโซนเสียงแต่ละรายการ

  • การกำหนดค่าเสียงอาจแตกต่างกันภายในโซนเสียง

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

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

  • ต้องกำหนดบริบทเสียงทั้งหมด (OEM หรือแบบคงที่) สำหรับการกำหนดค่าเสียงแต่ละรายการ

ความเข้ากันได้กับรุ่นถัดไป

แม้ว่า car_audio_configuration.xml เวอร์ชันใหม่จะมีการเปิดตัวฟีเจอร์ใหม่ๆ ในการอัปเดตแต่ละครั้ง แต่คุณก็ยังใช้ไฟล์เก่าใน AAOS เวอร์ชันใหม่ได้ OEM ที่อัปเดตเป็น Android เวอร์ชันใหม่สามารถนำcar_audio_configuration.xmlไฟล์ไปใช้ซ้ำได้

หากต้องการใช้ฟีเจอร์ใหม่ที่ต้องใช้ข้อมูลใหม่ซึ่งอยู่ใน car_audio_configuration.xml คุณต้องอัปเดตเวอร์ชัน การพยายามใช้ ไฟล์เวอร์ชันเก่าที่มีข้อมูลที่ไม่รองรับในไฟล์เวอร์ชันนั้น จะทำให้เกิด IllegalStateException เมื่อเริ่มบริการในรถยนต์ ข้อความข้อยกเว้น มีข้อมูลที่เกี่ยวข้องเกี่ยวกับข้อมูลที่ใช้และ เวอร์ชันขั้นต่ำที่จำเป็น