การจัดการวอลุ่ม

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

ปริมาณคงที่

การติดตั้งใช้งาน AAOS ใช้เครื่องขยายสัญญาณฮาร์ดแวร์เพื่อควบคุมระดับเสียงแทนการใช้โปรแกรมผสมเสียง หากต้องการหลีกเลี่ยงผลข้างเคียง ให้ตั้งค่า Flag config_useFixedVolume เป็น true (วางซ้อนตามความจำเป็น)

<resources>
    <!-- Car uses hardware amplifier for volume. -->
    <bool name="config_useFixedVolume">true</bool>
</resources>

เมื่อไม่ได้ตั้งค่า Flag config_useFixedVolume (หรือตั้งค่าเป็น false) แอปจะเรียก AudioManager.setStreamVolume() เพื่อเปลี่ยนระดับเสียงตามประเภทสตรีมในโปรแกรมผสมเสียงซอฟต์แวร์ได้ ซึ่งอาจไม่เหมาะสมเสมอไปเนื่องจากอาจส่งผลต่อแอปอื่นๆ และข้อเท็จจริงที่ว่าการตัดระดับเสียงในโปรแกรมผสมซอฟต์แวร์อาจส่งผลให้มีบิตสำคัญในสัญญาณน้อยลงเมื่อรับสัญญาณจากเครื่องขยายเสียงฮาร์ดแวร์

กลุ่มระดับเสียง

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

กำหนดกลุ่มระดับเสียง

CarAudioService ใช้กลุ่มระดับเสียงที่กําหนดไว้ใน car_audio_configuration.xml ดังนี้

<audioZoneConfiguration version="2.0">
    <zones>
        <zone name="primary zone" isPrimary="true">
            <volumeGroups>
                <group>
                    <device address="bus0_media_out">
                        <context context="music"/>
                    </device>
                </group>
                <group>
                    <device address="bus1_navigation_out">
                        <context context="navigation"/>
                    </device>
                    <device address="bus2_voice_command_out">
                        <context context="voice_command"/>
                    </device>
                </group>
                ...
            </volumeGroups>
        </zone>
     </zones>
</audioZoneConfiguration>

กลุ่มโวลุ่มแต่ละกลุ่มควรมีอุปกรณ์เอาต์พุตอย่างน้อย 1 เครื่องที่มีที่อยู่ที่เกี่ยวข้อง ที่อยู่ควรสอดคล้องกับอุปกรณ์เอาต์พุตที่กําหนดไว้ใน audio_policy_configuration.xml

กำหนดค่าอัตราขยายของกลุ่มระดับเสียง

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

<devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="bus0_media_out">
  <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
  <gains>
    <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
      minValueMB="-3200" maxValueMB="600" defaultValueMB="0" stepValueMB="100"/>
  </gains>
</devicePort>

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

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

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

ตัวระบุกลุ่มระดับเสียง

ระบบจะระบุกลุ่มระดับเสียงที่รันไทม์ตามลำดับที่ระบุไว้ในไฟล์ XML รหัสมีตั้งแต่ 0 ถึง N-1 ภายในโซนเสียง โดยที่ N คือจํานวนกลุ่มระดับเสียงในโซนนั้น วิธีนี้ทำให้รหัสกลุ่มโวลุ่มซ้ำกันได้ในโซนต่างๆ ตัวระบุเหล่านี้ใช้สำหรับ CarAudioManager API ที่เชื่อมโยงกับกลุ่มโวลุ่ม API ใดก็ตามที่รับ groupId ที่ไม่มี zoneId จะใช้โซนเสียงหลักโดยค่าเริ่มต้น

การจัดการระดับเสียงหลายโซน

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

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

จัดการเหตุการณ์ปุ่มปรับระดับเสียง

Android กำหนดรหัสแป้นหลายรหัสสำหรับการควบคุมระดับเสียง ซึ่งรวมถึง

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

โดยค่าเริ่มต้น Android จะกําหนดเส้นทางเหตุการณ์สําคัญของระดับเสียงไปยังแอป การติดตั้งใช้งานยานยนต์ควรบังคับให้เหตุการณ์สําคัญเหล่านี้ได้รับการประมวลผลโดย CarAudioService ซึ่งจะเรียก setGroupVolume หรือ setMasterMute ตามเหมาะสม หากต้องการบังคับให้มีลักษณะการทำงานนี้ ให้ตั้งค่า Flag config_handleVolumeKeysInWindowManager เป็น true

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

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

ค่อยๆ เบาลงและปรับสมดุล

HAL การควบคุมเสียงทั้ง 2 เวอร์ชันมี API สำหรับการตั้งค่าการเลี้ยวเสียงและการปรับสมดุลในรถ API ระบบที่เกี่ยวข้องสำหรับ CarAudioManager จะส่งค่าไปยัง AudioControl HAL API เหล่านี้ต้องใช้ android.car.permission.CAR_CONTROL_AUDIO_VOLUME AudioControl API มีดังนี้

  • setBalanceTowardRight(float value) จะเปลี่ยนระดับเสียงของลำโพงไปทางด้านขวา (+) หรือซ้าย (-) ของรถ

    • 0.0 อยู่ตรงกลาง
    • +1.0 ถูกต้องทั้งหมด
    • -1.0 คือซ้ายสุด
    • ค่าที่อยู่นอกช่วง -1 ถึง 1 จะเป็นข้อผิดพลาด
  • setFadeTowardFront(float value) เปลี่ยนระดับเสียงของลำโพงไปยังด้านหน้า (+) หรือด้านหลัง (-) ของรถ

    • 0.0 อยู่ตรงกลาง
    • +1.0 คือการส่งต่อทั้งหมด
    • -1.0 คือสุดด้านหลัง
    • ค่าที่อยู่นอกช่วง -1 ถึง 1 จะเป็นข้อผิดพลาด

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

การลดเสียง

การลดเสียงจะเกิดขึ้นเมื่อรถลดอัตราขยายสำหรับสตรีมหนึ่งเพื่อให้ได้ยินสตรีมอื่นที่เล่นพร้อมกันได้ชัดเจนยิ่งขึ้น ใน AAOS ระบบ HAL จะเป็นผู้ลดเสียง Android ไม่สามารถควบคุมเสียงได้นอกเหนือจากระบบปฏิบัติการ ใน Android 11 ข้อมูลหลักที่ HAL มีให้เพื่อตัดสินใจเกี่ยวกับการทำให้เสียงเบาลงคืออุปกรณ์เอาต์พุต 2 เครื่องมีสตรีมทำงานอยู่หรือไม่

กรณีที่ควรหลบ

แม้ว่า OEM แต่ละรายจะเป็นผู้กำหนดวิธีจัดการการลดเสียงของ HAL แต่เราขอแนะนำให้ใช้หลักเกณฑ์ต่อไปนี้

  • การเล่นสตรีมหลายรายการใน Android มักเกิดขึ้นเมื่อแอปหรือบริการ 2 แอปหรือบริการ 2 รายการโฟกัสเสียงพร้อมกัน หากต้องการดูกรณีที่ Android อาจให้โฟกัสพร้อมกัน โปรดดูตารางการโต้ตอบในประเภทข้อจำกัด เมื่อเปิดตัวปลั๊กอินเสียงรถยนต์ การดำเนินการนี้ยังขึ้นอยู่กับการจัดการ AudioFocus ด้วย

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

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

การโต้ตอบ การทำงาน
EMERGENCY ปิดเสียงหรือปิดเสียงทุกอย่างยกเว้น SAFETY
SAFETY ปิดเสียงทุกอย่างยกเว้น EMERGENCY
NAVIGATION ยกเว้น SAFETY และ EMERGENCY
CALL ละเว้นทุกอย่างยกเว้น SAFETY, EMERGENCY และNAVIGATION
VOICE เป็ด CALL_RING
VEHICLE_SOUNDS คุณเป็นผู้กำหนดความสำคัญของเสียงที่ใช้งานอยู่และกำหนดว่าจะลดเสียงอื่นๆ หรือไม่
MUSIC และ ANNOUNCEMENT หลบทุกอย่าง ข้อยกเว้นคือเสียงการโต้ตอบแบบสัมผัสที่เล่นเป็น SYSTEM_SOUND

ข้อควรพิจารณาเมื่อใช้การลดเสียง

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

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

เสียงที่มีความสำคัญต่อความปลอดภัย

Android 11 ได้เปิดตัวHAL Audio Focus API HAL ช่วยให้มั่นใจว่าเสียงที่สำคัญต่อความปลอดภัยจะมีความสำคัญมากกว่าเสียงอื่นๆ หาก HAL ยึดโฟกัสเสียงเป็นเวลา USAGE_EMERGENCY เราไม่รับประกันว่าแอปและบริการจาก Android จะไม่เล่นเสียง HAL จะกำหนดว่าสตรีมใดจาก Android ควรผสมหรือปิดเสียงเพื่อเล่นเสียงที่สำคัญต่อความปลอดภัย

กำหนดค่า UI การตั้งค่าระดับเสียง

AAOS จะแยก UI การตั้งค่าระดับเสียงออกจากการกำหนดค่ากลุ่มระดับเสียง ซึ่งสามารถวางซ้อนกันได้ตามที่อธิบายไว้ในหัวข้อกำหนดค่าอัตราขยายของกลุ่มระดับเสียง การแยกนี้ช่วยให้มั่นใจว่าไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ หากการกำหนดค่าของกลุ่มวอลุ่มมีการเปลี่ยนแปลง

ใน UI การตั้งค่ารถยนต์ packages/apps/Car/Settings/res/xml/car_volume_items.xml จะมีองค์ประกอบ UI (ทรัพยากรชื่อและไอคอน) ที่เชื่อมโยงกับ AudioAttributes.USAGE ที่กําหนดไว้แต่ละรายการ ไฟล์นี้ช่วยให้การแสดงผลVolumeGroupsที่กําหนดไว้เป็นไปอย่างเหมาะสมโดยใช้ทรัพยากรที่เชื่อมโยงกับการใช้งานครั้งแรกที่ระบบจดจําได้ซึ่งอยู่ในVolumeGroupแต่ละรายการ

ตัวอย่างเช่น ตัวอย่างต่อไปนี้กําหนด VolumeGroup ให้รวม voice_communication และ voice_communication_signalling การใช้งาน UI การตั้งค่ารถยนต์เริ่มต้นจะแสดงผล VolumeGroup โดยใช้ทรัพยากรที่เชื่อมโยงกับ voice_communication เนื่องจากเป็นรายการแรกที่ตรงกันในไฟล์

<carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto">
    <item car:usage="voice_communication"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="voice_communication_signalling"
          car:title="@*android:string/volume_call"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="media"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="game"
          car:title="@*android:string/volume_music"
          car:icon="@*android:drawable/ic_audio_media"/>
    <item car:usage="alarm"
          car:title="@*android:string/volume_alarm"
          car:icon="@*android:drawable/ic_audio_alarm"/>
    <item car:usage="assistance_navigation_guidance"
          car:title="@string/navi_volume_title"
          car:icon="@drawable/ic_audio_navi"/>
    <item car:usage="notification_ringtone"
          car:title="@*android:string/volume_ringtone"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistant"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="notification"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_request"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_instant"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_communication_delayed"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="notification_event"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_accessibility"
          car:title="@*android:string/volume_notification"
          car:icon="@*android:drawable/ic_audio_ring_notif"/>
    <item car:usage="assistance_sonification"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
    <item car:usage="unknown"
          car:title="@*android:string/volume_unknown"
          car:icon="@*android:drawable/ic_audio_vol"/>
</carVolumeItems>

แอตทริบิวต์และค่าที่ใช้ในการกําหนดค่าข้างต้นจะประกาศใน packages/apps/Car/Settings/res/values/attrs.xml UI การตั้งค่าระดับเสียงใช้ CarAudioManager API ต่อไปนี้ซึ่งอิงตาม VolumeGroup

  • getVolumeGroupCount() เพื่อดูจำนวนการควบคุมที่ควรวาด
  • getGroupMinVolume() และ getGroupMaxVolume() เพื่อดูขอบเขตล่างและขอบเขตบน
  • getGroupVolume() เพื่อดูระดับเสียงปัจจุบัน
  • registerVolumeChangeObserver() เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงระดับเสียง

เหตุการณ์กลุ่มระดับเสียงของรถยนต์

Use Case ยานยนต์ของการอัปเดตระดับเสียงและการสลับปิดเสียงมีรากฐานตามบริบทที่อาจกำหนดการดำเนินการของแอปบางแอป เช่น การตั้งค่าระดับเสียง การเรียกกลับระดับเสียงและปิดเสียงปัจจุบันจากกองซ้อนเสียงของรถยนต์จะให้ข้อมูลตามบริบทแบบจำกัด เราได้เพิ่ม CarVolumeGroupEvent ลงใน Android 14 เพื่อรองรับกรณีการใช้งานยานยนต์และความสามารถในการปรับขนาดในอนาคตได้ดียิ่งขึ้น แต่ละเหตุการณ์มีข้อมูลสำคัญ 3 ประเภท ได้แก่

  • รายการ CarVolumeGroupInfo
  • EventTypes (แมปบิต)
  • รายการ ExtraInfos

CarVolumeGroupInfo

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

EventTypes

กำหนดว่าCarVolumeGroupInfoมีการเปลี่ยนแปลงในด้านใด แอปสามารถใช้ข้อมูลนี้เพื่อระบุการเปลี่ยนแปลงและดำเนินการที่จำเป็น เช่น EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED บ่งชี้ว่าดัชนีการเพิ่มขึ้นของปริมาณสูงสุด CarVolumeGroups ที่เกี่ยวข้องมีการเปลี่ยนแปลงและสามารถค้นหาได้โดยใช้ CarVolumeGroupInfo.getMaxVolumeGainIndex()

ตารางต่อไปนี้แสดงความสัมพันธ์ระหว่าง EventType กับ CarVolumeGroupInfo

EventType CarVolumeGroupInfo
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeGainIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isMuted()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarVolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

ExtraInfos

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

เราไม่บังคับใช้กระบวนการใดๆ สำหรับ ExtraInfos คุณพิจารณากระบวนการตามExtraInfosได้ตามที่เห็นสมควร เช่น หากการลดระดับเสียงทำงานอยู่เนื่องจาก EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED คุณสามารถเลือกที่จะทำให้ UI แถบระดับเสียงจางหายไปในตอนแรกเพื่อป้องกันไม่ให้ผู้ใช้เปลี่ยนระดับเสียงได้ ส่วนแอปอื่นๆ อาจเลือกแสดงข้อความแจ้งว่าระบบกำลังลดเสียงอยู่และอนุญาตให้ผู้ใช้เปลี่ยนระดับเสียง

เฟรมเวิร์กระบบเสียงรถยนต์จะขึ้นอยู่กับ AudioControl HAL IAudioGainCallback เพื่อแสดง ExtraInfos ที่แนะนำ ดูข้อมูลเพิ่มเติมได้ที่การเรียกกลับการเพิ่มระดับเสียง

CarVolumeGroupEvent ปรับขนาดให้เหมาะกับความต้องการในอนาคตของเฟรมเวิร์กเสียงรถยนต์ เราตั้งใจที่จะรองรับฟีเจอร์ใหม่ผ่าน CarVolumeGroupEvent เท่านั้น เราขอแนะนําอย่างยิ่งให้นักพัฒนาแอปใช้ CarVolumeGroupEvent เพื่อจัดการการเปลี่ยนแปลงระดับเสียงกลุ่มและการปิดเสียง

การเรียกกลับเหตุการณ์กลุ่มระดับเสียงของรถยนต์

Android 14 มีระบบการเรียกกลับแบบใหม่สำหรับแอปที่มีสิทธิ์และแอปแพลตฟอร์มเพื่อลงทะเบียนและรับการแจ้งเตือนเกี่ยวกับ CarVolumeGroupEvents

  • หากต้องการลงทะเบียนรับการโทรกลับ ให้ใช้ CarAudioManager#registerCarVolumeGroupEventCallback()

  • หากต้องการยกเลิกการลงทะเบียนการโทรกลับ ให้ใช้ CarAudioManager#unregisterCarVolumeGroupEventCallback()

หากแอปลงทะเบียนด้วย CarVolumeGroupEventCallback ใหม่และ CarVolumeCallback รุ่นเดิม ระบบจะจัดลําดับความสําคัญให้กับเหตุการณ์ CarVolumeGroupEventCallbacks สแต็กเสียงรถยนต์จะไม่ทริกเกอร์ CarVolumeCallback อีกต่อไป วิธีนี้จะช่วยป้องกันไม่ให้มีทริกเกอร์ที่ซ้ำกันในแอปเดียวกันสําหรับเหตุการณ์เดียวกัน

เราขอแนะนำอย่างยิ่งให้คุณใช้ CarVolumeGroupEventCallback เพื่อจัดการระดับเสียงของกลุ่มและการเปลี่ยนแปลงการปิดเสียง

การติดต่อกลับเกี่ยวกับระดับการขยายเสียง

ตั้งแต่ Android 13 เป็นต้นไป AudioControl HAL สามารถเรียกใช้การเรียกกลับแบบไม่พร้อมกันเพื่อจัดการการอัปเดตระดับเสียงเนื่องจากการเปลี่ยนแปลงระบบเสียงของรถยนต์

HAL API

AudioControl @2.0 AIDL

AudioControl AIDL HAL เวอร์ชัน 2.0 เพิ่ม API ต่อไปนี้

API วัตถุประสงค์
IAudioControl#registerGainCallback ลงทะเบียนอินสแตนซ์ของ IAudioGainCallback กับ HAL ของ AudioControl
IAudioGainCallback#onAudioDeviceGainsChanged การเรียกกลับแบบไม่พร้อมกันเพื่อแจ้งการเปลี่ยนแปลงการกำหนดค่าการขยายเสียง

การเรียกกลับ HAL ของ AudioControl มีรายการเหตุผลและ AudioGainConfigInfo ที่เกี่ยวข้อง ซึ่งประกอบด้วย

  • รหัสโซน
  • ที่อยู่พอร์ตของอุปกรณ์
  • ดัชนีของปริมาณ > ดัชนีอาจเป็นดัชนีที่จํากัดหรือดัชนีการอัปเดตก็ได้

สาเหตุอาจแบ่งออกเป็น 2 หมวดหมู่ใหญ่ๆ ดังนี้

  • เหตุผลในการจำกัด การเปลี่ยนแปลงชั่วคราวของระดับเสียงและลักษณะการปิดเสียง
  • อัปเดตเหตุผล การเปลี่ยนแปลงลักษณะการทำงานระดับเสียงอย่างถาวร

ประเภทข้อจำกัด

ณ วันที่ AudioControl HAL AIDL V3 ประเภทข้อจำกัดที่รองรับมีดังนี้

  • ปิดเสียง
  • จะมีการบล็อก
  • ข้อจํากัด
  • การลดทอน
การจํากัดที่ใช้งานอยู่ การเปลี่ยนแปลงระดับเสียงที่ผู้ใช้เรียกให้แสดง ปุ่มเปิด/ปิดเสียงที่ผู้ใช้ทริกเกอร์
ปิดเสียง ❌ (เปิดเสียง)

✔ (ปิดเสียง)
จะมีการบล็อก
ข้อจํากัด ❌ (เกินขีดจำกัด)

✔ (ไม่เกินขีดจำกัด)
การลดทอน

ลำดับความสำคัญของข้อจำกัดคือ ปิดเสียง > การบล็อก > การจํากัด > การลดระดับ

การจำกัดการปิดเสียง

ข้อจำกัดในการปิดเสียงมีดังนี้

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

เฟรมเวิร์กระบบเสียงของรถยนต์จะรักษาสถานะปิดเสียง 2 สถานะนี้ไว้ภายใน

  • ปิดเสียงผู้ใช้ เปิด/ปิดตามคําขอจากผู้ใช้ผ่าน CarAudioManager หรือเหตุการณ์สําคัญ

  • HAL ปิดเสียง เปิด/ปิดตามข้อจำกัดการปิดเสียงที่ได้รับผ่าน AudioGain การเรียกกลับ

สําหรับผู้ฟัง เช่น แอปการตั้งค่า สถานะการปิดเสียงโดยรวมของกลุ่มระดับเสียง (CarVolumeGroupInfo.isMuted()) จะขึ้นอยู่กับว่ามีการเปิดใช้การปิดเสียงอย่างใดอย่างหนึ่งข้างต้นหรือไม่

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

กรณีการโต้ตอบ: HAL mute เปิดใช้งานอยู่และผู้ใช้ขอเปิด/ปิดการปิดเสียง

เมื่อเปิดใช้การปิดเสียง HAL และปิดใช้การปิดเสียงของผู้ใช้

  • สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น true
  • ระบบจะดำเนินการตามคำขอของผู้ใช้เพื่อเปิดใช้การปิดเสียง
    • เหตุผล: เราควรดำเนินการตามคำขอปิดเสียงของผู้ใช้เสมอเพื่อรักษาความเป็นส่วนตัวของผู้ใช้

เมื่อเปิดใช้การปิดเสียง HAL และเปิดใช้การปิดเสียงของผู้ใช้

  • สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น true

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

    • เหตุผล: ระบบจะดำเนินการตามคำขอเลิกระงับของผู้ใช้ก็ต่อเมื่อไม่มีข้อจำกัดที่ใช้งานอยู่

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

กรณีการโต้ตอบ: เปิดใช้และปิดใช้การปิดเสียง HAL ขณะที่การปิดเสียงของผู้ใช้ไม่มีการเปลี่ยนแปลง

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

  • สถานะปิดเสียงโดยรวมของกลุ่มระดับเสียงเปลี่ยนเป็น true
  • ระบบNOTจะดำเนินการตามคำขอของผู้ใช้เพื่อเปลี่ยนระดับเสียงขณะที่เปิดใช้การปิดเสียง HAL

    • เหตุผล: ผู้ใช้ไม่ได้ยินเสียงขณะที่เปิดใช้การปิดเสียง การอนุญาตให้เปลี่ยนระดับเสียงอาจส่งผลให้มีเสียงดังมากและอาจเป็นอันตรายต่อความปลอดภัยของผู้ใช้

    • เหตุผล: แอประดับเสียงสามารถลงทะเบียนการเรียกกลับและทริกเกอร์การเลิกปิดเสียง (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) โดยอัตโนมัติโดยไม่ต้องให้ผู้ใช้ดำเนินการใดๆ หาก OEM ต้องการลักษณะการทำงานเช่นนี้

เมื่อปิดใช้การปิดเสียง HAL ขณะปิดใช้การปิดเสียงของผู้ใช้

  • เปลี่ยนสถานะการปิดเสียงของกลุ่มระดับเสียงเป็น false

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

  • ระบบจะดำเนินการตามคำขอของผู้ใช้ที่ต้องการเปลี่ยนระดับเสียงตามปกติ

จะมีการบล็อก

ข้อจำกัดการบล็อกมีดังนี้

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE

เมื่อการจํากัดการบล็อกมีผลอยู่ คําขอจากผู้ใช้ที่จะดำเนินการต่อไปนี้จะไม่ได้รับอนุญาต

  • ระบบจะไม่ประมวลผลการเปลี่ยนแปลงระดับเสียง
  • ดำเนินการเปิด/ปิดเสียงแล้ว

ข้อจํากัด

ข้อจำกัดของการจำกัดมีดังนี้

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

เมื่อข้อจำกัดการจํากัดมีผลอยู่ คําขอจากผู้ใช้ที่จะดำเนินการต่อไปนี้จะดำเนินการไม่ได้

  • วิธีเปลี่ยนระดับเสียง

    • ดำเนินการภายในขีดจำกัด
    • รายการที่เกินขีดจํากัดข้างต้นจะไม่ได้รับการประมวลผล
  • ดำเนินการเปิด/ปิดเสียงแล้ว

การลดทอน

ข้อจำกัดการลดทอนมีดังนี้

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

เมื่อข้อจำกัดการลดทอนเสียงทำงานอยู่ คำขอจากผู้ใช้ที่จะดำเนินการต่อไปนี้จะดำเนินการไม่ได้

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

  • ดำเนินการเปิด/ปิดเสียงแล้ว

อัปเดตดัชนี

การดำเนินการต่อไปนี้ถือเป็นการอัปเดตดัชนีของวอลุ่มแบบไม่พร้อมกัน Reasons.EXTERNAL_AMP_VOL_FEEDBACK

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

ตัวอย่าง

Use Case: ผู้ใช้อัปเดตดัชนีระดับเสียงเป็น 30

  • ผู้ใช้ใช้แอป Volume เพื่อเปลี่ยนดัชนีระดับเสียงเป็น 30

  • ระบบจะแปลงดัชนีนี้เป็นการเพิ่มระดับเสียงและส่งไปยัง Audio HAL

  • การใช้งานAudio HALของผู้ให้บริการจะได้รับการเพิ่มระดับเสียงใหม่และอัปเดตระบบเสียง (เช่น แอมป์ภายนอก)

  • ระบบเสียงตอบกลับว่าระดับเสียงอัปเดตเป็นดัชนี 15 เท่านั้น (Android ไม่ทราบสาเหตุ)

  • การใช้งานทริกเกอร์ AudioControl HAL ของผู้ให้บริการ

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • บริการเสียงของรถยนต์จะใช้ดัชนีใหม่จากการเรียกกลับที่ใช้เพื่อการเก็บรักษาและการเรียกกลับไปยังแอประดับเสียง ดัชนีที่ผู้ใช้ขอคือ 30 อย่างไรก็ตาม ความคิดเห็นแบบไม่พร้อมกันของระบบเสียงจะอัปเดตดัชนีเป็น 15

Use Case: การเล่นเสียงครั้งแรกหลังจากออกจากโหมดหยุดชั่วคราว

  • ดัชนีระดับเสียงก่อนการระงับตั้งค่าไว้ที่ระดับสูง 95 (ช่วง: [0-99])

  • Android เข้าสู่โหมดระงับ

  • เมื่อ Android หยุดทำงานชั่วคราว (เช่น กลับมาทำงานต่อ)

    • ผู้ให้บริการ Audio HAL/AudioControl HAL ใช้ดัชนีที่ปลอดภัย 30 กับระบบเสียงในพื้นที่

    • ผู้ให้บริการ AudioControl HAL ยังเรียกใช้การเรียกกลับสําหรับดัชนีที่ปลอดภัยด้วย

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • บริการเสียงของรถยนต์จะใช้ดัชนีใหม่จากการเรียกกลับที่ใช้เพื่อการเก็บรักษาและการเรียกกลับของตัวเองไปยังแอประดับเสียงที่ซิงค์ดัชนี ดัชนีปริมาณก่อนการระงับคือ 95 อย่างไรก็ตาม หลังจากเล่นต่อ ผู้ติดตั้งใช้งาน AudioControl HAL จะตั้งค่าดัชนีนี้เป็นระดับเสียงที่ปลอดภัยที่ 30

การกําหนดค่าระดับเสียงแบบไดนามิก

ฟีเจอร์นี้พิจารณากรณีการใช้งานหลักดังต่อไปนี้

  1. การกำหนดค่ารุ่นสุดท้าย (EOL) ของยานพาหนะ

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

    • ผู้ผลิตรถยนต์อาจต้องอัปเดตการกำหนดค่าระดับเสียงในระหว่างกำหนดการบริการ

  2. การกําหนดค่ารันไทม์ ระบบเสียงยานยนต์รองรับการกำหนดค่าแอมพลิฟายเออร์ภายนอก และ ECU เหล่านี้อาจโฮสต์การกำหนดค่าช่วงระดับเสียงที่ระบบจะค้นหาระหว่างการบูต

  3. การกำหนดค่าแบบออนดีมานด์ ให้บริการเพื่อรองรับความต้องการที่เพิ่มขึ้นสำหรับฟีเจอร์เสียงตามดีมานด์ ซึ่งผู้ใช้จะสมัครใช้บริการการประมวลผลสัญญาณที่มีประสิทธิภาพมากขึ้นเป็นระยะเวลาหนึ่ง การกําหนดค่าช่วงปริมาณใหม่จะใช้ได้ตลอดระยะเวลาการสมัครใช้บริการ

การออกแบบ

การกำหนดค่าระดับเสียงแบบไดนามิกทำได้ 3 ระยะดังนี้

  • Discovery การใช้งาน HAL ของ AudioControl ของผู้ให้บริการจะค้นหาการอัปเดตช่วงระดับเสียงใหม่ผ่านกลไก IPC ที่กําหนดเองซึ่งผู้ให้บริการเป็นเจ้าของ

    เมื่อพบแล้ว ระบบจะสร้างการติดต่อกลับผ่าน AudioControl::IModuleChangeCallback

  • อัปเดต สแต็กเสียงรถยนต์จะอัปเดตสถานะกลุ่มระดับเสียงด้วยช่วงระดับเสียงใหม่

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

  • การติดต่อกลับ

    • หลังจากอัปเดตช่วงของกลุ่มระดับเสียงแล้ว สแต็กเสียงรถยนต์จะเรียกใช้การติดต่อกลับไปยังแอปที่ลงทะเบียนผ่าน CarVolumeGroupEventCallback

    • CarVolumeGroupEvent มี CarVolumeGroupInfo ที่อัปเดตแล้ว ประเภทเหตุการณ์ (สิ่งที่เปลี่ยนแปลง) และข้อมูลเพิ่มเติม (สาเหตุที่เปลี่ยนแปลง)

ภาพ

รูปที่ 1 การกําหนดค่าระดับเสียงแบบไดนามิก

HAL API

AudioControl @ 3.0 AIDL

AudioControl AIDL HAL เวอร์ชัน 3.0 เปิดตัว API ต่อไปนี้

API
IAudioControl#setModuleChangeCallback ตั้งค่าอินสแตนซ์ของ IModuleChangeCallback ด้วย HAL ของ AudioControl
IAudioControl#clearModuleChangeCallback ล้างอินสแตนซ์ของ IModuleChangeCallback ที่ตั้งไว้ก่อนหน้านี้ด้วย HAL ของ AudioControl
IModuleChangeCallback#onAudioPortsChanged การเรียกกลับเพื่อแจ้งการเปลี่ยนแปลงใน AudioPorts

ลำดับ

แผนภาพลำดับขั้นของการกำหนดค่าปริมาณแบบไดนามิกแสดงอยู่ด้านล่าง

ภาพ

รูปที่ 2 ลำดับแผนภาพสำหรับการกำหนดค่าระดับเสียงแบบไดนามิก

แง่มุมสำคัญ

โปรดพิจารณาสิ่งต่อไปนี้เพื่อเพิ่มประสิทธิภาพฟีเจอร์นี้

  • AudioPorts ที่ระบุเป็นส่วนหนึ่งของการเรียกกลับต้องตรงกับคำจำกัดความของ Automotive ดังนี้

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

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