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

การจัดการวอลุ่มอยู่ใน 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 คือจำนวนกลุ่มระดับเสียงในโซนนั้น ด้วยวิธีนี้ รหัสกลุ่มวอลุ่ม จะไม่ซ้ำกันในแต่ละโซน ตัวระบุเหล่านี้ใช้สำหรับ API CarAudioManager ที่เชื่อมโยงกับกลุ่มวอลุ่ม API ที่ใช้ groupId โดยไม่มี zoneId จะมีค่าเริ่มต้นเป็นโซนเสียงหลัก

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

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

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

จัดการเหตุการณ์สําคัญของระดับเสียง

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

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

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

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

เฟดเสียงและสมดุล

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

  • 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 เครื่องทั้ง 2 อุปกรณ์มีสตรีมที่ใช้งานอยู่หรือไม่

เมื่อไรจะเป็ด

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

  • การสตรีมหลายรายการที่เล่นใน Android มักเกิดขึ้นเมื่อแอปหรือบริการ 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

ข้อควรพิจารณาเมื่อลด

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

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

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

Android 11 เปิดตัว API โฟกัสเสียงแบบ HAL โหมด 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 เนื่องจากเป็น Matter แรกในไฟล์

<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()เพื่อรับการแจ้งเตือนเกี่ยวกับการเปลี่ยนแปลงระดับเสียง

เหตุการณ์กลุ่มวอลุ่มรถยนต์

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

  • รายชื่อ CarVolumeGroupInfo
  • EventTypes (แมปด้วยบิต)
  • รายชื่อ ExtraInfos

ข้อมูลกลุ่มปริมาณรถยนต์

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

EventType

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

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

ประเภทเหตุการณ์ ข้อมูลกลุ่มปริมาณรถยนต์
ประเภทเหตุการณ์ VOLUME_GAIN_INDEX_CHANGED CarVolumeGroupInfo.getVolumeกู้คืนIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarVolumeGroupInfo.getMinVolumeกู้คืนIndex()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarVolumeGroupInfo.getMaxVolumeGetIndex()
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()

ข้อมูลเพิ่มเติม

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

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

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

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

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

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

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

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

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

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

Callback ของสัญญาณเสียงที่ได้รับ

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

API ระดับ HAL

AudioControl @2.0 AIDL

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

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

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

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

เหตุผลสามารถแบ่งหมวดหมู่กว้างๆ เป็น

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

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

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

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

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

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

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

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

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

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

เฟรมเวิร์กเครื่องเสียงรถยนต์จะมีสถานะปิดเสียง 2 สถานะต่อไปนี้เป็นการภายใน

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • เหตุผล: แอปปรับระดับเสียงจะลงทะเบียนการเรียกกลับและทริกเกอร์การเปิดเสียงได้ (CarAudioManager.setVolumeGroupMute(...,/* closed=*/ 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 เพื่อซิงค์ข้อมูลดัชนีด้วย

ตัวอย่าง

กรณีการใช้งาน: ผู้ใช้อัปเดตดัชนีวอลุ่มเป็น 30

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

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

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

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

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

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

กรณีการใช้งาน: การเล่นเสียงครั้งแรกหลังจากออกจากการระงับ

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

  • Android จะเข้าสู่การระงับ

  • เมื่อมี Android อยู่แล้วให้ระงับ (เช่น กลับมาใช้งานต่อ)

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

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

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

การกำหนดค่าวอลุ่มแบบไดนามิก

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

  1. การกำหนดค่า End-of-line (EOL) ของยานพาหนะ

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

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

  2. การกำหนดค่ารันไทม์ ระบบเสียงในรถยนต์รองรับการกำหนดค่าเครื่องขยายสัญญาณภายนอกและ ECU เหล่านี้อาจโฮสต์การกำหนดค่าช่วงระดับเสียงที่จะค้นหาในระหว่างการเปิดเครื่อง

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

ออกแบบ

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

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

    เมื่อค้นพบแล้ว ระบบจะสร้าง Callback ผ่าน AudioControl::IModuleChangeCallback

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

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

  • โทรกลับ

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

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

ภาพ

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

API ระดับ HAL

AudioControl ที่ 3.0 AIDL

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

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

ลำดับ

แผนภาพลำดับของการกำหนดค่าระดับเสียงแบบไดนามิกจะแสดงที่ด้านล่าง

ภาพ

รูปที่ 2 แผนภาพลำดับสำหรับการกำหนดค่าวอลุ่มแบบไดนามิก

ลักษณะสำคัญ

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

  • AudioPort ที่ให้มาเป็นส่วนหนึ่งของ Callback ต้องตรงกับคำจำกัดความของ Automotive BUS

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

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