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

ใน 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 AttributeUsages ที่เชื่อมโยง
ดนตรี UNKNOWN
GAME
MEDIA
การนำทาง ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
โทร VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
นาฬิกาปลุก ALARM
การแจ้งเตือน NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
ฉุกเฉิน EMERGENCY
ความปลอดภัย SAFETY
VEHICLE_STATUS VEHICLE_STATUS
การประกาศ ANNOUNCEMENT

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

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

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

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

โซนหลัก

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

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

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

การกำหนดค่าเสียงของโซนผู้อยู่อาศัย

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

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

<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 โดยทั่วไปแล้ว คุณสามารถกำหนดค่าการแมประหว่างโซนตรวจจับคนอยู่และโซนเสียงได้ อย่างไรก็ตาม การแมปต้องเป็นแบบ 1:1 กฎที่กําหนดฟิลด์ใหม่ 2 ช่องมีดังนี้

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

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

  • audioZoneId และ occupantZoneId มีการแมปแบบ 1:1 ได้เท่านั้น

การกำหนดค่าระบบเสียงของรถใน 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 context contains only AUDIO_USAGE_GAME

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

  • คุณจะใช้คําจํากัดความบริบท OEM หรือไม่ก็ได้ ระบบจะใช้บริบทเสียงแบบคงที่แทน

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

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

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

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

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

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

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

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

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

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

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

ใน 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 เมื่อเริ่มบริการรถยนต์ ข้อความข้อยกเว้นจะมีข้อมูลที่เกี่ยวข้องเกี่ยวกับข้อมูลที่จะใช้และเวอร์ชันขั้นต่ำที่จำเป็น