Quản lý số lượng

Tính năng quản lý âm lượng có trong CarAudioService, sử dụng các số lượng cố định với kỳ vọng rằng âm lượng được phần cứng áp dụng dưới HAL bộ khuếch đại thay vì vào phần mềm. CarAudioService sắp xếp các thiết bị đầu ra vào 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.

Â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 khiển âm lượng thay vì phần mềm trộn. Để tránh tác dụng phụ, hãy đặt cờ config_useFixedVolume thành true (lớp phủ khi 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 luồng nhập vào bộ trộn phần mềm. Điều này không phải lúc nào cũng như mong muốn do tiềm năng ảnh hưởng đến các ứng dụng khác và trên thực tế là việc 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 nhận được bởi bộ khuếch đại phần cứng.

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 bản âm thanh vùng. Đố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. Chiến lược phát hành đĩa đơn mức tăng thu được được định cấu hình trên các thiết bị liên kết sẽ được áp dụng bởi bộ khuếch đại âm thanh của xe. Các chế độ cài đặt âm lượng sẽ được duy trì cho người dùng và sẽ đượ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="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ó liên kết của bạn. Đị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 thuộc tính 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 chạy, nhóm âm lượng sẽ kiểm tra giá trị mức tăng của giá trị liên kết thiết bị 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 những giá trị này được định cấu hình, bạn có thể đặt mức tăng nhóm âm lượng nằm ngoài phạm vi được hỗ trợ của một thiết bị liên kết với âm lượng đó nhóm. Trong trường hợp này, đối với thiết bị đó, mức tăng âm được đặt thành giá trị nhỏ nhất của thiết bị hoặc giá trị tăng tối đa dựa trên giá trị của nhóm âm lượng thấp hơn hay cao hơn dải ô.

Mã 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 dao động từ 0 đến N-1 trong một vùng âm thanh, trong đó N là số lượng trong vùng đó. Bằng cách này, mã nhóm âm lượng không phải là riêng biệt trên các vùng. Các giá trị nhận dạng này 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 đặt mặc định 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 nhóm chỉ được liên kết với một vùng âm thanh. Mối quan hệ này được định nghĩa trong car_audio_configuration.xml. Để tìm hiểu thêm, hãy xem ví dụ ở trên trong mục Xác định nhóm âm lượng.

Người dùng liên kết với từng vùng sẽ duy trì mức âm lượng hiện tại vùng đó. Các cài đặt này theo vùng cụ thể, có 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 rồi sau đó là các đăng nhập vào vùng liên kết với vùng âm thanh cấp hai, mức âm lượng được tải và duy trì trong vùng đầu tiên khác với 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. Ô tô Quá trình triển khai phải buộc các sự kiện chính này được xử lý bởi CarAudioService, sau đó sẽ gọi setGroupVolume hoặc setMasterMute dưới dạng phù hợp. Để buộc thực hiện hành vi này, hãy đặt config_handleVolumeKeysInWindowManager gắn cờ thành true:

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

Các sự kiện chính âm lượng hiện không có cách nào phân biệt vùng nào chúng dành cho và được giả định là tất cả được liên kết với vùng âm thanh. Khi nhận được một sự kiện chính âm lượng, CarAudioService sẽ xác định cần điều chỉnh nhóm âm lượng nào bằng cách tìm nạp ngữ cảnh âm thanh cho trình phát rồi điều chỉnh nhóm âm lượng chứa thiết bị đầu ra được liên kết với bối cảnh âm thanh có mức độ ưu tiên cao nhất. Mức độ ưu tiên là đượ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 AudioControl HAL đều có các API để thiết lập độ mờ và độ cân bằng trong xe. API hệ thống tương ứng cho các giá trị chuyển CarAudioManager vào 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 bên trái (-) của xe.

    • 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 phía trước (+) hoặc phía sau (-) của ô 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 người dùng. Các đề xuất có thể được áp dụng hoàn toàn cho phương tiện truyền thông hoặc trên bảng cho tất cả Âm thanh 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. Với giải pháp này, bạn có thể ngoài ra, hãy quản lý độ mờ và độ cân bằng thông qua hiệu ứng âm thanh trên trang đầu ra 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 khuếch đại âm thanh cho một luồng để người dùng có thể nghe thấy rõ hơn một luồng khác đang phát cùng lúc. 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 cho HAL để đưa ra quyết định tránh né là liệu có hai đầu ra hay không cả hai thiết bị đều có luồng đang hoạt động.

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

Mặc dù OEM riêng lẻ xác định cách xử lý tính năng giảm độ phân giải HAL, chúng tôi đề xuất 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ữ quyền phát âm thanh. Để tìm hiểu thời điểm Android có thể cấp quyền đồng thời 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 Quản lý AudioFocus.

  • Mọi luồng dữ liệu do Android kết hợp với nhau đều được thực hiện trước khi có lợi ích áp dụng. Do đó, bất kỳ sự kiện phát trực tiếp nào cần được tắt khi phát đồng thời với một thiết bị khác nên được định tuyến đến các thiết bị đầu ra riêng biệt để HAL có thể hãy giảm hiệu suất trước khi kết hợp.

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 Vịt mọi thứ ngoại trừ SAFETY, EMERGENCY, và NAVIGATION
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ó hay không loại bỏ các âm thanh khác.
MUSICANNOUNCEMENT Tôi bị thu hút bởi mọi thứ. Trường hợp ngoại lệ là âm tương tác chạm được phát như 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 hành động. Tránh tắt tiếng linh hoạt 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 đầy trước khi giảm âm lượng trước3 lần phát 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 độ cách ly đủ 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ụ: có thể chuyển hướng dẫn đi theo chỉ dẫn đến loa tựa đầu của người lái trong khi 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

Ra mắt Android 11 API tập trung âm thanh HAL. HAL đảm bảo âm thanh cần đảm bảo độ an toàn được ưu tiên hơn các âm thanh khác. Nếu HAL giữ âm thanh tập trung vào USAGE_EMERGENCY, nên chúng tôi không thể đả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 những luồng từ Android được kết hợp hoặc tắt tiếng để phát các âm thanh cần đảm bảo 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. Các mục này có thể được phủ lên trên như được mô tả trong Đị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 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 trên ô 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) liên kết với mỗi thành phần AudioAttributes.USAGE xác định. Tệp này cung cấp khả năng kết xuất hợp lý trong VolumeGroups được xác định bằng cách sử dụng tài nguyên được liên kết với phần tử đầu tiên thông tin sử dụng được ghi nhận có trong mỗi VolumeGroup.

Ví dụ: ví dụ sau đây định nghĩa VolumeGroup bao gồm voice_communicationvoice_communication_signalling. Mặc định phương thức triển khai giao diện người dùng cài đặt ô tô sẽ kết xuất VolumeGroup bằng cách sử dụng 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à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 sẽ có bối cảnh nền tảng có thể xác định hành động của một số ứng dụng, chẳng hạn như âm lượng phần cài đặt. 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à trong tương lai khả năng mở rộng, 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 đã có quyền truy cập vào danh sách ô tô bị ảnh hưởng thông tin về nhóm âm lượng. Điều này có nghĩa là ứng dụng không cần thực hiện bất kỳ các lệnh gọi bổ sung đến khung Âm thanh cho ô tô để nhận trạng thái mới nhất. Chiến dịch này có thể 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. Để giúp các ứng dụng dễ dàng sử dụng hơn, các khía cạnh đã thay đổi trong âm lượng của ô tô Nhóm cũng được cung cấp như một phần của EventTypes, như được 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ể 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 rằng các đường liên kết Chỉ mục tăng âm lượng tối đa CarVolumeGroups đã thay đổi và có thể được truy vấn bằng CarVolumeGroupInfo.getMaxVolumeGainIndex().

Bảng sau đây trình bà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 CarVolumeGroupInfo.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. Chiến dịch Quảng cáo ứ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 cho 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 chủ độ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. Tuỳ thuộc vào quyết định của bạn để xác định quy trình dựa trên ExtraInfos. Ví dụ: nếu sự 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 ban đầu để ngăn người dùng thay đổi âm lượng. Những người khác có thể chọn hiển thị một thông báo ngắn cho biết chế độ tránh đ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 AudioControl HAL IAudioGainCallback để hãy cung cấp ExtraInfos được đề xuất. Để tìm hiểu thêm, hãy xem Lệnh gọi lại mức nhận âm thanh.

CarVolumeGroupEvent điều chỉnh để đáp ứng nhu cầu trong tương lai của khung âm thanh ô tô. T4 chúng tôi dự định chỉ hỗ trợ các tính năng mới thông qua CarVolumeGroupEvent . T4 nhà phát triển ứng dụng nên sử dụng CarVolumeGroupEvent để xử lý những thay đổi về âm lượng 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 quyền và để đăng ký và nhận thông báo về CarVolumeGroupEvents.

  • Để đăng ký 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à cũ CarVolumeCallback, sự kiện CarVolumeGroupEventCallbacks đượ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 trình kích hoạt trùng lặp vào 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ý những thay đổi về âm lượng 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ý thông tin cập nhật mức âm lượng do những thay đổi đối với hệ thống âm thanh xe hơi.

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à các lỗi tương ứng AudioGainConfigInfo, bao gồm:

  • Mã vùng
  • Đị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.

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 tệp được hỗ trợ hạn chế:

  • Tắt tiếng
  • 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
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)

✔ (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 sự kiện chính.

  • Tắt tiếng HAL. Được chuyển đổi dựa trên hạn chế tắt tiếng nhận được qua AudioGain .

Đối với những người nghe như ứng dụng Cài đặt, tính năng 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 các nút tắt tiếng ở trên đã được bật.

Khi chế độ tắt tiếng HAL được bật, tất cả sự thay đổi về âm lượng đến và bật tiếng nhóm sẽ 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 tính năng tắt tiếng HAL được bật và chế độ 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 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ý. Người dùng được lưu vào bộ nhớ đệm trạng thái tắt tiếng vẫn đang 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 giúp giảm mức độ nhận biết về mức âm thanh nhận thức.

Trường hợp tương tác: Bật và tắt tiếng HAL cho đến khi người dùng tắt tiế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, việ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ắt tiếng người dùng và tắt tiếng HAL đã nhận được lệnh gọi lại để 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.
  • Yêu cầu thay đổi âm lượng của Người dùng NOT sẽ được xử lý trong khi tắt tiếng HAL đã được 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. 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ể đă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ó sự can thiệp của người dùng, nếu đây là hành vi dự kiến bởi OEM (Nhà sản xuất thiết bị gốc).

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: Làm cho trạng thái tắt tiếng 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 mới hiện tại được đặt thành âm lượng giảm (thay vì âm lượng trước đây). Số lượng thay đổi trong tương lai được tạo 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ì 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 vào chỉ mục được chỉ định. Dữ liệu 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 cho ô tô. Cập nhật chỉ mục là cũng giao tiếp với Apps 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ỉ 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.

  • Nhà cung cấp triển khai Audio HAL nhận được mức tăng và cập nhật số lượng mới 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 (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 ô tô sử dụng chỉ mục mới từ lệnh gọi lại được dùng cho dữ liệu cố định và lệnh gọi lại đối với ứng dụng âm lượng. Chỉ mục theo yêu cầu của người dùng 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 cục bộ trong hệ thống âm thanh.

    • 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 dùng cho dữ liệu cố định và lệnh gọi lại riêng để ứ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, chỉ số này là 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òng của xe (EOL).

    • Các nhà sản xuất ô tô muốn cập nhật cấu hình số lượng ở EOL dựa trên xe cài đặt hệ thống âm thanh. Thông thường, đây là một hoạt động tải không qua cửa hàng ứng dụng mà không cập nhật Hình ảnh Android SW.

    • Nhà sản xuất ô tô có thể cần cập nhật cấu hình âm lượng trong lịch dịch vụ.

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

    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 một giá trị an toàn. Ví dụ: cấp mặc định do nhà cung cấp cung cấp trong khoảng thời gian lệnh gọi lại.

  • Gọi lại.

    • Sau khi cập nhật phạm vi của 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 ứng dụng được đăng ký qua CarVolumeGroupEventCallback.

    • CarVolumeGroupEvent mang CarVolumeGroupInfo đã cập nhật, Loại sự kiện (điều gì đã 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 Lớp trừu tượng phần cứng (HAL) cho 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 Automotive Định nghĩa về xe buýt (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 tệp Âm thanh Chính sách HAL (Lớp trừu tượng phần cứng) và sử dụng lệnh gọi lại để tuỳ chỉnh chính sách này cho các biến thể xe. Xem IModuleChangeCallbac Định nghĩa 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, thì mỗi nhóm phải có định nghĩa phạm vi khoảng âm lượng giống nhau. Nếu không làm được điều này, xe của bạn sẽ bị ngã khung âm thanh từ chối định nghĩa phạm vi âm lượng mới.