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

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

การใช้ปริมาณคงที่

การติดตั้งใช้งาน 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>

ตัวอย่างการใช้งาน car_audio_configuration.xml

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

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

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

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

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

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

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

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

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

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

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

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

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

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

หากต้องการบังคับให้มีลักษณะการทำงานนี้ ให้ตั้งค่า Flag config_handleVolumeKeysInWindowManager เป็น true

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

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

เฟดและปรับสมดุล

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

AudioControl API มีดังนี้

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

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

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

การลดเสียง

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

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

แม้ว่าแต่ละ OEM จะเป็นผู้กำหนดวิธีจัดการการลดเสียงของ HAL แต่เราขอแนะนำหลักเกณฑ์ทั่วไปบางอย่าง การเล่นสตรีมหลายรายการภายใน Android มักเกิดขึ้นเมื่อแอป/บริการ 2 แอป/บริการมีโฟกัสเสียงพร้อมกัน ด้วยเหตุนี้ โปรดดูตารางการโต้ตอบเพื่อดูว่า Android อาจให้โฟกัสพร้อมกันเมื่อใด และดูว่าสตรีม 2 รายการเล่นพร้อมกันได้เมื่อใด

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

ลักษณะการลดเสียงที่แนะนำ

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

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

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

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

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

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

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

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

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

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

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

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

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

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