Quản lý phương tiện

Việc quản lý âm lượng nằm trong CarAudioService, sử dụng âm lượng cố định với kỳ vọng rằng âm lượng sẽ được bộ khuếch đại phần cứng áp dụng bên dưới HAL thay vì trong phần mềm. CarAudioService sắp xếp các thiết bị đầu ra thành các nhóm âm lượng để áp dụng cùng một mức tăng cho tất cả các thiết bị được liên kết với một nhóm âm lượng.

Khối lượng cố định

Các hoạt động triển khai AAOS sử dụng bộ khuếch đại phần cứng để điều khiển âm lượng thay vì bộ trộn phần mềm. Để tránh tác dụng phụ, hãy đặt cờ config_useFixedVolume thành true (lớp phủ khi cần thiết):

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

Khi cờ config_useFixedVolume không được đặt (hoặc được đặt thành false), các ứng dụng có thể gọi AudioManager.setStreamVolume() để thay đổi âm lượng theo loại luồng trong bộ trộn phần mềm. Điều này có thể không phải lúc nào cũng phù hợp do những ảnh hưởng tiềm ẩn đến các ứng dụng khác và thực tế là việc giảm âm lượng trong bộ trộn phần mềm có thể dẫn đến việc có ít bit đáng kể hơn trong tín hiệu khi bộ khuếch đại phần cứng nhận được.

Nhóm âm lượng

Nhóm âm lượng quản lý âm lượng cho một nhóm thiết bị trong một vùng âm thanh. Đối với mỗi nhóm âm lượng, bạn có thể điều chỉnh âm lượng một cách độc lập. Mức tăng thu được được thiết lập trên các thiết bị liên kết để bộ khuếch đại của xe áp dụng. Chế độ cài đặt âm lượng được duy trì cho người dùng và được tải khi người dùng đăng nhập.

Xác định nhóm âm lượng

CarAudioService sử dụng các nhóm âm lượng được xác định trong 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>

Mỗi nhóm âm lượng phải chứa một hoặc nhiều thiết bị đầu ra có địa chỉ được liên kết. Các địa chỉ này phải tương ứng với các thiết bị đầu ra được xác định trong audio_policy_configuration.xml.

Định cấu hình mức tăng của nhóm âm lượng

Mỗi nhóm âm lượng có các giá trị khuếch đại tối thiểu, tối đa và mặc định, cũng như kích thước bước dựa trên các giá trị được định cấu hình trong audio_policy_configuration.xml cho các thiết bị được liên kết với nhóm âm lượng.

<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>

Trong quá trình khởi tạo, nhóm âm lượng sẽ kiểm tra các giá trị khuếch đại của các thiết bị được liên kết và định cấu hình nhóm như sau:

  • Kích cỡ bước. Phải giống nhau đối với tất cả thiết bị do nhóm âm lượng kiểm soát.
  • Mức tăng tối thiểu. Mức tăng tối thiểu nhỏ nhất trong số các thiết bị trong nhóm.
  • Mức tăng tối đa. Độ tăng ích tối đa cao nhất trong số các thiết bị trong nhóm.
  • Độ khuếch đại mặc định. Mức tăng mặc định cao nhất trong số các thiết bị trong nhóm.

Với cách định cấu hình các giá trị này, bạn có thể đặt mức tăng của một nhóm âm lượng bên ngoài phạm vi được hỗ trợ cho một thiết bị được liên kết với nhóm âm lượng. Trong trường hợp này, đối với thiết bị đó, mức tăng được đặt thành giá trị mức tăng tối thiểu hoặc tối đa của thiết bị, tuỳ thuộc vào việc giá trị của nhóm âm lượng nằm dưới hay trên phạm vi.

Giá trị nhận dạng nhóm âm lượng

Các nhóm âm lượng được xác định trong thời gian chạy theo thứ tự được xác định trong tệp XML. Mã nhận dạng có phạm vi từ 0 đến N-1 trong một vùng âm thanh, trong đó N là số lượng nhóm âm lượng trong vùng đó. Theo cách này, mã nhận dạng nhóm ổ đĩa không phải là giá trị duy nhất trên các vùng. Các giá trị nhận dạng này được dùng cho các API CarAudioManager được liên kết với các nhóm số lượng lớn. Mọi API nhận groupId mà không có zoneId đều mặc định là vùng âm thanh chính.

Quản lý âm lượng nhiều khu vực

Mỗi vùng âm thanh dự kiến sẽ có một hoặc nhiều nhóm âm lượng và mỗi nhóm âm lượng chỉ được liên kết với một vùng âm thanh duy nhất. Mối quan hệ này được xác định là một phần của car_audio_configuration.xml. Để tìm hiểu thêm, hãy xem ví dụ ở trên trong phần Xác định nhóm âm lượng.

Mức âm lượng hiện tại cho từng vùng được duy trì cho người dùng liên kết với vùng đó. Các chế độ cài đặt này dành riêng cho từng khu vực, tức là nếu người dùng đăng nhập trên một màn hình được liên kết với khu vực chính, rồi sau đó đăng nhập vào một khu vực được liên kết với khu vực âm thanh phụ, thì mức âm lượng được tải và duy trì cho khu vực đầu tiên sẽ khác với mức âm lượng cho khu vực phụ.

Âm lượng kích hoạt tối thiểu và tối đa

Android 15 giới thiệu chế độ kiểm soát chỉ mục nhóm âm lượng để cải thiện độ an toàn và sự thoải mái cho người dùng trong hệ thống âm thanh trên ô tô. Điều này đạt được thông qua việc sử dụng âm lượng kích hoạt tối thiểu và tối đa, được định cấu hình trong cấu hình âm thanh trên ô tô (xem phần Xác định nhóm âm lượng). Bạn có thể bật tính năng này bằng cách đặt audioUseMinMaxActivationVolume thành true trong RRO của Dịch vụ ô tô.

Bạn có thể xác định nhiều mục activationVolumeConfig trong activationVolumeConfigs, mỗi mục đại diện cho một cấu hình kích hoạt tối thiểu và tối đa khác nhau. Mỗi activationVolumeConfig:

  • Phải chứa một name duy nhất trong tệp cấu hình âm thanh trên ô tô, để sau này có thể tham chiếu đến trong nhóm âm lượng (group).
  • Chỉ được chứa một activationVolumeConfigEntry.

Mỗi activationVolumeConfig đều chứa các thuộc tính sau:

  • minActivationVolumePercentage (số nguyên, 0-100, không bắt buộc, mặc định: 0): Chỉ định âm lượng kích hoạt tối thiểu theo tỷ lệ phần trăm.
  • maxActivationVolumePercentage (số nguyên, 0 – 100, không bắt buộc, mặc định: 100): Chỉ định âm lượng kích hoạt tối đa theo tỷ lệ phần trăm.
  • invocationType (chuỗi, không bắt buộc, mặc định: onPlaybackChanged): Xác định các điều kiện áp dụng âm lượng kích hoạt tối thiểu và tối đa:

    • onBoot: Chỉ áp dụng cho lần phát đầu tiên mới hoạt động trên một nhóm âm lượng sau khi khởi động.
    • onSourceChanged: Chỉ áp dụng cho một lượt phát mới hoạt động có nguồn ứng dụng hoặc UID đã thay đổi trên một nhóm âm lượng.
    • onPlaybackChanged: Áp dụng cho mọi lượt phát mới đang hoạt động trên một nhóm âm lượng.

CarAudioService quản lý mức kích hoạt tối thiểu và tối đa bằng cách giám sát các thành phần phụ âm thanh hiện đang hoạt động sau đây:

  • Các chương trình phát hiện tại
  • Trạng thái cuộc gọi hiện tại
  • Yêu cầu hiện tại về quyền truy cập âm thanh từ Audio Control HAL, trong đó yêu cầu về quyền truy cập âm thanh từ Audio Control HAL báo hiệu rằng quá trình phát âm thanh đang diễn ra bên ngoài Android

Hình ảnh sau đây cho thấy thông tin tổng quan cấp cao về việc quản lý số lượng kích hoạt tối thiểu và tối đa:

hình ảnh

Hình 1. Đường dẫn dữ liệu âm thanh đang hoạt động để quản lý âm lượng kích hoạt tối thiểu và tối đa.

Với minActivationVolumePercentage, maxActivationVolumePercentage, chỉ số tăng âm lượng tối thiểu và tối đa đã chỉ định, bạn có thể tính chỉ số tăng âm lượng kích hoạt tối thiểu và tối đa cho từng nhóm âm lượng. CarAudioService giám sát mọi lượt phát mới kích hoạt và áp dụng âm lượng kích hoạt tối thiểu và tối đa trong các điều kiện sau:

  • Loại lệnh gọi trùng khớp: Loại kích hoạt của chế độ phát (xuất phát từ Trình quản lý âm thanh, HAL điều khiển âm thanh hoặc Trình quản lý điện thoại) phải khớp với invocationType được chỉ định trong activationVolumeConfigEntry được liên kết với nhóm âm lượng.
  • Chỉ mục âm lượng nằm ngoài phạm vi: Chỉ mục tăng âm lượng hiện tại của nhóm âm lượng phải nằm ngoài phạm vi chỉ mục tăng âm lượng kích hoạt đã xác định, cụ thể là một trong những điều kiện sau đây phải đúng:

    • Chỉ số này thấp hơn chỉ số tăng thể tích kích hoạt tối thiểu được tính.

      HOẶC

    • Chỉ số này cao hơn chỉ số tăng âm lượng kích hoạt tối đa được tính toán.

Nếu có một lượt kích hoạt trùng khớp, chỉ mục tăng âm lượng của nhóm âm lượng sẽ được điều chỉnh thành một trong những chỉ mục sau:

  • Chỉ số tăng âm lượng kích hoạt tối thiểu nếu thấp hơn chỉ số tăng âm lượng kích hoạt tối thiểu

    HOẶC

  • Chỉ số tăng âm lượng kích hoạt tối đa nếu cao hơn chỉ số tăng âm lượng kích hoạt tối đa

Ngoài ra, một sự kiện nhóm âm lượng trên ô tô có loại sự kiện EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED sẽ được gửi đến tất cả các lệnh gọi lại sự kiện nhóm âm lượng đã đăng ký.

Xử lý các sự kiện liên quan đến phím âm lượng

Android xác định một số mã khoá để điều khiển âm lượng, bao gồm:

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Theo mặc định, Android sẽ định tuyến các sự kiện liên quan đến phím âm lượng đến các ứng dụng. Việc triển khai cho ô tô phải buộc CarAudioService xử lý các sự kiện chính này, sau đó gọi setGroupVolume hoặc setMasterMute (nếu thích hợp). Để buộc hành vi này, hãy đặt cờ config_handleVolumeKeysInWindowManager thành true:

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

Các sự kiện quan trọng liên quan đến phím âm lượng hiện không có cách nào phân biệt được vùng mà chúng nhắm đến và được giả định là tất cả đều được liên kết với vùng âm thanh chính. Khi nhận được một sự kiện khoá âm lượng, CarAudioService sẽ xác định nhóm âm lượng cần điều chỉnh bằng cách tìm nạp các ngữ cảnh âm thanh cho những trình phát đang hoạt động, sau đó điều chỉnh nhóm âm lượng chứa thiết bị đầu ra được liên kết với ngữ cảnh âm thanh có mức độ ưu tiên cao nhất. Mức độ ưu tiên được xác định dựa trên một thứ tự cố định được xác định trong CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY.

Làm mờ và cân bằng

Cả hai phiên bản của AudioControl HAL đều bao gồm các API để đặt độ mờ và cân bằng trong xe. Các API hệ thống tương ứng cho các giá trị truyền CarAudioManager đến AudioControl HAL. Các API này yêu cầu android.car.permission.CAR_CONTROL_AUDIO_VOLUME. Các API AudioControl là:

  • setBalanceTowardRight(float value) sẽ chuyển âm lượng của loa sang bên phải (+) hoặc bên trái (-) của xe.

    • 0.0 được đặt ở giữa
    • +1,0 là hoàn toàn đúng
    • -1.0 là hoàn toàn ở bên trái
    • Giá trị nằm ngoài phạm vi từ -1 đến 1 là một lỗi
  • setFadeTowardFront(float value) điều chỉnh âm lượng loa về phía trước (+) hoặc phía sau (-) của xe.

    • 0.0 được đặt ở giữa
    • +1.0 là hoàn toàn về phía trước
    • -1.0 là hoàn toàn về phía sau
    • Giá trị nằm ngoài phạm vi từ -1 đến 1 là một lỗi

Bạn quyết định cách áp dụng những giá trị này và cách hiển thị các giá trị cho người dùng. Các chế độ này có thể được áp dụng nghiêm ngặt cho nội dung nghe nhìn hoặc áp dụng trên diện rộng cho tất cả âm thanh trên Android. Android 11 cũng hỗ trợ việc áp dụng hiệu ứng âm thanh cho các thiết bị đầu ra. Nhờ đó, bạn có thể quản lý độ mờ và độ cân bằng thông qua hiệu ứng âm thanh trên các thiết bị đầu ra thích hợp thay vì thông qua các API này.

Giảm âm thanh

Hiệu ứng giảm âm thanh xảy ra khi xe giảm mức tăng của một luồng để có thể nghe rõ hơn một luồng khác đang phát đồng thời. Trong AAOS, tính năng giảm âm thanh được HAL triển khai. Android không kiểm soát được âm thanh ngoài hệ điều hành. Trong Android 11, thông tin chính mà HAL có thể sử dụng để đưa ra quyết định giảm âm lượng là liệu cả hai thiết bị đầu ra có luồng đang hoạt động hay không.

Khi nào nên cúi người

Mặc dù mỗi OEM sẽ tự quyết định cách HAL xử lý việc giảm âm lượng, nhưng bạn nên tuân theo các nguyên tắc sau.

  • Việc phát nhiều luồng trong Android thường xảy ra khi hai ứng dụng hoặc dịch vụ đồng thời giữ quyền ưu tiên âm thanh. Để tìm hiểu thời điểm Android có thể cấp tiêu điểm đồng thời, hãy xem ma trận tương tác trong phần Các loại hạn chế. Với việc ra mắt trình bổ trợ âm thanh trên ô tô, điều này cũng phụ thuộc vào việc quản lý AudioFocus của bạn.

  • Mọi luồng được Android trộn lẫn đều được thực hiện trước khi áp dụng bất kỳ mức tăng nào. Do đó, mọi luồng cần được giảm âm lượng khi phát đồng thời với một luồng khác đều phải được định tuyến đến các thiết bị đầu ra riêng biệt để HAL có thể áp dụng tính năng giảm âm lượng trước khi trộn các luồng đó.

Sau đây là những tương tác đồng thời tiềm ẩn mà bạn nên giảm âm lượng.

Tương tác Thao tác
EMERGENCY Giảm âm lượng hoặc tắt tiếng mọi thứ trừ SAFETY
SAFETY Hỗ trợ mọi thứ trừ EMERGENCY
NAVIGATION Giảm âm lượng mọi thứ trừ SAFETYEMERGENCY
CALL Giảm âm lượng mọi thứ trừ SAFETY, EMERGENCYNAVIGATION
VOICE Vịt CALL_RING
VEHICLE_SOUNDS Bạn xác định mức độ quan trọng của âm thanh đang phát và liệu âm thanh đó có làm giảm âm lượng của các âm thanh khác hay không.
MUSICANNOUNCEMENT Bị mọi thứ làm phiền. Ngoại lệ là các âm tương tác chạm được phát dưới dạng SYSTEM_SOUND.

Những điều cần cân nhắc khi giảm âm lượng

Một số ứng dụng và dịch vụ (chẳng hạn như ứng dụng chỉ đường hoặc trợ lý) có thể sử dụng nhiều trình phát để thực hiện các hành động. Tránh giảm âm lượng quá mức khi luồng dữ liệu ngừng truyền qua các thiết bị đầu ra để đảm bảo nội dung nghe nhìn không trở về âm lượng tối đa trước khi bị giảm âm lượng trước khi bắt đầu phát lần tiếp theo từ chế độ điều hướng hoặc một ứng dụng trợ lý.

Đối với những chiếc xe có nhiều vùng âm thanh và khả năng cách âm đủ tốt, bạn có thể định tuyến âm thanh đến các khu vực khác nhau trong xe thay vì giảm âm lượng. Ví dụ: chỉ dẫn đường có thể được chuyển đến loa tựa đầu của người lái xe trong khi vẫn phát nhạc trong cabin ở âm lượng bình thường.

Âm thanh quan trọng về an toàn

Android 11 đã giới thiệu API lấy nét âm thanh HAL. HAL đảm bảo các âm thanh quan trọng về độ an toàn được ưu tiên hơn các âm thanh khác. Nếu HAL giữ tiêu điểm âm thanh cho USAGE_EMERGENCY, thì không có gì đảm bảo rằng các ứng dụng và dịch vụ trên Android sẽ không phát âm thanh. HAL xác định những luồng nào trên Android cần được trộn hoặc tắt tiếng để phát âm thanh quan trọng về an toàn.

Định cấu hình giao diện người dùng của chế độ cài đặt âm lượng

AAOS tách biệt giao diện người dùng chế độ cài đặt âm lượng khỏi cấu hình nhóm âm lượng. Bạn có thể phủ các thành phần này lên nhau như mô tả trong phần Định cấu hình mức tăng của nhóm âm lượng. Việc tách biệt này đảm bảo rằng bạn không cần thay đổi gì nếu cấu hình của các nhóm âm lượng thay đổi.

Trong giao diện người dùng cài đặt ô tô, packages/apps/Car/Settings/res/xml/car_volume_items.xml chứa các phần tử giao diện người dùng (tài nguyên tiêu đề và biểu tượng) được liên kết với từng AudioAttributes.USAGE đã xác định. Tệp này cung cấp một bản kết xuất hợp lý của VolumeGroups đã xác định bằng cách sử dụng các tài nguyên được liên kết với mức sử dụng được nhận dạng đầu tiên có trong mỗi VolumeGroup.

Ví dụ: ví dụ sau đây xác định VolumeGroup là bao gồm voice_communicationvoice_communication_signalling. Việc triển khai mặc định của giao diện người dùng chế độ cài đặt ô tô sẽ kết xuất VolumeGroup bằng cách sử dụng các tài nguyên được liên kết với voice_communication vì đó là kết quả trùng khớp đầu tiên trong tệp.

<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>

Các thuộc tính và giá trị được dùng trong cấu hình trên được khai báo trong packages/apps/Car/Settings/res/values/attrs.xml. Giao diện người dùng chế độ cài đặt âm lượng sử dụng các CarAudioManager API dựa trên VolumeGroup sau đây:

  • getVolumeGroupCount() để tìm hiểu số lượng thành phần cần vẽ.
  • getGroupMinVolume()getGroupMaxVolume() để nhận được giới hạn dưới và giới hạn trên.
  • getGroupVolume() để lấy âm lượng hiện tại.
  • registerVolumeChangeObserver() để được thông báo về các thay đổi đối với âm lượng.

Sự kiện nhóm âm lượng ô tô

Các trường hợp sử dụng trên ô tô của chế độ cập nhật âm lượng và nút bật/tắt tiếng có cơ sở theo ngữ cảnh có thể xác định các thao tác của một số ứng dụng, chẳng hạn như chế độ cài đặt âm lượng. Lệnh gọi lại âm lượng và tắt tiếng hiện tại từ ngăn xếp âm thanh của ô tô cung cấp thông tin theo bối cảnh có giới hạn. Để phục vụ tốt hơn các trường hợp sử dụng ô tô và khả năng mở rộng trong tương lai, CarVolumeGroupEvent sẽ được thêm vào Android 14. Mỗi sự kiện mang theo 3 loại thông tin quan trọng:

  • Danh sách gồm CarVolumeGroupInfo
  • EventTypes (bit-mapped)
  • Danh sách gồm ExtraInfos

CarVolumeGroupInfo

Trình nhận lệnh gọi lại sự kiện có quyền truy cập sẵn vào danh sách thông tin nhóm âm lượng xe chịu ảnh hưởng. Điều này có nghĩa là ứng dụng không cần thực hiện thêm bất kỳ lệnh gọi nào đến Khung âm thanh trên ô tô để nhận trạng thái mới nhất. Bạn chỉ cần dùng CarVolumeGroupInfos đã nhận được để cập nhật giao diện người dùng hoặc trạng thái nội bộ. Để giúp các ứng dụng dễ dàng hơn, những khía cạnh đã thay đổi trong một nhóm âm lượng của ô tô cũng được cung cấp trong EventTypes, như giải thích bên dưới.

EventTypes

Xác định khía cạnh nào của CarVolumeGroupInfo đã thay đổi. Các ứng dụng có thể dùng thông tin này để xác định các thay đổi và thực hiện những hành động cần thiết. Ví dụ: EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED cho biết chỉ mục mức tăng âm lượng tối đa CarVolumeGroups tương ứng đã thay đổi và có thể được truy vấn bằng CarVolumeGroupInfo.getMaxVolumeGainIndex().

Bảng sau đây cho thấy mối quan hệ giữa EventTypeCarVolumeGroupInfo.

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

Cung cấp thêm thông tin về lý do CarVolumeGroup thay đổi. Các ứng dụng có thể sử dụng thông tin này để cung cấp thêm bối cảnh nhằm cảnh báo người dùng hành động hoặc thông báo. Ví dụ: EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL cho biết mức suy hao tạm thời đang hoạt động do quá tải nhiệt. Ứng dụng có thể thông báo cho người dùng nếu họ cố gắng tăng âm lượng.

Chúng tôi không áp dụng quy trình nào cho ExtraInfos. Bạn có thể tuỳ ý quyết định quy trình dựa trên ExtraInfos. Ví dụ: nếu tính năng giảm âm lượng đang hoạt động do EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED, bạn cũng có thể chọn làm mờ giao diện người dùng thanh âm lượng ban đầu để ngăn người dùng thay đổi âm lượng. Những ứng dụng khác có thể chọn hiện một thông báo tạm thời cho biết tính năng giảm âm lượng đang hoạt động và cho phép người dùng thay đổi âm lượng.

Khung âm thanh trên ô tô phụ thuộc vào AudioControl HAL IAudioGainCallback để cung cấp ExtraInfos được đề xuất. Để tìm hiểu thêm, hãy xem phần Lệnh gọi lại mức tăng âm thanh.

CarVolumeGroupEvent có thể mở rộng để đáp ứng nhu cầu trong tương lai của khung âm thanh trên ô tô. Chúng tôi dự định chỉ hỗ trợ các tính năng mới thông qua CarVolumeGroupEvent . Nhà phát triển ứng dụng nên sử dụng CarVolumeGroupEvent để xử lý các thay đổi về âm lượng và chế độ tắt tiếng của nhóm.

Lệnh gọi lại sự kiện nhóm âm lượng ô tô

Android 14 cung cấp một lệnh gọi lại mới để các ứng dụng đặc quyền và ứng dụng nền tảng đăng ký và nhận thông báo về CarVolumeGroupEvents.

  • Để đăng ký lệnh gọi lại, hãy sử dụng CarAudioManager#registerCarVolumeGroupEventCallback()

  • Để huỷ đăng ký lệnh gọi lại, hãy sử dụng CarAudioManager#unregisterCarVolumeGroupEventCallback()

Nếu một ứng dụng đăng ký bằng CarVolumeGroupEventCallback mới và CarVolumeCallback cũ, thì sự kiện CarVolumeGroupEventCallbacks sẽ được ưu tiên. Ngăn xếp âm thanh trên ô tô không còn kích hoạt CarVolumeCallback nữa. Điều này giúp ngăn chặn các điều kiện kích hoạt trùng lặp cho cùng một ứng dụng đối với cùng một sự kiện.

Bạn nên sử dụng CarVolumeGroupEventCallback để quản lý âm lượng nhóm và các thay đổi về chế độ tắt tiếng.

Lệnh gọi lại mức tăng âm thanh

Kể từ Android 13, AudioControl HAL có thể kích hoạt một lệnh gọi lại không đồng bộ để quản lý các bản cập nhật về mức âm lượng do những thay đổi đối với hệ thống âm thanh trên ô tô.

HAL API

AudioControl @2.0 AIDL

HAL AIDL AudioControl phiên bản 2.0 bổ sung API sau:

API Mục đích
IAudioControl#registerGainCallback Đăng ký một thực thể của IAudioGainCallback với AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Lệnh gọi lại không đồng bộ để thông báo về các thay đổi đối với cấu hình mức tăng âm thanh.

Lệnh gọi lại AudioControl HAL bao gồm danh sách các lý do và AudioGainConfigInfo tương ứng, bao gồm:

  • Mã nhận dạng khu vực
  • Địa chỉ cổng thiết bị
  • Chỉ mục âm lượng > chỉ mục có thể là chỉ mục bị hạn chế hoặc chỉ mục cập nhật.

Lý do có thể được phân loại chung như sau:

  • Lý do hạn chế. Thay đổi tạm thời về âm lượng và chế độ tắt tiếng.
  • Lý do cập nhật. Thay đổi vĩnh viễn hành vi âm lượng.

Các loại quy định hạn chế

Kể từ AudioControl HAL AIDL V3, các loại hạn chế được hỗ trợ bao gồm:

  • Tắt tiếng
  • Chặn
  • Hạn chế
  • Suy hao
Quy định hạn chế đang có hiệu lực Thay đổi âm lượng do người dùng kích hoạt Nút bật/tắt tiếng do người dùng kích hoạt
Tắt tiếng ❌ (bật tiếng)

✔ (tắt tiếng)
Chặn
Hạn chế ❌ (vượt quá hạn mức)

✔ (dưới hạn mức)
Suy hao

Mức độ ưu tiên giữa các hạn chế là Tắt tiếng > Chặn > Hạn chế > Giảm âm lượng.

Các hạn chế đối với tính năng tắt tiếng

Các quy định hạn chế đối với việc tắt tiếng là:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

Khung âm thanh trên ô tô duy trì nội bộ 2 trạng thái tắt tiếng này:

  • Ẩn người dùng. Được bật/tắt dựa trên yêu cầu của người dùng, thông qua CarAudioManager hoặc các sự kiện chính.

  • HAL tắt tiếng. Được bật/tắt dựa trên các quy định hạn chế về việc tắt tiếng nhận được thông qua lệnh gọi lại AudioGain.

Đối với các trình nghe như ứng dụng Cài đặt, trạng thái tắt tiếng tổng thể của nhóm âm lượng (CarVolumeGroupInfo.isMuted()) sẽ dựa trên việc có bật một trong các chế độ tắt tiếng ở trên hay không.

Khi chế độ tắt tiếng HAL được bật, mọi yêu cầu thay đổi âm lượng và yêu cầu bỏ tắt tiếng nhóm đều sẽ bị bỏ qua trong thời gian hạn chế.

Trường hợp tương tác: HAL ở chế độ tắt tiếng và Người dùng yêu cầu chuyển đổi chế độ Tắt tiếng

Khi chế độ tắt tiếng HAL được bật và chế độ tắt tiếng người dùng bị tắt:

  • Trạng thái tắt tiếng tổng thể của nhóm âm lượng được thay đổi thành true.
  • Các yêu cầu của Người dùng để bật chế độ tắt tiếng sẽ được xử lý.
    • Lý do: Yêu cầu tắt tiếng của người dùng phải luôn được thực hiện để bảo vệ quyền riêng tư của người dùng.

Khi tính năng tắt tiếng HAL được bật và tính năng tắt tiếng người dùng được bật:

  • Trạng thái tắt tiếng tổng thể của nhóm âm lượng được thay đổi thành true.

  • Các yêu cầu của Người dùng về việc tắt tiếng sẽ được xử lý NOT. Trạng thái tắt tiếng của người dùng trong bộ nhớ đệm vẫn được bật.

    • Lý do: Yêu cầu bỏ tắt tiếng của người dùng sẽ chỉ được thực hiện nếu không có quy định hạn chế nào đang có hiệu lực.

    • Lý do: Việc bật tiếng cho chế độ Tắt tiếng người dùng đã lưu vào bộ nhớ đệm có thể gây ra tiếng nổ ngoài ý muốn và gây nguy hiểm cho người dùng. Điều này đặc biệt đúng nếu trạng thái tắt tiếng được bật trong các chu kỳ đánh lửa, làm giảm nhận thức của người dùng về mức âm lượng.

Trường hợp tương tác: HAL Mute được bật và tắt trong khi User mute không thay đổi

Việc bật/tắt chế độ tắt tiếng HAL sẽ thay đổi trạng thái tắt tiếng tổng thể của nhóm âm lượng. Tuy nhiên, phương thức này không trực tiếp cập nhật trạng thái tắt tiếng của người dùng. Khi tính năng Tắt tiếng người dùng bị vô hiệu hoá và nhận được lệnh gọi lại HAL mute để bật:

  • Trạng thái tắt tiếng tổng thể của nhóm âm lượng được thay đổi thành true.
  • Các yêu cầu của Người dùng để thay đổi âm lượng sẽ NOT được xử lý trong khi HAL tắt tiếng được bật.

    • Lý do: Người dùng không thể nghe thấy âm thanh khi chế độ tắt tiếng đang bật. Việc cho phép thay đổi âm lượng có thể dẫn đến âm thanh quá lớn và gây nguy hiểm cho người dùng.

    • Lý do: Các ứng dụng âm lượng có thể đăng ký lệnh gọi lại và tự động kích hoạt lệnh huỷ tắt tiếng (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) mà không cần người dùng can thiệp, nếu đây là hành vi mà OEM mong đợi.

Khi tính năng tắt tiếng HAL bị tắt trong khi tính năng tắt tiếng người dùng bị tắt:

  • Trạng thái tắt tiếng của nhóm âm lượng được thay đổi thành false.

    Lý do: Việc duy trì trạng thái tắt tiếng và yêu cầu Người dùng bật tiếng có thể làm gián đoạn Người dùng một cách không cần thiết khi trạng thái tắt tiếng chuyển đổi thường xuyên.

  • Yêu cầu của người dùng về việc thay đổi âm lượng sẽ được xử lý như bình thường.

Chặn

Các quy định hạn chế chặn là:

  • Reasons.FORCED_MASTER_MUTE
  • Reasons.REMOTE_MUTE
  • Reasons.TCU_MUTE.

Khi các hạn chế về việc chặn đang hoạt động, yêu cầu của người dùng đối với:

  • Hệ thống sẽ không xử lý yêu cầu thay đổi âm lượng.
  • Bật/tắt tiếng được xử lý.

Hạn chế

Các hạn chế về giới hạn là:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Khi các hạn chế về Giới hạn đang hoạt động, yêu cầu của người dùng đối với:

  • Thay đổi âm lượng:

    • Được xử lý trong giới hạn
    • Những yêu cầu vượt quá giới hạn nêu trên sẽ không được xử lý
  • Bật/tắt tiếng được xử lý.

Suy hao

Các hạn chế về suy hao là:

  • Reasons.ADAS_DUCKING
  • Reasons.NAV_DUCKING
  • Reasons.PROJECTION_DUCKING

Khi các hạn chế về suy hao đang hoạt động, yêu cầu của người dùng đối với:

  • Thay đổi âm lượng đang được xử lý. Mức âm lượng hiện tại mới được đặt thành âm lượng đã giảm (thay vì âm lượng trước đó). Các thay đổi về âm lượng trong tương lai sẽ được thực hiện ở cấp này.

  • Đã xử lý yêu cầu bật/tắt tiếng.

Cập nhật chỉ mục

Sau đây được coi là bản cập nhật chỉ mục âm lượng không đồng bộ:Reasons.EXTERNAL_AMP_VOL_FEEDBACK.

Với lý do này, AudioControl HAL có thể cập nhật chỉ mục hiện tại của nhóm âm lượng thành chỉ mục được chỉ định. Đây chủ yếu là phản hồi từ hệ thống âm thanh cho yêu cầu thay đổi âm lượng từ Khung âm thanh trên ô tô. Nội dung cập nhật chỉ mục cũng được truyền đạt với Các ứng dụng dưới dạng một lệnh gọi lại CarVolumeGroupEvent để đồng bộ hoá chỉ mục.

Ví dụ

Trường hợp sử dụng: Người dùng cập nhật chỉ mục âm lượng thành 30

  • Người dùng sử dụng ứng dụng Âm lượng để thay đổi chỉ mục âm lượng thành 30.

  • Chỉ mục này được chuyển đổi thành mức tăng âm lượng và gửi đến HAL âm thanh.

  • Các chế độ triển khai của nhà cung cấp đối với Audio HAL sẽ nhận được mức tăng âm lượng mới và cập nhật hệ thống âm thanh (chẳng hạn như bộ khuếch đại bên ngoài).

  • Hệ thống âm thanh phản hồi rằng mức âm lượng chỉ được cập nhật lên chỉ mục 15 (vì những lý do mà Android không biết).

  • Các cách triển khai của nhà cung cấp đối với trình kích hoạt AudioControl HAL:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Dịch vụ âm thanh trên ô tô sử dụng chỉ mục mới từ lệnh gọi lại được dùng để duy trì và gọi lại cho ứng dụng âm lượng. Chỉ mục do người dùng yêu cầu là 30. Tuy nhiên, thông tin cập nhật phản hồi không đồng bộ của hệ thống âm thanh sẽ cập nhật chỉ mục thành 15.

Trường hợp sử dụng: Lần phát âm thanh đầu tiên sau khi thoát khỏi trạng thái tạm ngưng

  • Chỉ số âm lượng trước khi tạm dừng được đặt ở mức cao là 95 (phạm vi: [0-99]).

  • Android chuyển sang trạng thái tạm ngưng.

  • Khi Android tồn tại ở trạng thái tạm ngưng (ví dụ: tiếp tục):

    • Nhà cung cấp Audio HAL/AudioControl HAL áp dụng chỉ mục an toàn là 30 cho hệ thống âm thanh tại địa phương.

    • AudioControl HAL của nhà cung cấp cũng kích hoạt lệnh gọi lại cho chỉ mục an toàn:

    IAudioGainCallback.onAudioDeviceGainsChanged(SUSPEND_EXIT_VOL_LIMITATION, {...,  30 /* safe index */})
    
  • Dịch vụ âm thanh trên ô tô sử dụng chỉ mục mới từ lệnh gọi lại được dùng để duy trì và các lệnh gọi lại riêng của dịch vụ này cho ứng dụng âm lượng đồng bộ hoá chỉ mục. Chỉ số âm lượng trước khi tạm ngưng là 95. Tuy nhiên, sau khi tiếp tục, chỉ mục này sẽ được trình triển khai AudioControl HAL đặt thành mức âm lượng an toàn là 30.

Cấu hình âm lượng động

Đối với tính năng này, chúng tôi xem xét các trường hợp sử dụng chính sau đây:

  1. Cấu hình cuối dây chuyền sản xuất (EOL) của xe.

    • Các nhà sản xuất ô tô muốn cập nhật cấu hình âm lượng tại thời điểm kết thúc vòng đời dựa trên chế độ thiết lập hệ thống âm thanh của xe. Thông thường, đây là một quy trình tải lên từ bên ngoài mà không cần cập nhật hình ảnh phần mềm Android.

    • Các nhà sản xuất ô tô có thể cần cập nhật cấu hình âm lượng trong lịch trình bảo dưỡng.

  2. Cấu hình thời gian chạy. Hệ thống âm thanh trên ô tô hỗ trợ các cấu hình bộ khuếch đại bên ngoài và các ECU này có thể lưu trữ các cấu hình phạm vi âm lượng được truy vấn trong thời gian khởi động.

  3. Cấu hình theo yêu cầu. Được cung cấp để đáp ứng nhu cầu ngày càng tăng về các tính năng âm thanh theo yêu cầu, trong đó người dùng đăng ký dịch vụ xử lý tín hiệu nâng cao trong một khoảng thời gian. Cấu hình phạm vi âm lượng mới có hiệu lực trong thời gian của gói thuê bao.

Thiết kế

Cấu hình âm lượng linh hoạt được thực hiện qua 3 giai đoạn:

  • Khám phá. Việc triển khai AudioControl HAL của nhà cung cấp sẽ phát hiện các bản cập nhật phạm vi âm lượng mới thông qua một cơ chế IPC tuỳ chỉnh do nhà cung cấp sở hữu.

    Sau khi phát hiện, một lệnh gọi lại sẽ được tạo thông qua AudioControl::IModuleChangeCallback.

  • Cập nhật. Ngăn âm thanh trên ô tô sẽ cập nhật trạng thái nhóm âm lượng bằng các dải âm lượng mới.

    Chúng tôi nỗ lực duy trì mức âm lượng như cũ sau khi cập nhật dải âm lượng. Tuy nhiên, nếu chỉ mục nằm ngoài phạm vi, thì chỉ mục âm lượng hiện tại sẽ được đặt thành một giá trị an toàn. Ví dụ: cấp độ mặc định do nhà cung cấp cung cấp trong quá trình gọi lại.

  • Gọi lại.

    • Sau khi đăng các bản cập nhật phạm vi nhóm âm lượng, ngăn xếp âm thanh của ô tô sẽ kích hoạt một lệnh gọi lại cho các ứng dụng đã đăng ký thông qua CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent chứa CarVolumeGroupInfo, Event-type (thay đổi gì) và Extra-info (lý do thay đổi) mới nhất.

hình ảnh

Hình 2. Cấu hình âm lượng linh hoạt.

HAL API

AudioControl @ 3.0 AIDL

Phiên bản 3.0 của AudioControl AIDL HAL giới thiệu các API sau:

API
IAudioControl#setModuleChangeCallback Thiết lập một thực thể của IModuleChangeCallback bằng AudioControl HAL.
IAudioControl#clearModuleChangeCallback Xoá thực thể IModuleChangeCallback đã đặt trước đó bằng AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Lệnh gọi lại để thông báo các thay đổi đối với AudioPort

Trình tự

Sơ đồ trình tự của cấu hình âm lượng động xuất hiện bên dưới.

hình ảnh

Hình 3. Sơ đồ trình tự cho cấu hình âm lượng động.

Các khía cạnh chính

Để tối ưu hoá tính năng này, hãy cân nhắc những điều sau.

  • AudioPort được cung cấp trong lệnh gọi lại phải khớp với định nghĩa BUS của Automotive:

    • Cổng thiết bị. IN_DEVICE, OUT_DEVICE
    • Kết nối. BUS
    • Địa chỉ. Được xác định trong định nghĩa HAL âm thanh
    • Chế độ khuếch đại. JOINT
  • Các nhà cung cấp phải xác định một siêu tập hợp các định nghĩa về phạm vi âm lượng trong chính sách Audio HAL và sử dụng lệnh gọi lại để tuỳ chỉnh chính sách đó cho các biến thể của xe. Hãy xem định nghĩa AIDL IModuleChangeCallbac để biết thêm thông tin.

  • Khi có nhiều BUS âm thanh thuộc cùng một nhóm âm lượng, mỗi BUS phải có định nghĩa phạm vi âm lượng giống hệt nhau. Nếu không, khung âm thanh trên ô tô sẽ từ chối định nghĩa phạm vi âm lượng mới.