การจัดการปริมาณ

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

ปริมาณคงที่

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

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

เมื่อไม่ได้ตั้งค่าแฟล็ก 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>

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

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

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

เมื่อจะเป็ด

แม้ว่าจะขึ้นอยู่กับ OEM แต่ละรายในการพิจารณาว่า HAL จัดการการหลบอย่างไร แต่เราขอแนะนำแนวทางต่อไปนี้

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

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

เสียงวิกฤตด้านความปลอดภัย

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 เนื่องจากเป็นการจับคู่แรกในไฟล์

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

งานกลุ่มปริมาณรถยนต์

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

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

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

ผู้รับการเรียกกลับเหตุการณ์สามารถเข้าถึงรายการข้อมูลกลุ่มปริมาณรถยนต์ที่ได้รับผลกระทบได้ทันที ซึ่งหมายความว่าแอปไม่จำเป็นต้องทำการเรียกเฟรมเวิร์กเครื่องเสียงรถยนต์เพิ่มเติมเพื่อรับสถานะล่าสุด สามารถใช้ CarVolumeGroupInfos ที่ได้รับ to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes` ดังที่อธิบายไว้ด้านล่าง

ประเภทเหตุการณ์

กำหนดลักษณะของ CarVolumeGroupInfo ที่มีการเปลี่ยนแปลง แอพสามารถใช้สิ่งนี้เพื่อระบุการเปลี่ยนแปลงและดำเนินการที่จำเป็น ตัวอย่างเช่น EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED บ่งชี้ว่า CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`

ตารางต่อไปนี้แสดงความสัมพันธ์ระหว่าง 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.isลดทอน()
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 ให้การโทรกลับใหม่สำหรับแอปสิทธิพิเศษและแพลตฟอร์มเพื่อลงทะเบียนและรับการแจ้งเตือน CarVolumeGroupEvents

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

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

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

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

เสียงได้รับการโทรกลับ

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

ฮาล API

ควบคุมเสียง @2.0 AIDL

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

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

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

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

สาเหตุสามารถแบ่งได้กว้างๆ ดังนี้:

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

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

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

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

✔ (ปิดเสียง)
การปิดกั้น
ข้อจำกัด ❌ (เกินขีดจำกัด)

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

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

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

ข้อจำกัดการปิดเสียงคือ:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ตัวอย่าง

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

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

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

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

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

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

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

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

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

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

  • เมื่อ Android มีอยู่ ให้ระงับ (เช่น ดำเนินการต่อ):

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

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

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

การกำหนดค่าไดรฟ์ข้อมูลแบบไดนามิก

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

  1. การกำหนดค่าจุดสิ้นสุดสายการผลิต (EOL) ของยานพาหนะ

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

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

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

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

ออกแบบ

การกำหนดค่าไดนามิกวอลุ่มทำได้ในสามขั้นตอน:

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

    เมื่อค้นพบแล้ว การโทรกลับจะถูกสร้างขึ้นผ่าน AudioControl::IModuleChangeCallback

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

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

  • โทรกลับ.

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

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

ภาพ

รูปที่ 1. การกำหนดค่าวอลุ่มแบบไดนามิก

ฮาล API

ระบบควบคุมเสียง @ 3.0 AIDL

AudioControl AIDL HAL เวอร์ชัน 3.0 แนะนำ API ต่อไปนี้:

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

ลำดับ

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

ภาพ

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

ประเด็นสำคัญ

หากต้องการปรับคุณลักษณะนี้ให้เหมาะสม ให้พิจารณาสิ่งต่อไปนี้

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

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

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