Quản lý số lượng

AAOS có tính năng quản lý âm lượng riêng trong CarAudioService. Chiến lược này sử dụng định dạng cố định ổ đĩa với kỳ vọng rằng phần cứng phải được phần cứng áp dụng dưới HAL bộ khuếch đại hơn là trong phần mềm. API này cũng 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 nhóm âm lượng.

Sử dụng âm lượng cố định

Việc triển khai AAOS nên kiểm soát âm lượng bằng bộ khuếch đại phần cứ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ủ 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() và thay đổi âm lượng theo loại luồng trong bộ trộn phần mềm. Đây có thể là điều không mong muốn do ảnh hưởng tiềm ẩn đến các ứng dụng khác và trên thực tế là sự suy giảm âm lượng trong bộ trộn phần mềm sẽ tạo ra ít bit quan trọng hơn trong tín hiệu khi nhận được tạ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 bộ sưu tập thiết bị trong một vùng âm thanh. Đối với mỗi nhóm âm lượng, âm lượng có thể được kiểm soát độc lập và kết quả mức tăng được định cấu hình trên các thiết bị liên kết mà bộ khuếch đại của xe áp dụng. Các chế độ cài đặt âm lượng sẽ đượ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>

Ví dụ về cách triển khai car_audio_configuration.xml.

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

Định cấu hình mức tăng nhóm âm 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ư cỡ bước. Các giá trị này được xác định 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 khi khởi chạy, nhóm âm lượng sẽ kiểm tra giá trị mức tăng của giá trị được 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 cấu hình những giá trị này, bạn có thể đặt mức tăng nhóm âm lượng nằm ngoài phạm vi được hỗ trợ cho một 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 sẽ được đặt ở mức tối thiểu hoặc tối đa của thiết bị nhận được giá trị 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

Nhóm ổ đĩa được xác định trong thời gian chạy theo thứ tự định nghĩa trong tệp XML. Các giá trị 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ố 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à riêng biệ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. API bất kỳ lấy groupId mà không có zoneId sẽ được 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 chỉ liên kết với một vùng âm thanh. Mối quan hệ này được định nghĩa là một phần của car_audio_configuration.xml. Xem ví dụ trong Xác định nhóm âm lượng ở trên.

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 đó. Những chế độ cài đặt này tuỳ theo vùng, nghĩa là nếu người dùng đăng nhập vào màn hình được liên kết với vùng chính rồi sau đó chuyển sang các điểm đăng nhập vào vùng được liên kết với vùng âm thanh phụ, mức âm lượng được tải và duy trì ở vùng đầu tiên sẽ khác với vùng phụ.

Xử lý các sự kiện chính về số 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_DOWNKEYCODE_VOLUME_MUTE. Theo mặc định, Android định tuyến phím âm lượng sự kiện đến ứng dụng. Quá trình triển khai Automotive phải buộc những sự kiện chính này CarAudioService có thể 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 config_handleVolumeKeysInWindowManager gắn cờ cho 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 sự kiện chính chúng liên kết với vùng âm thanh chính. Khi nhận được một sự kiện chính về âm lượng, CarAudioService sẽ xác định âm lượng nào nhóm để đ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 mức độ ưu tiên cao nhất ngữ cảnh âm thanh. 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 của AudioControl HAL đều bao gồm các API để thiết lập độ mờ và độ cân bằng trong chiếc xe. CarAudioManager có các API hệ thống tương ứng chuyển các giá trị xuống 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ề hướng bên phải (+) hoặc bên trái (-) của xe ô tô. 0.0 được căn giữa, +1.0 là hoàn toàn đúng, -1.0 hoàn toàn còn lại và giá trị nằm ngoài phạm vi -1 đến 1 là một lỗi.
  • setFadeTowardFront(float value) – Chuyển âm lượng loa về hướng phía trước (+) hoặc phía sau (-) của ô tô. 0.0 được căn giữa, +1.0 là hoàn toàn chuyển tiếp, -1.0 hoàn toàn về phía sau và giá trị nằm ngoài phạm vi -1 đến 1 là một lỗi.

Nhà sản xuất thiết bị gốc là quyền quyết định cách áp dụng và áp dụng các giá trị này sẽ hiển thị cho người dùng. Có thể áp dụng cụ thể cho các phương tiện truyền thông hoặc trên bảng cho tất cả âm thanh của 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 tính năng này, bạn có thể quản lý độ mờ và độ cân bằng thông qua hiệu ứng âm thanh trên các thiết bị đầu ra thích hợp thay vì thông qua các API này.

Giảm âm thanh

Giảm âm thanh xảy ra khi xe giảm khuếch đại cho một luồng phát để mọi người 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 sẽ phụ thuộc vào HAL (Lớp trừu tượng phần cứng) để triển khai vì có khả năng có nhiều âm thanh bên ngoài Android mà hệ điều hành không có quyền kiểm soát. Trong Android 11, thông tin chính có sẵn cho HAL để đưa ra quyết định giảm bớt là liệu hai thiết bị đầu ra có luồng đang hoạt động.

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

Mặc dù OEM từng cá nhân phụ thuộc vào việc xác định cách HAL của họ sẽ xử lý việc giảm số lượt truy cập, thì bạn nên áp dụng một số nguyên tắc chung. Nhiều luồng phát trong Android sẽ thường xảy ra nhất khi 2 ứng dụng/dịch vụ giữ đồng thời quyền phát âm thanh. Với suy nghĩ đó, xem Ma trận tương tác để tìm hiểu thời điểm Android có thể cấp tiêu điểm đồng thời và do đó, khi có thể cho hai nhiều luồng khác nhau để phát đồng thời.

Xin lưu ý rằng mọi luồng dữ liệu mà Android kết hợp với nhau sẽ được xử lý trước khi thu được lợi ích đang được áp dụng. Do đó, bất kỳ luồng nào nên được tắt khi phát cùng lúc 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ể áp dụng tính năng giảm hiệu ứng ánh sáng trước khi kết hợp chúng lại với nhau.

Hành vi giảm kích thước được đề xuất

Sau đây là các hoạt động tương tác có thể xảy ra đồng thời mà bạn nên tránh sẽ được áp dụng:

  • EMERGENCY. Giảm âm thanh hoặc tắt tiếng mọi thứ ngoại trừ SAFETY để đảm bảo người lái xe nghe thấy âm thanh
  • SAFETY. Giảm bớt mọi thứ trừ EMERGENCY để đảm bảo người lái xe nghe thấy âm thanh
  • NAVIGATION. Giảm mọi thứ ngoại trừ SAFETYEMERGENCY
  • CALL. Giảm bớt mọi thứ ngoại trừ SAFETY, EMERGENCYNAVIGATION
  • VOICE. Vịt CALL_RING
  • Tầm quan trọng của VEHICLE_SOUNDS đang hoạt động là tuỳ thuộc vào việc nhà sản xuất thiết bị gốc có thể quyết định việc này. và liệu họ có nên giảm bớt các âm thanh khác hay không để đảm bảo người lái xe nghe thấy chúng.
  • MUSICANNOUNCEMENT nên được giảm bớt mọi thứ. Ngoại lệ chính của hệ thống này là các âm tương tác chạm hiện được phát dưới dạng SYSTEM_SOUND

Những điểm khác cần cân nhắc khi giảm số lượng video

Một số ứng dụng/dịch vụ như điều hướng hoặc trợ lý có thể sử dụng nhiều người chơi để hoàn thành hành động của họ. Nhà sản xuất thiết bị gốc nên tránh tắt tiếng quá tích cực dựa trên thời điểm dữ liệu luồng ngừng hoạt động đi qua các thiết bị đầu ra này để đảm bảo người dùng không trả lại nội dung nghe nhìn ngay lập tức thành mức âm lượng tối đa trước khi bị giảm xuống như lần phát tiếp theo từ thanh điều hướng hoặc ứng dụng Trợ lý khởi động.

Bạn cũng có thể chọn những xe có nhiều giai đoạn âm thanh với độ cách ly đủ tốt để đị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ụ: điều hướng hướng dẫn có thể được chuyển đến loa tựa đầu của người lái trong khi nhạc vẫn tiếp tục phát trong suốt cabin ở mức âm lượng bình thường.

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

Mặc dù Android 11 ra mắt API tập trung âm thanh HAL, vẫn phải phụ thuộc vào HAL để đảm bảo những âm thanh quan trọng về an toàn được ưu tiên hơn khác. Ngay cả khi HAL giữ quyền phát âm thanh cho USAGE_EMERGENCY, điều đó không đảm bảo các ứng dụng và dịch vụ trong Android sẽ không phát âm thanh. HAL (Lớp trừu tượng phần cứng) phụ thuộc vào xác định xem nên trộn hoặc tắt tiếng luồng nào từ Android vì âm thanh quan trọng về an toàn là đã phát.

Đị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ó thể là như mô tả trong phần Định cấu hình nhóm âm lượng). Việc phân tách này đảm bảo rằng không có bạn cần thay đổi nếu cấu hình của nhóm âm lượng thay đổi trong tương lai.

Trong giao diện người dùng Cài đặt trên ô tô, packages/apps/Car/Settings/res/xml/car_volume_items.xml tệp này 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 đã xác định AudioAttributes.USAGE Tệp này cung cấp khả năng kết xuất hợp lý VolumeGroups được xác định bằng cách sử dụng các tài nguyên được liên kết với thuộc tính đầu tiên hoạt động sử dụng được ghi nhận có trong mỗi VolumeGroup.

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

  • getVolumeGroupCount() để biết số lượng thành phần điều khiển cần 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() để nhận thông báo về sự thay đổi âm lượng.