Quản lý số lượng

Tính năng quản lý âm lượng nằm trong CarAudioService, sử dụng các ổ đĩa cố định với kỳ vọng rằng các âm lượng được áp dụng bên dưới HAL bằng bộ khuếch đại phần cứng 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ức tăng cho tất cả các thiết bị liên kết với một nhóm âm lượng.

Âm lượng cố định

Các quá trình triển khai AAOS sử dụng bộ khuếch đại phần cứng để điều chỉnh â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ủ nếu cần):

<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 như mong muốn do các hiệu ứng tiềm ẩn đối với các ứng dụng khác và trên thực tế, sự suy giảm âm lượng trong bộ trộn phần mềm có thể làm giảm số bit quan trọng có sẵ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 của một tập hợp thiết bị trong một vùng âm thanh. Đối với mỗi nhóm âm lượng, bạn có thể kiểm soát âm lượng một cách độc lập. Mức tăng thu được được định cấu hình trên các thiết bị liên kết để bộ khuếch đại của xe áp dụng. Các chế độ cài đặt âm lượng được duy trì cho người dùng và sẽ 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="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>

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

Thiết lập mức tăng nhóm số lượng

Mỗi nhóm âm lượng có các giá trị mức tăng 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ị 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 chạy, nhóm âm lượng sẽ kiểm tra giá trị mức tăng của các thiết bị liên kết và định cấu hình nhóm như sau:

  • Kích thước bước. Phải giống nhau đối với tất cả cá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. Mức tăng tối đa cao nhất trong số các thiết bị trong nhóm.
  • Mức tăng mặc định. Mức tăng mặc định cao nhất trong số các thiết bị trong nhóm.

Do cách các giá trị này được định cấu hình, bạn có thể đặt mức tăng của một nhóm âm lượng nằm ngoài phạm vi được hỗ trợ cho thiết bị 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 âm lượng được đặt thành giá trị độ lợi tối thiểu hoặc tối đa của thiết bị dựa trên việc giá trị của nhóm âm lượng thấp hơn hay cao hơn phạm vi.

Giá trị nhận dạng nhóm tập

Các nhóm ổ đĩa được xác định trong thời gian chạy theo thứ tự đã xác định trong tệp XML. Các mã nhận dạng nằm trong khoảng 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 đó. Bằng cách này, mã nhóm âm lượng không phải là duy nhất giữa các vùng. Các giá trị nhận dạng này được dùng cho các API CarAudioManager liên kết với nhóm âm lượng. Mọi API lấy trong groupId mà không có zoneId sẽ mặc định chuyển thành vùng âm thanh chính.

Quản lý âm lượng trên nhiều vùng

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ỉ liên kết với một vùng âm thanh duy nhất. Mối quan hệ này được định nghĩa 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.

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

Xử lý các sự kiện chính về âm lượng

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

  • KEYCODE_VOLUME_UP
  • KEYCODE_VOLUME_DOWN
  • KEYCODE_VOLUME_MUTE

Theo mặc định, Android định tuyến các sự kiện chính về âm lượng đến các ứng dụng. Các quy trình triển khai Automotive phải buộc các sự kiện chính này được CarAudioService xử lý, sau đó gọi setGroupVolume hoặc setMasterMute nếu phù hợp. Để buộc thực hiện hành vi này, hãy đặt cờ config_handleVolumeKeysInWindowManager thành true:

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

Hiện tại, các sự kiện phím âm lượng không có cách nào để phân biệt được mục đích của các sự kiện đó và được giả định là tất cả đều liên kết với vùng âm thanh chính. Khi nhận được một sự kiện nhấn phím â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 ngữ cảnh âm thanh cho các 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 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 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 AudioControl HAL đều có các API để thiết lập độ mờ và độ cân bằng trên xe. Các API hệ thống tương ứng dành cho CarAudioManager truyền các giá trị đến HAL AudioControl. Các API này yêu cầu android.car.permission.CAR_CONTROL_AUDIO_VOLUME. Các API AudioControl bao gồm:

  • setBalanceTowardRight(float value) chuyển âm lượng loa về phía bên phải (+) hoặc trái (-) trên ô tô.

    • 0.0 được căn giữa
    • +1.0 là hoàn toàn chính xác
    • Còn lại hoàn toàn -1.0
    • Giá trị nằm ngoài phạm vi từ -1 đến 1 là lỗi
  • setFadeTowardFront(float value) chuyển âm lượng loa về phía trước (+) hoặc sau (-) ô tô.

    • 0.0 được căn giữa
    • +1,0 là chuyển tiếp hoàn toàn
    • -1.0 hoàn toàn ở phía sau
    • Giá trị nằm ngoài phạm vi từ -1 đến 1 là lỗi

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

Giảm âm thanh

Giảm âm thanh xảy ra khi xe giảm âm lượng cho một luồng để có thể nghe thấy 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. Ngoài hệ điều hành, Android không có quyền kiểm soát âm thanh. Trong Android 11, thông tin chính có sẵn cho HAL để đưa ra quyết định giảm thiểu là liệu 2 thiết bị đầu ra có đang hoạt động hay không.

Thời điểm nên giảm bớt

Mặc dù từng OEM (Nhà sản xuất thiết bị gốc) có quyền quyết định cách HAL xử lý tính năng giảm vị trí, nhưng bạn nên tuân thủ các nguyên tắc sau.

  • Nhiều luồng phát trong Android thường xảy ra khi 2 ứng dụng hoặc dịch vụ đồng thời giữ quyền phát â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 sự ra mắt của trình bổ trợ âm thanh cho ô tô, điều này cũng phụ thuộc vào khả năng quản lý AudioFocus.

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

Sau đây là một số loại tương tác có thể đồng thời được giảm bớt.

Tương tác Hành động
EMERGENCY Giảm âm thanh hoặc tắt tiếng mọi thứ trừ SAFETY
SAFETY Vịt mọi thứ trừ EMERGENCY
NAVIGATION Giảm mọi thứ ngoại trừ SAFETYEMERGENCY
CALL Giảm mọi thứ ngoại trừ SAFETY, EMERGENCYNAVIGATION
VOICE Vịt CALL_RING
VEHICLE_SOUNDS Bạn sẽ quyết định tầm quan trọng của âm thanh chủ động và liệu âm thanh đó có loại bỏ các âm thanh khác hay không.
MUSICANNOUNCEMENT Tôi bị thu hút bởi mọi thứ. Trường hợp 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 số lượt chuyển đổi

Một số ứng dụng và dịch vụ, chẳng hạn như điều hướng hoặc trợ lý, có thể sử dụng nhiều người chơi để thực hiện các thao tác. Tránh tăng âm lượng 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ức âm lượng đầy đủ trước khi bị giảm âm lượng trước khi phát lại lần tiếp theo từ thanh điều hướng hoặc ứng dụng trợ lý khởi động.

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

Âm thanh cảnh báo an toàn

Android 11 đã ra mắt API tiêu điểm â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ữ quyền phát âm thanh cho USAGE_EMERGENCY, thì không đả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 giúp xác định nên kết hợp hoặc tắt tiếng luồng nào từ Android để phát các âm thanh quan trọng về an toàn.

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

AAOS tách giao diện người dùng của 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 chỉ số này như mô tả trong phần Định cấu hình mức tăng nhóm số lượng. Việc phân tách này đảm bảo rằng bạn không cần thực hiện thay đổi nào 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 trên ô tô, packages/apps/Car/Settings/res/xml/car_volume_items.xml chứa các phần tử trên giao diện người dùng (tài nguyên tiêu đề và biểu tượng) liên kết với từng AudioAttributes.USAGE đã xác định. Tệp này cung cấp khả năng hiển thị hợp lý VolumeGroups đã xác định bằng cách sử dụng tài nguyên liên kết với trường hợp sử dụng nhận dạng đầu tiên có trong mỗi VolumeGroup.

Ví dụ: ví dụ sau đây xác định VolumeGroup bao gồm voice_communicationvoice_communication_signalling. Phương thức triển khai mặc định của giao diện người dùng cài đặt ô tô sẽ hiển thị VolumeGroup bằng cách sử dụng các tài nguyên liên kết với voice_communication vì đó là matc đầ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ị 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 của chế độ cài đặt âm lượng sử dụng các API CarAudioManager dựa trên VolumeGroup sau đây:

  • getVolumeGroupCount() để tìm hiểu số lượng thành phần điều khiển sẽ được vẽ.
  • getGroupMinVolume()getGroupMaxVolume() để sử dụng 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ề thay đổi âm lượng.

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

Các trường hợp sử dụng của nút bật/tắt tiếng và cập nhật âm lượng trên Automotive có nền tảng theo bối cảnh có thể xác định 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 tắt tiếng và âm lượng hiện tại từ ngăn xếp âm thanh trên ô tô cung cấp thông tin theo ngữ cảnh hạn chế. Để phục vụ tốt hơn cho các trường hợp sử dụng ô tô và khả năng mở rộng trong tương lai, CarVolumeGroupEvent đã được thêm vào Android 14. Mỗi sự kiện chứa ba loại thông tin quan trọng:

  • Danh sách CarVolumeGroupInfo
  • EventTypes (được liên kết bit)
  • Danh sách ExtraInfos

Thông tin nhóm ô tô

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

Loại sự kiện

Xác định khía cạnh nào của CarVolumeGroupInfo đã thay đổi. Các ứng dụng có thể sử dụng thông tin này để xác định các thay đổi và thực hiện hành động bắt buộc. 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 CarVolumeGroupInfo.getMaxVolumeGainIndex() truy vấn.

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

Loại sự kiện Thông tin nhóm ô tô
EVENT_TYPE_VOLUME_GAIN_INDEX_CHANGED CarvolumeGroupInfo.getVolumeGainIndex()
EVENT_TYPE_VOLUME_MIN_INDEX_CHANGED CarvolumeGroupInfo.getMinVolume7Index()
EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED CarLượngGroupInfo.getMaxVolumeGainIndex()
EVENT_TYPE_MUTE_CHANGED CarVolumeGroupInfo.isDisable()
EVENT_TYPE_VOLUME_BLOCKED_CHANGED CarVolumeGroupInfo.isBlocked()
EVENT_TYPE_ATTENUATION_CHANGED CarvolumeGroupInfo.isAttenuated()
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED CarVolumeGroupInfo.getAudioAttributes()

Thông tin bổ sung

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 ngữ 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 hiện tượng suy giảm 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ố tăng âm lượng.

Chúng tôi không thực thi bất kỳ quy trình nào đối với ExtraInfos. Bạn có toàn quyền quyết định quy trình dựa trên ExtraInfos. Ví dụ: nếu mức suy giảm 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 ngay từ đầu để ngăn người dùng thay đổi âm lượng. Những người khác có thể chọn hiện một thông báo ngắn 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 của ô tô phụ thuộc vào IAudioGainCallback của AudioControl HAL để cung cấp ExtraInfos được đề xuất. Để tìm hiểu thêm, hãy xem bài viết Lệnh gọi lại cách nhận âm thanh.

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

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

Android 14 cung cấp lệnh gọi lại mới cho các ứng dụng nền tảng và ứng dụng có đặc quyền để đă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 của ô tô không còn kích hoạt CarVolumeCallback. Điều này giúp ngăn chặn các điều kiện kích hoạt trùng lặp với cùng một ứng dụng cho cùng một sự kiện.

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

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

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

API HAL

AudioControl @2.0 AIDL

Phiên bản 2.0 của AudioControl AIDL HAL sẽ thêm API sau:

API Mục đích
IAudioControl#registerGainCallback Đăng ký một thực thể của IAudioGainCallback bằng HAL AudioControl.
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 nguyên nhân và AudioGainConfigInfo tương ứng, bao gồm:

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

Các lý do có thể phân loại chung như sau:

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

Loại quy định hạn chế

Kể từ AudioControl HAL AIDL V3, sau đây là các loại quy định hạn chế được hỗ trợ:

  • Ẩn
  • Chặn
  • Giới hạn
  • Suy giảm
Chế độ hạn chế đang hoạt động Thay đổi âm lượng do người dùng kích hoạt Bật/tắt chế độ tắt tiếng do người dùng kích hoạt
Ẩn ❌ (bật tiếng)

✔ (tắt tiếng)
Chặn
Giới hạn ❌ (vượt quá giới hạn)

✔ (dưới giới hạn)
Suy giảm

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

Hạn chế tắt tiếng

Các hạn chế tắt tiếng:

  • 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 sau:

  • Tắt tiếng người dùng. Được bậ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.

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

Đối với những người 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 bạn có bật một trong các tính năng tắt tiếng ở trên hay không.

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

Trường hợp tương tác: Tắt tiếng HAL đang hoạt động và Người dùng yêu cầu bật/tắt tiếng

Khi tính năng 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 sẽ được thay đổi thành true.
  • Yêu cầu bật tiếng của Người dùng sẽ được xử lý.
    • Lý do: Bạn phải luôn tuân thủ các yêu cầu ẩn của người dùng để bảo vệ quyền riêng tư của người dùng.

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

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

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

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

    • Lý do: Việc bật tiếng tiếng người dùng được 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 sự an toàn của 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 khả năng nhận biết của người dùng về mức âm thanh.

Trường hợp tương tác: Bật và tắt tiếng HAL (Lớp trừu tượng phần cứng) trong khi tính năng Tắt tiếng người dùng không có thay đổi nào

Thao tác bật/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, tính năng 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 đang tắt và hệ thống sẽ nhận được lệnh gọi lại tắt tiếng HAL để bật:

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

    • Lý do: Người dùng không thể cảm nhận được â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 tiếng nổ phát ra âm thanh và gây nguy hiểm cho sự an toàn của người dùng.

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

Khi tắt tiếng HAL (Lớp trừu tượng phần cứng) đang tắt khi tính năng Tắt tiếng người dùng đang 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 làm cho trạng thái tắt tiếng trở thành cố định 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 số lượng sẽ được xử lý bình thường.

Chặn

Các quy tắc hạn chế áp dụng cho việc chặn:

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

Khi chế độ Hạn chế chặn đang có hiệu lực, người dùng sẽ yêu cầu:

  • Âm lượng thay đổi không được xử lý.
  • Đã xử lý nút tắt tiếng.

Giới hạn

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

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Khi các quy định hạn chế theo quy định hạn chế có hiệu lực, người dùng sẽ yêu cầu:

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

    • Trong Giới hạn được xử lý
    • Vượt quá Giới hạn không được xử lý
  • Đã xử lý nút tắt tiếng.

Suy giảm

Các hạn chế về mức suy giảm:

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

Khi chế độ hạn chế về Mức suy giảm đang hoạt động, người dùng sẽ gửi các yêu cầu sau:

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

  • Đã xử lý nút tắt tiếng.

Cập nhật vào chỉ mục

Sau đây được coi là quá trình 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, HAL AudioControl 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 đã chỉ định. Đối tượng này chủ yếu được dùng làm 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ô. Việc cập nhật chỉ mục cũng được thông báo với Ứng dụng dưới dạng 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ỉ số này được chuyển đổi thành mức tăng âm lượng và gửi đến lớp trừu tượng phần cứng (HAL) cho âm thanh.

  • Các hoạt động triển khai của nhà cung cấp 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 (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ì lý do Android không xác định).

  • Cách nhà cung cấp triển khai điều kiện 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 dùng để lưu trữ và các lệnh gọi lại đến ứng dụng âm lượng. Chỉ mục mà người dùng yêu cầu là 30. Tuy nhiên, 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: Phát âm thanh lần đầu sau khi thoát khỏi chế độ tạm ngưng

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

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

  • Sau khi Android bị tạm ngưng (ví dụ: tiếp tục):

    • Nhà cung cấp Audio HAL/AudioControl HAL áp dụng một chỉ mục an toàn là 30 cho hệ thống âm thanh cục bộ.

    • Nhà cung cấp AudioControl HAL 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 dùng để duy trì và sử dụng các lệnh gọi lại riêng đến ứng dụng âm lượng để đồng bộ hoá chỉ mục. Chỉ mục số lượng trước khi tạm ngưng là 95. Tuy nhiên, sau khi tiếp tục, trình triển khai AudioControl HAL sẽ đặt chỉ mục này 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òng của xe (EOL).

    • Các nhà sản xuất ô tô muốn cập nhật cấu hình âm lượng tại EOL 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 việc tải không qua cửa hàng ứng dụng mà không cập nhật hình ảnh Android SW.

    • 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 biểu dịch vụ.

  2. Cấu hình thời gian chạy. Các hệ thống âm thanh trên ô tô hỗ trợ cấu hình bộ khuếch đại bên ngoài, đồng thời các ECU này có thể lưu trữ những 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 dùng để hỗ trợ nhu cầu sử dụng các tính năng âm thanh dựa trên nhu cầu ngày càng tăng, trong đó người dùng đăng ký sử dụng tính năng xử lý tín hiệu nâng cao trong một khoảng thời gian. Các cấu hình phạm vi ổ đĩa mới sẽ có hiệu lực trong thời gian thuê bao.

Thiết kế

Quá trình định cấu hình âm lượng động được thực hiện qua 3 giai đoạn:

  • Khám phá. Việc triển khai HAL AudioControl của nhà cung cấp khám phá các bản cập nhật mới về phạm vi âm lượng thông qua 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 xếp âm thanh trên ô tô sẽ cập nhật trạng thái của nhóm âm lượng bằng phạm vi âm lượng mới.

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

  • Gọi lại.

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

    • CarVolumeGroupEvent mang CarVolumeGroupInfo đã cập nhật, Loại sự kiện (nội dung đã thay đổi) và Thông tin bổ sung (lý do thay đổi).

hình ảnh

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

API HAL

AudioControl @ 3.0 AIDL

Phiên bản 3.0 của AudioControl AIDL HAL ra mắt các API sau đây:

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

Trình tự

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

hình ảnh

Hình 2. Sơ đồ trình tự cho cấu hình ổ đĩa độ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.

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

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

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