Cấu hình âm thanh ô tô

Trong Android 10, car_audio_configuration.xml đã thay thế car_volumes_groups.xmlIAudioControl.getBusForContext. Các tệp chính sách âm thanh, thường nằm trong phân vùng của nhà cung cấp, đại diện cho cấu hình phần cứng âm thanh của bo mạch. Tất cả thiết bị được tham chiếu trong car_audio_configuration.xml phải được xác định trong audio_policy_configuration.xml.

Hình 1 bên dưới minh hoạ thông tin tổng quan cấp cao về cấu trúc dịch vụ âm thanh trên ô tô, trong đó dịch vụ âm thanh trên ô tô đọc tệp cấu hình âm thanh trên ô tô để thiết lập âm thanh cho thiết bị.

Tổng quan về cấu trúc âm thanh trên ô tô

Hình 1. Tổng quan về kiến trúc âm thanh trên ô tô.

Đặt tệp cấu hình âm thanh trên ô tô trong vendor\etc\ hoặc system\etc\ trên thiết bị, trong đó vendor\etc\ là vị trí đầu tiên mà dịch vụ âm thanh trên ô tô tìm kiếm tệp. Dịch vụ âm thanh trên ô tô đọc car_audio_configuration.xml để xác định cấu hình âm thanh.

Vùng âm thanh trên ô tô:

  • Mỗi vùng âm thanh chứa một mã nhận dạng vùng âm thanh duy nhất.
  • Bạn có thể liên kết từng vùng âm thanh với một vùng người ngồi.
  • Các thao tác âm thanh trong mỗi vùng độc lập với nhau:

    • Quyền phát âm thanh
    • Định tuyến âm thanh
    • Giảm âm thanh
  • Nhóm âm lượng trên ô tô:

    • Tất cả thiết bị âm thanh chứa một nhóm âm lượng đều được điều khiển cùng nhau bằng cùng một thay đổi về mức tăng. Cấu hình tăng âm thanh cho tất cả thiết bị trong một nhóm phải giống nhau.

    • Liên kết ngữ cảnh âm thanh với thiết bị âm thanh. Sử dụng lớp này để tạo một bản phối âm thanh liên kết việc sử dụng âm thanh với một thiết bị đầu ra.

    • Tất cả ngữ cảnh âm thanh phải được thể hiện trong một vùng. Điều này cho phép thiết lập chính xác việc định tuyến âm thanh cho tất cả các trường hợp sử dụng thuộc tính âm thanh.

Ngữ cảnh âm thanh

Để đơn giản hoá cấu hình âm thanh AAOS, các cách sử dụng tương tự đã được nhóm vào CarAudioContexts. Các ngữ cảnh âm thanh này được sử dụng trong toàn bộ CarAudioService để xác định việc định tuyến, nhóm âm lượng, tiêu điểm âm thanh và quản lý chế độ giảm âm thanh. Dưới đây là danh sách các ngữ cảnh âm thanh tĩnh trong AAOS.

Bảng này mô tả mối liên kết giữa ngữ cảnh âm thanh và cách sử dụng. Các hàng được làm nổi bật được cung cấp cho một mức sử dụng hệ thống mới.

CarAudioContext Các AttributeUsages được liên kết
ÂM NHẠC UNKNOWN
GAME
MEDIA
ĐIỀU HƯỚNG ASSISTANCE_NAVIGATION_GUIDANCE
VOICE_COMMAND ASSISTANT
ASSISTANCE_ACCESSIBILITY
CALL_RING NOTIFICATION_RINGTONE
GỌI VOICE_COMMUNICATION
VOICE_COMMUNICATION_SIGNALING
BÁO THỨC ALARM
THÔNG BÁO NOTIFICATION
NOTIFICATION_*
SYSTEM_SOUND ASSISTANCE_SONIFICATION
KHẨN CẤP EMERGENCY
AN TOÀN SAFETY
VEHICLE_STATUS VEHICLE_STATUS
THÔNG BÁO ANNOUNCEMENT

Bật tính năng định tuyến AAOS

Để sử dụng tính năng định tuyến dựa trên AAOS, bạn phải đặt cờ audioUseDynamicRouting thành true:

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

Khi false, tính năng định tuyến và phần lớn CarAudioService bị tắt, AAOS sẽ quay lại hành vi mặc định của AudioService.

Vùng chính

Theo mặc định, tất cả âm thanh sẽ được chuyển đến vùng chính. Chỉ có một vùng chính tồn tại, được chỉ định trong cấu hình bằng thuộc tính isPrimary="true". Vùng chính được tự động chỉ định Audiomanager.PRIMARY_AUDIO_ZONE.

Cấu hình mẫu (phiên bản 2)

Ví dụ: một xe có thể có hai vùng, một vùng chính và một hệ thống giải trí ở hàng ghế sau. Trong trường hợp này, bạn có thể thiết kế car_audio_configuration.xml phiên bản 2 như sau:

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true">
           <volumeGroups>
               <group>
                   <device address="bus0_media_out">
                       <context context="music"/>
                       <context context="announcement"/>
                   </device>
                   <device address="bus3_call_ring_out">
                       <context context="call_ring"/>
                   </device>
                   <device address="bus6_notification_out">
                       <context context="notification"/>
                   </device>
               </group>
               <group>
                   <device address="bus1_navigation_out">
                       <context context="navigation"/>
                   </device>
                   <device address="bus2_voice_command_out">
                       <context context="voice_command"/>
                   </device>
               </group>
               <group>
                   <device address="bus4_call_out">
                       <context context="call"/>
                   </device>
               </group>
               <group>
                   <device address="bus5_alarm_out">
                       <context context="alarm"/>
                   </device>
               </group>
               <group>
                   <device address="bus7_system_sound_out">
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                   </device>
               </group>
           </volumeGroups>
       </zone>
        <zone name="rear seat zone" audioZoneId="1">
           <volumeGroups>
               <group>
                   <device address="bus100_rear_seat">
                       <context context="music"/>
                       <context context="navigation"/>
                       <context context="voice_command"/>
                       <context context="call_ring"/>
                       <context context="call"/>
                       <context context="alarm"/>
                       <context context="notification"/>
                       <context context="system_sound"/>
                       <context context="emergency"/>
                       <context context="safety"/>
                       <context context="vehicle_status"/>
                       <context context="announcement"/>
                   </device>
               </group>
           </volumeGroups>
    </zones>
</audioZoneConfiguration>

Trong ví dụ này, vùng chính tách một số ngữ cảnh âm thanh cho các thiết bị khác nhau. Điều này cho phép HAL áp dụng nhiều hiệu ứng xử lý hậu kỳ và kết hợp đầu ra trên mỗi thiết bị bằng cách sử dụng phần cứng của xe. Các thiết bị đã được sắp xếp thành một số nhóm âm lượng: nội dung nghe nhìn, điều hướng, cuộc gọi, chuông báo và âm thanh hệ thống. Nếu hệ thống được định cấu hình thành useFixedVolume, thì các mức âm lượng cho mỗi nhóm sẽ được truyền đến HAL để áp dụng cho đầu ra của các thiết bị này.

Đối với vùng chính, bạn nên tách biệt âm thanh hệ thống với các âm thanh khác. Điều này cho phép xử lý âm thanh của xe với mức độ ưu tiên cao hơn. Dịch vụ âm thanh trên ô tô đã tạo ra những điểm khác biệt này cho âm thanh của xe về việc quản lý tiêu điểm và chế độ giảm âm. Ví dụ: yêu cầu lấy tiêu điểm âm thanh khẩn cấp có mức độ ưu tiên cao hơn yêu cầu lấy tiêu điểm khác.

Để đơn giản hoá, trong ví dụ về vùng phụ, tất cả ngữ cảnh âm thanh đều được định tuyến đến một thiết bị và một nhóm âm lượng.

Cấu hình âm thanh của vùng người ngồi

Trong Android 11, car_audio_configuration.xml đã ra mắt hai trường mới là audioZoneIdoccupantZoneId. Bạn có thể sử dụng audioZoneId để kiểm soát việc quản lý vùng âm thanh. Bạn có thể sử dụng occupantZoneId để định cấu hình định tuyến dựa trên mã nhận dạng người dùng.

Xem lại cấu hình âm thanh ở trên, nhưng sử dụng trường mới để liên kết mã nhận dạng khu vực người ngồi và mã nhận dạng khu vực âm thanh, bạn có thể thiết lập cấu hình mới mà không cần định nghĩa nhóm âm lượng như sau.

<audioZoneConfiguration version="2.0">
       <zone name="primary zone" isPrimary="true" occupantZoneId="0">
         ...
       </zone>
       <zone name="rear seat zone" audioZoneId="1" occupantZoneId="1">
         ...
       </zone>
    </zones>
</audioZoneConfiguration>

Cấu hình ở trên xác định mối liên kết cho vùng chính với vùng người ngồi 0 và audioZoneId 1 với occupantZoneId 1. Nhìn chung, bạn có thể định cấu hình mọi mối liên kết giữa vùng người ngồi và vùng âm thanh. Tuy nhiên, mối liên kết phải là một với một. Dưới đây là các quy tắc xác định hai trường mới.

  • audioZoneId cho vùng chính luôn là mã PRIMARY_AUDIO_ZONE. Nếu bạn đã xác định isPrimary="true", thì bạn không cần phải xác định audioZoneId.

  • Không được lặp lại số audioZoneIdoccupantZoneId.

  • audioZoneIdoccupantZoneId chỉ có thể có mối liên kết một với một.

Cấu hình âm thanh trên ô tô của Android 14

Trong Android 14, AAOS đã ra mắt dịch vụ trình bổ trợ OEM, cho phép bạn chủ động quản lý hành vi âm thanh do dịch vụ âm thanh trên ô tô giám sát. Cùng với các dịch vụ trình bổ trợ mới, các thay đổi sau đây sẽ được thêm vào tệp cấu hình âm thanh trên ô tô:

  • Ngữ cảnh âm thanh trên ô tô do OEM xác định
  • Cấu hình động của vùng không phải vùng chính

Ngữ cảnh âm thanh trên ô tô do OEM xác định

Để bật cấu hình âm thanh linh hoạt, trong Android 14, dịch vụ âm thanh trên ô tô cho phép các hoạt động sử dụng âm thanh được nhóm theo cách khác với Ngữ cảnh âm thanh tĩnh được xác định ở trên. Bạn có thể xác định ngữ cảnh do OEM xác định này trong tệp car_audio_configuration.xml phiên bản 3.

Thay vào đó, các ngữ cảnh âm thanh tĩnh hiện được xác định sẽ được sử dụng. Dưới đây là định dạng chung của ngữ cảnh âm thanh trên ô tô do OEM xác định.

Mỗi ngữ cảnh OEM đều yêu cầu một name cùng với danh sách sử dụng thuộc tính âm thanh được chỉ định cho ngữ cảnh đó. Trong ví dụ trên, hai ngữ cảnh được xác định:

<carAudioConfiguration version="3">
    <oemContexts>
        <oemContext name="media">
            <audioAttributes>
                <usage value="AUDIO_USAGE_MEDIA" />
    <usage value="AUDIO_USAGE_UNKNOWN"/>
            </audioAttributes>
        </oemContext>
        <oemContext name="game">
            <audioAttributes>
                <usage value="AUDIO_USAGE_GAME" />
            </audioAttributes>
        </oemContext>
...
  • Ngữ cảnh media chứa AUDIO_USAGE_MEDIAAUDIO_USAGE_UNKNOWN
  • Ngữ cảnh game chỉ chứa AUDIO_USAGE_GAME

Bạn phải xác định ngữ cảnh ở đầu tệp car_audio_configuration.xml. Khi ngữ cảnh OEM được xác định, phần còn lại của cấu hình âm thanh trên ô tô có thể tiếp tục như trước. Các quy tắc sau đây áp dụng cho ngữ cảnh âm thanh trên ô tô:

  • Bạn không bắt buộc phải xác định ngữ cảnh của nhà sản xuất thiết bị gốc. Thay vào đó, hãy sử dụng Ngữ cảnh âm thanh tĩnh.

  • Đừng lặp lại tên ngữ cảnh.

  • Không chỉ định việc sử dụng thuộc tính âm thanh cho nhiều ngữ cảnh.

  • Bạn nên sử dụng tất cả các cách sử dụng âm thanh được xác định trong AudioAttributes để tạo ngữ cảnh.

Nói một cách nghiêm ngặt, bạn phải sử dụng chuỗi đại diện android.audio.policy.configuration.V7_0.AudioUsage cho việc sử dụng âm thanh để xác định ngữ cảnh âm thanh của OEM. Trong tương lai, các cách sử dụng thuộc tính âm thanh mới hơn sẽ được chỉ định cho ngữ cảnh phù hợp nhất để giảm lỗi khi di chuyển từ phiên bản Android này sang phiên bản Android khác.

Mặc dù ngữ cảnh do OEM xác định được giới thiệu để mở rộng thêm dịch vụ âm thanh của trình bổ trợ OEM, nhưng bạn vẫn có thể sử dụng ngữ cảnh này mà không cần dịch vụ trình bổ trợ OEM. Hành vi âm thanh tương tự như hành vi của dịch vụ âm thanh tĩnh:

  • Tương tác với quyền phát âm thanh. Thuộc tính âm thanh được dùng để xác định hành vi phù hợp nhất do ma trận tương tác tiêu điểm âm thanh thiết lập. Để biết thông tin chi tiết, hãy xem phần Quyền phát âm thanh.

  • Thuộc tính âm thanh điều khiển âm lượng được dùng để xác định nội dung phù hợp nhất:

    • Nhóm âm lượng dựa trên ngữ cảnh do OEM xác định.
    • Mức độ ưu tiên trong danh sách phương tiện tĩnh đã định cấu hình.
  • Hành vi giảm âm thanh:

    • Mức sử dụng thuộc tính âm thanh cho tiêu điểm âm thanh hiện tại được dùng để liên kết với thông tin thiết bị âm thanh đầu ra như được xác định trong tệp cấu hình âm thanh trên ô tô.

    • Thuộc tính âm thanh được dùng để ánh xạ ngữ cảnh tĩnh tương ứng với tính năng giảm âm, dựa trên ma trận giảm âm thanh tĩnh.

Cấu hình vùng âm thanh động

Trong Android 14, để phù hợp với cấu hình vùng âm thanh động, giản đồ cấu hình âm thanh trên ô tô để xác định vùng âm thanh cũng được cập nhật lên phiên bản 3. Giản đồ mới yêu cầu bạn thiết lập cấu hình cho từng vùng.

<carAudioConfiguration version="3">
    <!-- optional OEM context -->
    <oemContexts>
      <oemContext name="media">
        <audioAttributes>
          <usage value="AUDIO_USAGE_MEDIA" />
          <usage value="AUDIO_USAGE_UNKNOWN"/>
        </audioAttributes>
      </oemContext>
      <oemContext name="game">
        <audioAttributes>
          <usage value="AUDIO_USAGE_GAME" />
        </audioAttributes>
      </oemContext>
...
    </oemContexts>
  <zones>
    <zone name="primary zone" isPrimary="true" occupantZoneId="0">
      <zoneConfigs>
        <zoneConfig name="primary zone config 0" isDefault="true">
          <volumeGroups>
            <group>
              <device address="bus0_media_out">
                <context context="media"/>
            <context context="game"/>
                <context context="announcement"/>
              </device>
              <device address="bus6_notification_out">
                <context context="notification"/>
              </device>
            </group>
  ...
      </zoneConfigs>
    </zone
  </zones>

Để tìm hiểu thêm, hãy xem tệp phiên bản 3 được xác định trong device/generic/car/emulator/audio/car_audio_configuration.xml. Kể từ Android 14, vùng chính chỉ có thể có một (1) cấu hình. Các vùng không phải vùng chính có thể có nhiều cấu hình. Các quy tắc sau đây áp dụng cho cấu hình âm thanh trên ô tô:

  • Vùng âm thanh chính chỉ có thể có một cấu hình.

  • Các vùng âm thanh không phải chính có thể có nhiều cấu hình.

  • Tên phải là duy nhất cho từng vùng âm thanh và cấu hình vùng âm thanh.

  • Trong một vùng âm thanh, cấu hình âm thanh có thể khác nhau:

    • Bạn không cần thiết lập các nhóm âm lượng giống nhau.
    • Việc chỉ định ngữ cảnh âm thanh không nhất thiết phải giống nhau.
  • Tên thiết bị đầu ra âm thanh phải là duy nhất trên các vùng hoặc cấu hình. Tên thiết bị chỉ được xuất hiện một lần trong cấu hình âm thanh hoặc các vùng.

  • Các thiết bị âm thanh thuộc cùng một nhóm âm lượng phải có cùng cấu hình tăng âm thanh.

  • Tất cả ngữ cảnh âm thanh (OEM hoặc tĩnh) phải được chỉ định cho mỗi cấu hình âm thanh.

Khả năng tương thích chuyển tiếp

Mặc dù các phiên bản mới của car_audio_configuration.xml giới thiệu các tính năng mới trong mỗi bản cập nhật, nhưng bạn vẫn có thể sử dụng các tệp cũ trong các phiên bản mới hơn của AAOS. Các nhà sản xuất thiết bị gốc (OEM) cập nhật lên các phiên bản Android mới có thể sử dụng lại tệp car_audio_configuration.xml.

Để sử dụng một tính năng mới yêu cầu thông tin mới có trong car_audio_configuration.xml, bạn phải cập nhật phiên bản. Việc cố gắng sử dụng phiên bản cũ của tệp có thông tin không được hỗ trợ trong phiên bản tệp đó sẽ gửi một IllegalStateException khi dịch vụ ô tô bắt đầu. Thông báo ngoại lệ chứa thông tin liên quan về thông tin nào được sử dụng và phiên bản tối thiểu nào được yêu cầu.