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