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_DOWN
và
KEYCODE_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 thanhSAFETY
. Giảm bớt mọi thứ trừEMERGENCY
để đảm bảo người lái xe nghe thấy âm thanhNAVIGATION
. Giảm mọi thứ ngoại trừSAFETY
vàEMERGENCY
CALL
. Giảm bớt mọi thứ ngoại trừSAFETY
,EMERGENCY
vàNAVIGATION
VOICE
. VịtCALL_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. MUSIC
vàANNOUNCEMENT
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ạngSYSTEM_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_communication
và voice_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()
và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.