AAOS có chức năng quản lý âm lượng riêng trong CarAudioService
. Phương thức này sử dụng các âm lượng cố định với kỳ vọng rằng âm lượng sẽ đượ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. 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ột mức tăng cho tất cả các thiết bị được liên kết với nhóm âm lượng.
Sử dụng phương tiện cố định
Các hoạt động 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ì bộ trộn phần mềm. Để tránh các hiệu ứ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 không đặt cờ config_useFixedVolume
(hoặ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. Điều này có thể không mong muốn do ảnh hưởng tiềm ẩn đối với các ứng dụng khác và thực tế là việc giảm âm lượng trong bộ trộn phần mềm sẽ làm giảm số bit có ý nghĩa trong tín hiệu khi nhận được tại bộ khuếch đại phần cứng.
Nhóm phương tiện
Nhóm âm lượng quản lý âm lượng cho 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ể điều khiển âm lượng một cách độc lập và hệ thống sẽ định cấu hình các mức tăng thu được trên các thiết bị được liên kết để bộ khuếch đại của xe áp dụng. Chế độ cài đặt âm lượng sẽ được lưu giữ cho người dùng và được tải khi người dùng đăng nhập.
Xác định nhóm phương tiện
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 phương tiện 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 của nhóm âm lượng
Mỗi nhóm âm lượng có các giá trị tăng tối thiểu, tối đa và mặc định cũng như kích thướ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 phương tiện.
<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ị 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ả thiết bị do nhóm âm lượng kiểm soát
- Mức tăng tối thiểu. Độ lợi tối thiểu nhỏ nhất trong số các thiết bị trong nhóm
- Mức tăng tối đa. Độ tăng ích tối đa cao nhất trong số các thiết bị trong nhóm
- Mức tăng mặc định. Độ lợi mặc định cao nhất trong số các thiết bị trong nhóm
Do cách định cấu hình các giá trị này, bạn có thể đặt độ lợi của một nhóm âm lượng nằm ngoài phạm vi được hỗ trợ cho một 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ị đó, độ lợi sẽ đượ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 nằm dưới hay trên phạm vi.
Giá trị nhận dạng nhóm âm lượng
Các nhóm phương tiện được xác định trong thời gian chạy theo thứ tự xác định trong tệp XML.
Mã nhận dạng có giá trị 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 đó. Theo cách này, mã nhận dạng nhóm phương tiện không phải là duy nhất trên 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 các nhóm phương tiện. Mọi API lấy groupId
mà không có zoneId
sẽ mặc định là vùng âm thanh chính.
Quản lý âm lượng nhiều khu vực
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 xác định là một phần của car_audio_configuration.xml
. Xem ví dụ được cung cấp trong phần Xác định nhóm phương tiện ở trên.
Mức âm lượng hiện tại của từng vùng sẽ được duy trì cho người dùng liên kết với vùng đó. Các chế độ cài đặt này dành riêng cho từng khu vực, nghĩa là nếu người dùng đăng nhập trên một màn hình được liên kết với khu vực chính, sau đó đăng nhập vào một khu vực được liên kết với khu vực âm thanh phụ, thì mức âm lượng được tải và duy trì cho khu vực đầu tiên sẽ khác với mức âm lượng cho khu vực phụ.
Xử lý sự kiện phím âm lượng
Android xác định một số mã phím để điều khiển âm lượng, bao gồm cả KEYCODE_VOLUME_UP
, KEYCODE_VOLUME_DOWN
và KEYCODE_VOLUME_MUTE
. Theo mặc định, Android sẽ định tuyến các sự kiện phím âm lượng đến các ứng dụng. Việc triển khai trong ngành ô tô phải buộc các sự kiện chính này thành CarAudioService
, sau đó có thể gọi setGroupVolume
hoặc setMasterMute
khi 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 vùng mà chúng dành cho, do đó, tất cả đều được giả định là 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
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 người chơi đ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
.
Hiệu ứng mờ và cân bằng
Cả hai phiên bản của AudioControl HAL đều có các API để đặt độ mờ và độ cân bằng trong xe. Có các API hệ thống tương ứng cho CarAudioManager để truyền các giá trị xuống 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 sang bên phải (+) hoặc bên trái (-) của ô tô. 0.0 nằm ở giữa, +1.0 nằm ở ngoài cùng bên phải, -1.0 nằm ở ngoài cùng bên trái và giá trị nằm ngoài phạm vi -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à ở giữa, +1.0 là hoàn toàn về phía trước, -1.0 là hoàn toàn về phía sau và giá trị nằm ngoài phạm vi -1 đến 1 là lỗi.
Nhà sản xuất thiết bị gốc (OEM) sẽ 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. Bạn có thể áp dụng các chế độ này nghiêm ngặt cho nội dung nghe nhìn hoặc trên toàn bộ bảng điều khiển cho tất cả âm thanh trên Android.
Android 11 cũng hỗ trợ việc áp dụng hiệu ứng âm thanh cho các thiết bị đầu ra. Nhờ đó, bạn có thể quản lý hiệu ứng mờ và cân bằng thông qua các 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 lượng âm thanh xảy ra khi xe giảm độ lợi cho một luồng âm thanh để có thể nghe rõ hơn luồng âm thanh khác đang phát cùng lúc. Trong AAOS, việc giảm âm thanh do âm thanh khác gây ra là do HAL triển khai vì có thể có nhiều âm thanh bên ngoài Android mà hệ điều hành không kiểm soát được. Trong Android 11, thông tin chính mà HAL có thể dùng để đưa ra quyết định về việc giảm âm lượng là liệu hai thiết bị đầu ra có cả luồng đang hoạt động hay không.
Thời điểm cúi xuống
Mặc dù việc xác định cách HAL xử lý tính năng giảm âm lượng do tiếng ồn xung quanh gây ra là tuỳ thuộc vào từng nhà sản xuất thiết bị gốc, nhưng bạn nên tham khảo một số nguyên tắc chung sau đây. Thông thường, việc nhiều luồng phát trong Android sẽ xảy ra khi hai ứng dụng/dịch vụ đồng thời giữ tiêu điểm âm thanh. Do đó, hãy xem Mảng 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 đó, thời điểm hai luồng khác nhau có thể phát đồng thời.
Xin lưu ý rằng mọi luồng do Android kết hợp với nhau sẽ được thực hiện trước khi áp dụng bất kỳ lợi ích nào. Do đó, mọi luồng cần được giảm âm khi phát đồng thời với 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 tính năng giảm âm trước khi kết hợp các luồng đó với nhau.
Hành vi giảm âm lượng được đề xuất
Sau đây là các hoạt động tương tác đồng thời tiềm ẩn mà bạn nên áp dụng tính năng giảm âm thanh:
EMERGENCY
. Giảm 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 thanhSAFETY
. Giảm âm lượng mọi thứ ngoại trừEMERGENCY
để đảm bảo người lái xe nghe được âm thanhNAVIGATION
. Bỏ qua mọi thứ ngoại trừSAFETY
vàEMERGENCY
CALL
. Bỏ qua mọi thứ ngoại trừSAFETY
,EMERGENCY
vàNAVIGATION
VOICE
. VịtCALL_RING
- Các nhà sản xuất thiết bị gốc (OEM) có thể tự xác định tầm quan trọng của
VEHICLE_SOUNDS
đang hoạt động và liệu họ có nên giảm âm lượng các âm thanh khác để đảm bảo người lái xe nghe thấy hay không. - Mọi thứ đều phải tránh
MUSIC
vàANNOUNCEMENT
. Trường hợp ngoại lệ chính cho điều này là các âm thanh tương tác chạm hiện được phát dưới dạngSYSTEM_SOUND
Những điều cần cân nhắc khác khi giảm âm lượng
Một số ứng dụng/dịch vụ như chỉ đường hoặc trợ lý có thể sử dụng nhiều trình phát để hoàn tất các thao tác của chúng. Nhà sản xuất thiết bị gốc (OEM) nên tránh giảm âm lượng quá mạnh dựa trên thời điểm dữ liệu truyền trực tuyến ngừng truyền qua các thiết bị đầu ra này để đảm bảo người dùng không tạm thời tăng âm lượng nội dung nghe nhìn lên mức tối đa trước khi giảm âm lượng trở lại khi quá trình phát tiếp theo từ ứng dụng chỉ đường hoặc trợ lý bắt đầu.
Đối với những xe có nhiều sân khấu âm thanh với khả năng cách ly đủ tốt, bạn cũng có thể chọn định tuyến âm thanh đến nhiều khu vực trong xe thay vì giảm âm. 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 xe trong khi nhạc vẫn tiếp tục phát trong khoang cabin ở â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 tiêu điểm âm thanh HAL,
nhưng HAL vẫn phải đảm bảo rằng các âm thanh quan trọng về an toàn được ưu tiên hơn
các âm thanh khác. Ngay cả khi HAL giữ tiêu điểm âm thanh cho USAGE_EMERGENCY
, điều đó cũng không đảm bảo rằng các ứng dụng và dịch vụ trong Android sẽ không phát âm thanh. HAL sẽ quyết định luồng nào từ Android sẽ được trộn hoặc tắt tiếng khi phát â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 (có thể được phủ lên 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 bạn không cần thực hiện thay đổi nào nếu cấu hình nhóm phương tiện thay đổi trong tương lai.
Trong giao diện người dùng Cài đặt ô tô, tệp 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 từng AudioAttributes.USAGE
đã 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 liên kết với lần sử dụng được 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 cả voice_communication
và voice_communication_signalling
. Việc triển khai giao diện người dùng cài đặt ô tô mặc định 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à tài nguyê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ị đượ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()
để biết số lượng thành phần điều khiển cần vẽ.getGroupMinVolume()
vàgetGroupMaxVolume()
để lấy 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ề các thay đổi về âm lượng.