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

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

ระดับเสียงคงที่

การใช้งาน AAOS จะใช้เครื่องขยายสัญญาณฮาร์ดแวร์เพื่อควบคุมระดับเสียงแทน มิกเซอร์ซอฟต์แวร์ หากต้องการหลีกเลี่ยงผลข้างเคียง ให้ตั้งค่า Flag 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="4">
    </deviceConfigurations>
    <activationVolumeConfigs>
        <activationVolumeConfig name="activation_volume_on_boot_config">
            <activationVolumeConfigEntry minActivationVolumePercentage="10" maxActivationVolumePercentage="90"
            invocationType="onBoot" />
        </activationVolumeConfig>
        ...
    </activationVolumeConfigs>
    <zones>
        <zone name="primary zone" isPrimary="true">
          <zoneConfigs>
              <zoneConfig name="primary zone config 0" isDefault="true">
                <volumeGroups>
                    <group activationConfig="activation_volume_on_boot_config">
                        <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>
              </zoneConfig>
              ...
            </zoneConfigs>
        </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 15 เปิดตัวการควบคุมดัชนีกลุ่มระดับเสียงเพื่อปรับปรุงความปลอดภัยและ ความสะดวกสบายของผู้ใช้ในระบบเสียงของรถยนต์ ซึ่งทำได้โดยใช้ระดับเสียงเปิดใช้งานขั้นต่ำ และสูงสุดที่กำหนดค่าไว้ในการกำหนดค่าเสียงในรถยนต์ (ดูกำหนดกลุ่มระดับเสียง) คุณเปิดใช้ฟีเจอร์นี้ได้โดย ตั้งค่า audioUseMinMaxActivationVolume เป็น true ใน RRO ของ Car Service

คุณกำหนดรายการ activationVolumeConfig หลายรายการใน activationVolumeConfigs ได้ โดยแต่ละรายการจะแสดงถึงการกำหนดค่าการเปิดใช้งานขั้นต่ำและ สูงสุดที่แตกต่างกัน แต่ละ activationVolumeConfig

  • ต้องมี name ที่ไม่ซ้ำกันในไฟล์การกำหนดค่าเสียงในรถยนต์ เพื่อให้ อ้างอิงในกลุ่มระดับเสียง (group) ได้ในภายหลัง
  • ต้องมี activationVolumeConfigEntry เพียงรายการเดียว

activationVolumeConfig แต่ละรายการมีแอตทริบิวต์ต่อไปนี้

  • minActivationVolumePercentage (จำนวนเต็ม, 0-100, ไม่บังคับ, ค่าเริ่มต้น: 0): ระบุปริมาณการเปิดใช้งานขั้นต่ำเป็นเปอร์เซ็นต์
  • maxActivationVolumePercentage (จำนวนเต็ม, 0-100, ไม่บังคับ, ค่าเริ่มต้น: 100): ระบุระดับเสียงสูงสุดในการเปิดใช้งานเป็นเปอร์เซ็นต์
  • invocationType (สตริง ไม่บังคับ ค่าเริ่มต้น: onPlaybackChanged): กำหนด เงื่อนไขที่จะใช้ระดับเสียงเปิดใช้งานขั้นต่ำและสูงสุด

    • onBoot: ใช้กับการเล่นที่เพิ่งเปิดใช้งานใหม่เป็นครั้งแรก ในกลุ่มระดับเสียงหลังจากบูตเท่านั้น
    • onSourceChanged: ใช้กับการเล่นที่เพิ่งเปิดใช้งานใหม่เท่านั้น ซึ่งมีการเปลี่ยนแอปหรือแหล่งที่มาของ UID ในกลุ่มระดับเสียง
    • onPlaybackChanged: ใช้กับการเล่นที่เพิ่งเปิดใช้งานใหม่ทุกรายการในกลุ่มระดับเสียง

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

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

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

ภาพ

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

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

  • การจับคู่ประเภทการเรียกใช้: ประเภทการเปิดใช้งานของการเล่น (ได้มาจาก Audio Manager, Audio Control HAL หรือ Telephony Manager) ต้องตรงกับ invocationType ที่ระบุใน activationVolumeConfigEntry ที่เชื่อมโยง กับกลุ่มระดับเสียง
  • ดัชนีระดับเสียงอยู่นอกช่วง: ดัชนีการเพิ่มระดับเสียงปัจจุบันของกลุ่มระดับเสียง ต้องอยู่นอกช่วงดัชนีการเพิ่มระดับเสียงที่กำหนดไว้สำหรับการเปิดใช้งาน กล่าวคือ ข้อใดข้อหนึ่งต่อไปนี้เป็นจริง

    • ดัชนีต่ำกว่าปริมาณการเปิดใช้งานขั้นต่ำที่คำนวณได้ ดัชนี

      หรือ

    • ดัชนีสูงกว่าดัชนีการเพิ่มปริมาณการเปิดใช้งานสูงสุดที่คำนวณแล้ว

หากมีการจับคู่การเปิดใช้งาน ระบบจะปรับดัชนีการเพิ่มปริมาณของกลุ่มปริมาณเป็นค่าใดค่าหนึ่งต่อไปนี้

  • ดัชนีการเพิ่มปริมาณการเปิดใช้งานขั้นต่ำหากต่ำกว่าดัชนีการเพิ่มปริมาณการเปิดใช้งานขั้นต่ำ

    หรือ

  • ดัชนีการเพิ่มปริมาณการเปิดใช้งานสูงสุดหากสูงกว่าดัชนีการเพิ่มปริมาณการเปิดใช้งานสูงสุด

นอกจากนี้ ระบบจะส่งเหตุการณ์กลุ่มปริมาณรถที่มีประเภทเหตุการณ์ EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED ไปยังการเรียกกลับของเหตุการณ์กลุ่มปริมาณ ที่ลงทะเบียนทั้งหมด

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

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

เฟดและบาลานซ์

HAL ของ AudioControl ทั้ง 2 เวอร์ชันมี API สำหรับการตั้งค่าเฟดและบาลานซ์ ในรถ API ของระบบที่เกี่ยวข้องสำหรับ CarAudioManager จะส่งค่า ไปยัง HAL ของ AudioControl 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 Duck ทุกอย่างยกเว้น EMERGENCY
NAVIGATION ลดระดับเสียงทุกอย่างยกเว้น SAFETY และ EMERGENCY
CALL เป็ดทุกอย่างยกเว้น SAFETY, EMERGENCY และ NAVIGATION
VOICE เป็ด CALL_RING
VEHICLE_SOUNDS คุณกำหนดความสำคัญของเสียงที่ทำงานอยู่และเลือกว่าจะ ลดระดับเสียงอื่นๆ หรือไม่
MUSIC และ ANNOUNCEMENT หลบได้ทุกอย่าง ข้อยกเว้นคือเสียงการโต้ตอบแบบสัมผัสที่เล่นเป็น SYSTEM_SOUND

ข้อควรพิจารณาเมื่อใช้การหลบ

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

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

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

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 การตั้งค่าระดับเสียงใช้ API ของ CarAudioManager ที่อิงตาม VolumeGroup ต่อไปนี้

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

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

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

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

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

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

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

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

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

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

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

การเรียกกลับเพื่อปรับอัตราขยายเสียง

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

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 mute. สลับตามข้อจำกัดการปิดเสียงที่ได้รับผ่านAudioGain การเรียกกลับ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • เหตุผล: แอปควบคุมระดับเสียงสามารถลงทะเบียนการเรียกกลับและทริกเกอร์การเลิกปิดเสียง (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 เพื่อซิงค์ดัชนี

ตัวอย่าง

กรณีการใช้งาน: ผู้ใช้อัปเดตดัชนีระดับเสียงเป็น 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 อย่างไรก็ตาม หลังจากกลับมาทำงานต่อ AudioControl HAL ผู้ติดตั้งใช้งานจะตั้งค่าดัชนีนี้เป็นระดับเสียงที่ปลอดภัยที่ 30

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

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

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

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

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

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

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

การออกแบบ

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

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

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

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

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

  • โทรกลับ

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

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

ภาพ

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

HAL API

AudioControl @ 3.0 AIDL

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

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

ลำดับ

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

ภาพ

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

แง่มุมที่สำคัญ

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

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

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

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