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

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

ปริมาณคงที่

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

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

แม้ว่า 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

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

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

<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 แล้ว Callback

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ตัวอย่าง

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

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

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

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

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

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

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • บริการเสียงรถยนต์จะใช้ดัชนีใหม่จาก Callback ที่ใช้สำหรับ การคงอยู่และการเรียกกลับไปยังแอป Volume ดัชนีที่ผู้ใช้ขอคือ 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 ของตัวเองไปยังแอป Volume ที่ซิงค์ดัชนี ดัชนีปริมาณก่อนระงับคือ 95 อย่างไรก็ตาม หลังจากที่เปิดใช้งานอีกครั้ง ดัชนีนี้จะ กำหนดเป็นระดับเสียงที่ปลอดภัยที่ 30 โดยผู้ติดตั้งใช้งาน AudioControl HAL

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

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

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

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

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

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

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

การออกแบบ

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

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

    เมื่อค้นพบแล้ว Callback จะสร้างขึ้นโดยใช้ AudioControl::IModuleChangeCallback

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

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

  • โทรกลับ

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

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

ภาพ

รูปที่ 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 สำหรับข้อมูลเพิ่มเติม

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