Quản lý khối lượng

Quản lý âm lượng được chứa trong CarAudioService , sử dụng các âm lượng cố định với mong muốn rằng các âm lượng được áp dụng dưới mức HAL bởi 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ị được liên kết với một nhóm âm lượng.

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

Việc 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ủ 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 ), ứ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 được mong muốn do các tác động tiềm ẩn đối với các ứng dụng khác và thực tế là sự suy giảm âm lượng trong bộ trộn phần mềm có thể dẫn đến ít bit quan trọng hơn 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 cho một tập hợp thiết bị trong vùng âm thanh. Đối với mỗi nhóm âm lượng, âm lượng có thể được điều khiển độc lập. Mức tăng thu được được định cấu hình trên các thiết bị liên quan để áp dụng cho bộ khuếch đại của xe. 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 khối 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 âm lượng phải chứa một hoặc nhiều thiết bị đầu ra có địa chỉ liên quan. Địa chỉ phải tương ứng với thiết bị đầu ra được xác định trong audio_policy_configuration.xml .

Định cấu hình mức tăng 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 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:

  • Cỡ bước chân. Phải giống nhau đối với tất cả các thiết bị được điều khiển bởi nhóm âm lượng.
  • Đạt được 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.
  • Đạt được 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.

Dựa vào cách định cấu hình các giá trị này, có thể đặt mức tăng của nhóm âm lượng nằm ngoài phạm vi được hỗ trợ cho 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ị dựa trên việc giá trị của nhóm âm lượng nằm dưới hay trên phạm vi.

Mã định danh nhóm khối lượng

Các nhóm khối lượng được xác định trong thời gian chạy theo thứ tự được xác định trong tệp XML. ID nằm trong khoảng từ 0 đến N-1 trong vùng âm thanh, trong đó N là số nhóm âm lượng trong vùng đó. Bằng cách này, ID nhóm tập không phải là duy nhất giữa các vùng. Những giá trị nhận dạng này được sử dụng cho các API CarAudioManager được liên kết với các nhóm âm lượng. Bất kỳ API nào 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 đa 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ỉ đượ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 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 được liên kết với vùng đó. Các cài đặt này dành riêng cho từng vùng, nghĩa là nếu người dùng đăng nhập trên màn hình được liên kết với vùng chính, sau đó đăng nhập vào vùng được 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 các mức âm lượng dành cho khu thứ cấp.

Xử lý các sự kiện phím âm lượng

Android xác định một số mã khóa để đ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 phím âm lượng tới ứng dụng. Việc triển khai ô tô phải buộc CarAudioService xử lý các sự kiện quan trọng 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 phím âm lượng hiện không có cách nào để phân biệt chúng dành cho vùng nào và được cho là tất cả đều được liên kết với vùng âm thanh chính. Khi nhận được sự kiện phím âm lượng, CarAudioService xác định nhóm âm lượng nào cần điều chỉnh bằng cách tìm nạp ngữ cảnh âm thanh cho 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 thứ tự cố định được xác định trong CarVolume.AUDIO_CONTEXT_VOLUME_PRIORITY .

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

Cả hai phiên bản AudioControl HAL đều bao gồm các API để cài đặt độ mờ và độ cân bằng trong xe. Các API hệ thống tương ứng cho CarAudioManager chuyển các giá trị tới 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) chuyển âm lượng loa về phía bên phải (+) hoặc bên trái (-) của ô tô.

    • 0,0 là trung tâm
    • +1.0 là hoàn toàn đúng
    • -1.0 còn lại hoàn toàn
    • 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 phía sau (-) của ô tô.

    • 0,0 là trung tâm
    • +1.0 hoàn toàn chuyển tiếp
    • -1.0 nằm 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ị đó cho người dùng. Chúng có thể được áp dụng nghiêm ngặt cho phương tiện truyền thông hoặc trên diện rộng cho tất cả âm thanh của Android. Android 11 cũng giới thiệu hỗ trợ áp dụng hiệu ứng âm thanh cho các thiết bị đầu ra. Với điều này, bạn có thể quản lý độ mờ và cân bằng thông qua các 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 phương tiện 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 có sẵn để HAL đưa ra quyết định tránh né là liệu cả hai thiết bị đầu ra đều có luồng hoạt động hay không.

Khi nào nên vịt

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

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

  • Bất kỳ luồng nào được Android kết hợp với nhau đều được thực hiện trước khi áp dụng bất kỳ lợi ích nào. Do đó, bất kỳ luồng nào cần được giảm bớt 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 giảm bớt trước khi trộn chúng.

Sau đây là những khả năng nên tránh né các tương tác đồng thời.

Sự tương tác Hoạt động
EMERGENCY Tắt hoặc tắt tiếng mọi thứ ngoại trừ SAFETY
SAFETY Tránh mọi thứ ngoại trừ EMERGENCY
NAVIGATION Bỏ qua mọi thứ ngoại trừ SAFETYEMERGENCY
CALL Bỏ qua mọi thứ ngoại trừ SAFETY , EMERGENCYNAVIGATION
VOICE Vịt CALL_RING
VEHICLE_SOUNDS Bạn xác định tầm quan trọng của âm thanh chủ động và liệu nó có lấn át các âm thanh khác hay không.
MUSICANNOUNCEMENT Bị né tránh bởi mọi thứ. Ngoại lệ là âm tương tác cảm ứng được phát dưới dạng SYSTEM_SOUND .

Những lưu ý khi thả vịt

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 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 phương tiện không trở về mức âm lượng tối đa trước khi bị giảm âm lượng trước3 lần phát lại tiếp theo từ ứng dụng điều hướng hoặc ứng dụng trợ lý bắt đầu.

Đối với những chiếc xe có nhiều tầng âm thanh với 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ì né tránh. Ví dụ: hướng dẫn điều hướng có thể được chuyển đến loa tựa đầu của người lái trong khi tiếp tục phát nhạc khắp cabin ở mức âm lượng bình thường.

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

Android 11 đã giới thiệu API tập trung â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 đảm bảo rằng các ứng dụng và dịch vụ từ Android sẽ không phát âm thanh. HAL xác định luồng nào từ Android nên được trộn hoặc tắt tiếng để 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ài đặt âm lượng khỏi cấu hình nhóm âm lượng. Chúng có thể được phủ lên như được mô tả trong Định cấu hình mức tăng của nhóm âm lượng . Sự tách biệt này đảm bảo rằng không cần thay đổi 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 thành phần 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 được xác định. Tệp này cung cấp khả năng hiển thị 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 cách sử dụng được công nhận đầu tiên có trong mỗi VolumeGroup .

Ví dụ: ví dụ sau định nghĩa một VolumeGroup bao gồm voice_communicationvoice_communication_signalling . Việ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 được 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ị được sử 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ài đặt âm lượng sử dụng các API CarAudioManager dựa trên VolumeGroup sau:

  • getVolumeGroupCount() để tìm hiểu số lượng điều khiển cần được rút ra.
  • getGroupMinVolume()getGroupMaxVolume() để nhận 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 nhóm khối lượng ô tô

Các trường hợp sử dụng ô tô của tính năng cập nhật âm lượng và chuyển đổi tắt tiếng có nền tảng theo ngữ cảnh có thể xác định hành động của một số ứng dụng nhất định, chẳng hạn như cài đặt âm lượng. Âm lượng hiện tại và lệnh gọi lại tắt tiếng từ ngăn xếp âm thanh ô tô cung cấp thông tin ngữ cảnh hạn chế. Để 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 đượ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 (ánh xạ bit)
  • Danh ExtraInfos

Thông tin nhómKhối lượng ô tô

Người nhận cuộc gọi lại sự kiện có sẵn quyền truy cập vào danh sách thông tin nhóm số lượng xe bị ảnh hưởng. Điều này có nghĩa là ứng dụng không cần thực hiện bất kỳ lệnh gọi bổ sung nào tới khung âm thanh Ô tô để có trạng thái mới nhất. Nó có thể chỉ cần sử dụng CarVolumeGroupInfos nhận được to update the UI or internal states. To make it easier for apps, the aspects that changed in a car volume group are also provided as part of EventTypes`, như được giải thích bên dưới.

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 các hành động cần thiết. Ví dụ: EVENT_TYPE_VOLUME_MAX_INDEX_CHANGED chỉ ra rằng CarVolumeGroups' maximum volume gain index has changed and can be queried by CarVolumeGroupInfo.getMaxVolumeGainIndex()`.

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

Loại sự kiện Thông tin nhómKhối lượng ô tô
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()
SỰ KIỆN_TYPE_ZONE_CONFIGUration_CHANGED CarVolumeGroupInfo.getAudioAttribution()

Thông tin bổ sung

Cung cấp thông tin bổ sung về lý do CarVolumeGroup thay đổi. Ứng dụng có thể sử dụng thông tin này để cung cấp ngữ cảnh bổ sung 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 biểu thị mức suy giảm nhất 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 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 đang hoạt động do EXTRA_INFO_TRANSIENT_ATTENUATION_DUCKED thì ban đầu bạn cũng có thể chọn làm mờ giao diện người dùng thanh âm lượng để ngăn người dùng thay đổi âm lượng. Những người khác có thể chọn hiển thị thông báo rằng 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.

Hệ thống âm thanh ô 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 Gọi lại tăng âm thanh .

CarVolumeGroupEvent mở rộng quy mô để đáp ứng nhu cầu trong tương lai về khung âm thanh xe hơi. Chúng tôi dự định chỉ hỗ trợ các tính năng mới thông qua CarVolumeGroupEvent . Chúng tôi thực sự khuyên 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 nhóm và tắt tiếng.

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

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

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

  • Để hủy đăng ký cuộc gọi lại, hãy sử dụng CarAudioManager#unregisterCarVolumeGroupEventCallback()

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

Chúng tôi thực sự khuyên bạn nên sử dụng CarVolumeGroupEventCallback để quản lý các thay đổi về âm lượng nhóm và tắt tiếng.

Gọi lại âm thanh

Kể từ Android 13, AudioControl HAL có thể kích hoạt lệnh gọi lại không đồng bộ để quản lý các bản cập nhật mức âm lượng do những 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 bổ sung API sau:

API Mục đích
IAudioControl#registerGainCallback Đăng ký một phiên bản IAudioGainCallback với AudioControl HAL.
IAudioGainCallback#onAudioDeviceGainsChanged Gọi lại không đồng bộ để thông báo các thay đổi đối với cấu hình khuếch đại â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:

  • Id vùng
  • Địa chỉ cổng thiết bị
  • Chỉ số khối lượng > 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ể được phân loại rộng rãi 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.
  • Cập nhật lý do. Thay đổi vĩnh viễn hành vi âm lượng.

Các loại hạn chế

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

  • Tắt tiếng
  • Chặn
  • giới hạn
  • suy giảm
Hạn chế hoạt động Thay đổi âm lượng do người dùng kích hoạt Chuyển đổi 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
giới hạn ❌ (vượt quá giới hạn)

✔ (trong 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 > Suy giảm.

Hạn chế tắt tiếng

Hạn chế tắt tiếng là:

  • Reasons.TCU_MUTE
  • Reasons.REMOTE_MUTE

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

  • Người dùng tắt tiếng. Chuyển đổi 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 quan trọng.

  • HAL tắt tiếng. Được chuyển đổi 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 một trong hai chế độ tắt tiếng ở trên có được bật hay không.

Khi tắt tiếng HAL được bật, tất cả các yêu cầu thay đổi âm lượng đến và bật tiếng nhóm sẽ bị bỏ qua trong suốt 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 chuyển đổi Tắt tiếng

Khi tắt tiếng HAL được bật và 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 .
  • Yêu cầu từ Người dùng để bật tính năng 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 tôn trọng để bảo vệ quyền riêng tư của người dùng.

Khi tắt tiếng HAL được bật và 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 .

  • 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 trong bộ nhớ đệm vẫn được 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ó hạn chế hoạt động.

    • Lý do: Tắt tiếng đã lưu trong bộ nhớ đệm Tắt tiếng người dùng có thể gây ra hiện tượng nổ âm thanh 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, điều này làm giảm nhận thức của người dùng về khả năng cảm nhận mức âm thanh.

Trường hợp tương tác: Bật và tắt HAL Mute trong khi Tắt tiếng người dùng không có thay đổi

Việc chuyển đổi 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, nó không cập nhật trực tiếp trạng thái tắt tiếng của người dùng. Khi tắt tiếng người dùng bị tắt và nhận được cuộc 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 được thay đổi thành true .
  • Yêu cầu thay đổi âm lượng từ Người dùng sẽ NOT được xử lý khi tắt tiếng HAL được bật.

    • Lý do: Người dùng không thể nhận biết được âm thanh khi bật chế độ tắt tiếng. Việc cho phép thay đổi âm lượng có thể gây ra vụ nổ â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 tính năng bật tiếng (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) 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ính năng tắt tiếng HAL bị tắt trong khi tính năng Tắt tiếng của 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 đặt trạng thái tắt tiếng cố định và yêu cầu Người dùng tắ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 thay đổi âm lượng từ người dùng sẽ được xử lý bình thường.

Chặn

Hạn chế chặn là:

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

Khi các hạn chế chặn đang hoạt động, các yêu cầu từ người dùng tới:

  • Thay đổi âm lượng không được xử lý.
  • Chuyển đổi tắt tiếng được xử lý.

giới hạn

Hạn chế hạn chế là:

  • Reasons.THERMAL_LIMITATION
  • Reasons.SUSPEND_EXIT_VOL_LIMITATION

Khi Hạn chế giới hạn đang hoạt động, các yêu cầu từ người dùng tới:

  • Thây đổi độ lơn âm thanh:

    • Trong giới hạn được xử lý
    • Giới hạn trên không được xử lý
  • Chuyển đổi tắt tiếng được xử lý.

suy giảm

Hạn chế suy giảm là:

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

Khi hạn chế suy giảm đang hoạt động, người dùng sẽ yêu cầu:

  • Khối lượng thay đổi đượ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 lượng trước đây). Những thay đổi về khối lượng trong tương lai được thực hiện từ cấp độ này.

  • Chuyển đổi tắt tiếng được xử lý.

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

Nội dung sau đây được coi là bản cập nhật chỉ mục ổ đĩa không đồng bộ: Reasons.EXTERNAL_AMP_VOL_FEEDBACK .

Vì 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 đã chỉ định. Điều này chủ yếu được sử 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 Ô tô. Bản cập nhật chỉ mục cũng được liên lạc với Ứng dụng dưới dạng lệnh gọi lại CarVolumeGroupEvent để đồng bộ hóa chỉ mục.

Ví dụ

Ca sử dụng: Người dùng cập nhật chỉ số âm lượng lên 30

  • Người dùng sử dụng ứng dụng Âm lượng để thay đổi chỉ số â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 tới Audio HAL.

  • Việc triển khai Audio HAL của nhà cung cấp 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 ở chỉ số 15 (Android không xác định được lý do).

  • Việc triển khai trình kích hoạt AudioControl HAL của nhà cung cấp:

    IAudioGainCallback.onAudioDeviceGainsChanged(EXTERNAL_AMP_VOL_FEEDBACK, {...,  15 /* New index */})
    
  • Dịch vụ âm thanh ô tô sử dụng chỉ mục mới từ lệnh gọi lại được sử dụng để duy trì và gọi lại cho ứng dụng âm lượng. Chỉ số do 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ỉ số này lên 15.

Ca sử dụng: Phát lại âm thanh đầu tiên sau khi thoát khỏi trạng thái tạm dừng

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

  • Android bắt đầu tạm dừng.

  • Khi Android tồn tại tạm dừng (ví dụ: tiếp tục):

    • Nhà cung cấp Audio HAL/AudioControl HAL áp dụng chỉ số 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 ô tô sử dụng chỉ mục mới từ lệnh gọi lại được sử dụng để duy trì và các lệnh gọi lại của chính dịch vụ đó tới ứng dụng âm lượng đang đồng bộ hóa chỉ mục. Chỉ số âm lượng trước khi tạm dừng là 95. Tuy nhiên, sau khi tiếp tục, chỉ số này được người triển khai AudioControl HAL đặt ở 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:

  1. Cấu hình cuối dòng (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 ở EOL dựa trên thiết lập hệ thống âm thanh của xe. Thông thường, đây là một sideload không cập nhật image 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 bảo dưỡng.

  2. Cấu hình thời gian chạy. Hệ thống âm thanh ô tô hỗ trợ cấu hình bộ khuếch đại bên ngoài và các ECU này có thể lưu trữ 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 để hỗ trợ nhu cầu ngày càng tăng về các tính năng âm thanh theo nhu cầu, trong đó người dùng đăng ký 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 âm lượng mới có hiệu lực trong suốt thời gian đăng ký.

Thiết kế

Cấu hình âm lượng động được thực hiện theo ba giai đoạn:

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

    Sau khi được phát hiện, 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 ô tô cập nhật trạng thái nhóm âm lượng với các phạm vi âm lượng mới.

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

  • Gọi lại.

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

    • CarVolumeGroupEvent mang CarVolumeGroupInfo được cập nhật, Loại sự kiện (những gì đã thay đổi) và Thông tin bổ sung (tại sao nó thay đổi).

hình ảnh

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

API HAL

Kiểm soát âm thanh @ 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 Đặt một phiên bản của IModuleChangeCallback bằng AudioControl HAL.
IAudioControl#clearModuleChangeGọi lại Xóa phiên bản của IModuleChangeCallback được đặt trước đó bằng AudioControl HAL.
IModuleChangeCallback#onAudioPortsChanged Gọi lại để thông báo các thay đổi đối với AudioPorts

Sự liên tiếp

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 âm lượng động.

Những khía cạnh quan trọng

Để tối ưu hóa tính năng này, hãy xem xét những điều sau.

  • Cổng âm thanh được cung cấp như một phần của lệnh gọi lại phải khớp với định nghĩa BUS ô tô:

    • Cổng thiết bị. IN_DEVICE , OUT_DEVICE
    • Sự liên quan. BUS
    • Địa chỉ. Được xác định trong định nghĩa Audio HAL
    • Chế độ tăng. JOINT
  • Nhà cung cấp phải xác định một tập hợp lớn 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 để tùy chỉnh chính sách đó cho các biến thể của xe. Xem định nghĩa IModuleChangeCallbac AIDL để 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 nhau. Việc không làm như vậy sẽ dẫn đến hệ thống âm thanh ô tô từ chối định nghĩa phạm vi âm lượng mới.