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

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

การใช้ระดับเสียงคงที่

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

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

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

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

การลดเสียง

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

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

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

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

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

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

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

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

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