Tính năng quản lý âm lượng nằm trong CarAudioService
, sử dụng âm lượng cố định với kỳ vọng âm lượng đượ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. 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ộ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.
Phương tiện bộ nhớ cố định
Các hoạt động 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 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()
để thay đổi âm lượng theo loại luồng trong bộ trộn phần mềm. Điều này không phải lúc nào cũng mong muốn do các hiệu ứng tiềm ẩn đối với các ứng dụng khác và việc giảm âm lượng trong bộ trộn phần mềm có thể dẫn đến việc có ít bit quan trọng hơn trong tín hiệu khi được bộ khuếch đại phần cứng nhận.
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. Các hệ số khuếch đại thu được được định cấu hình 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 đượ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 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>
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ỉ liên kết. Đị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
.
Đị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 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 quá trình khởi chạy, nhóm âm lượng sẽ kiểm tra các giá trị tăng của các thiết bị được 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. 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. Độ lợi 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 đượ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ự được 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 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 các nhóm phương tiện. Mọi API nhận 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
. Để tìm hiểu thêm, hãy xem ví dụ ở trên trong phần Xác định nhóm phương tiện.
Cấp âm lượng hiện tại của mỗi 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 vùng, 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 vùng chính, sau đó đăng nhập vào một vùng được liên kết với vùng âm thanh phụ, thì các 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 cho vùng phụ.
Xử lý sự kiện phím âm lượng
Android xác định một số mã phím để điều chỉnh âm lượng, bao gồm:
KEYCODE_VOLUME_UP
KEYCODE_VOLUME_DOWN
KEYCODE_VOLUME_MUTE
Theo mặc định, Android sẽ định tuyến các sự kiện phím âm lượng đến ứng dụng. Việc triển khai trong ô tô phải buộc CarAudioService
xử lý các sự kiện nhấn phím 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 vùng mà chúng dành cho và được giả định 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
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 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 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 API hệ thống tương ứng cho CarAudioManager truyền các giá trị đến 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 ở chính giữa
- +1.0 là hoàn toàn chính xác
- -1.0 là hoàn toàn bên trái
- 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 ở chính giữa
- +1.0 là hoàn toàn chuyển tiếp
- -1.0 là 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. 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 áp dụng cho tất cả âm thanh trên 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. Nhờ đó, bạn có thể quản lý chế độ 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
Hiệu ứng giảm âm thanh xảy ra khi xe giảm độ lợi cho một luồng để có thể nghe rõ hơn luồng khác đang phát đồng thời. Trong AAOS, tính năng giảm âm thanh được triển khai bằng HAL. Android không có quyền kiểm soát âm thanh ngoài hệ điều hành. 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 là tuỳ thuộc vào từng nhà sản xuất thiết bị gốc, nhưng bạn nên làm theo các nguyên tắc sau.
Việc 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 thời điểm Android có thể cấp tiêu điểm đồng thời, hãy xem ma trận tương tác trong phần Các loại hạn chế. Với việc ra mắt trình bổ trợ âm thanh trên ô tô, điều này cũng phụ thuộc vào cách bạn quản lý AudioFocus.
Mọi luồng do 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 đó, 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 trộn các luồng đó.
Hành vi cúi đầu được đề xuất
Sau đây là các tương tác đồng thời tiềm ẩn mà bạn nên sử dụng tính năng giảm âm thanh.
Tương tác | Thao tác |
---|---|
EMERGENCY
| Tắt tiếng hoặc tắt tiếng mọi thứ ngoại trừ SAFETY
|
SAFETY |
Ẩn mọi thứ ngoại trừ EMERGENCY |
NAVIGATION |
Loại bỏ mọi thứ ngoại trừ SAFETY và EMERGENCY |
CALL |
Loại bỏ mọi thứ ngoại trừ SAFETY , EMERGENCY và NAVIGATION |
VOICE |
Vịt CALL_RING |
VEHICLE_SOUNDS |
Bạn xác định tầm quan trọng của âm thanh đang hoạt động và liệu âm thanh đó có làm giảm âm lượng của các âm thanh khác hay không. |
MUSIC và ANNOUNCEMENT |
Mọi thứ đều bị bỏ qua. Các ngoại lệ là âm thanh tương tác chạm được phát dưới dạng SYSTEM_SOUND .
|
Những điều cần cân nhắc khi cúi xuống
Một số ứng dụng và dịch vụ, chẳng hạn như chỉ đường hoặc trợ lý, có thể sử dụng nhiều trình phát để thực hiện hành động. Tránh giảm âm lượng mạnh khi luồng dữ liệu ngừng truyền qua các thiết bị đầu ra để đảm bảo nội dung đa phương tiện không trở lại âm lượng đầy đủ trước khi bị giảm âm lượng trước khi3 lần phát tiếp theo từ tính năng chỉ đường hoặc ứng dụng 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ó thể định tuyến âm thanh đến nhiều khu vực trong xe thay vì giảm âm lượng. Ví dụ: bạn có thể chuyển hướng dẫn chỉ đường đến loa tựa đầu của người lái xe trong khi tiếp tục phát nhạc trong khoang cabin ở âm lượng bình thường.
Âm thanh quan trọng về an toàn
Android 11 đã ra mắt API tiêu điểm âm thanh HAL. HAL đảm bảo â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ụ của Android sẽ không phát âm thanh. HAL xác định những luồng nào từ Android cần được trộn hoặc tắt tiếng để 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. Bạn có thể phủ các giá trị này như mô tả trong phần Định cấu hình mức tăng của nhóm âm lượng. Việc phân tách này đảm bảo rằng bạn không cần thay đổi gì nếu cấu hình của các nhóm phương tiện 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) 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 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à lần so khớp đầ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 đây:
getVolumeGroupCount()
để tìm hiểu số lượng thành phần điều khiển cần vẽ.getGroupMinVolume()
và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ề các thay đổi về âm lượng.
Sự kiện nhóm âm lượng ô tô
Các trường hợp sử dụng trong ô tô của tính năng cập nhật âm lượng và nút bật/tắt tiếng có cơ sở theo ngữ cảnh có thể xác định các hành động của một số ứng dụng nhất định, chẳng hạn như chế độ cài đặt âm lượng. Lệnh gọi lại hiện tại về âm lượng và tắt tiếng từ ngăn xếp âm thanh trên ô tô cung cấp thông tin theo bối cảnh hạn chế. Để phục vụ tốt hơn các trường hợp sử dụng trong ô 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 3 loại thông tin quan trọng:
- Danh sách
CarVolumeGroupInfo
EventTypes
(ánh xạ bit)- Danh sách
ExtraInfos
CarVolumeGroupInfo
Phương thức tiếp nhận lệnh gọi lại sự kiện có thể truy cập vào danh sách thông tin về nhóm âm 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 thêm bất kỳ lệnh gọi nào đến khung Âm thanh trên ô tô để nhận trạng thái mới nhất. Bạn chỉ cần sử dụng CarVolumeGroupInfos
đã nhận được để cập nhật giao diện người dùng hoặc các trạng thái nội bộ. Để giúp ứng dụng dễ dàng hơn, các khía cạnh đã thay đổi trong nhóm âm lượng ô tô cũng được cung cấp trong EventTypes
, như giải thích bên dưới.
EventTypes
Xác định khía cạnh nào của CarVolumeGroupInfo
đã thay đổi. Ứ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
cho biết chỉ mục tăng âm lượng tối đa CarVolumeGroups
tương ứng đã thay đổi và có thể được truy vấn bằng CarVolumeGroupInfo.getMaxVolumeGainIndex()
.
Bảng sau đây cho thấy mối quan hệ giữa EventType
và CarVolumeGroupInfo
.
EventType | CarVolumeGroupInfo |
---|---|
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() |
EVENT_TYPE_ZONE_CONFIGURATION_CHANGED | CarVolumeGroupInfo.getAudioAttributes() |
ExtraInfos
Cung cấp thêm thông tin về lý do CarVolumeGroup
thay đổi. Ứ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 người dùng hành động hoặc thông báo. Ví dụ: EXTRA_INFO_TRANSIENT_ATTENUATION_THERMAL
cho biết độ suy giảm tạm 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 cho ExtraInfos
. Bạn có thể tuỳ ý xác định quy trình dựa trên ExtraInfos
. Ví dụ: nếu độ suy giảm đang 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 của thanh âm lượng ban đầu để ngăn người dùng thay đổi âm lượng.
Các ứng dụng khác có thể chọn hiển thị thông báo ngắn cho biết 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.
Khung âm thanh trên ô tô phụ thuộc vào IAudioGainCallback
HAL AudioControl để cung cấp ExtraInfos
được đề xuất. Để tìm hiểu thêm, hãy xem phần Lệnh gọi lại tăng âm lượng.
CarVolumeGroupEvent
mở rộng để đáp ứng nhu cầu trong tương lai của khung âm thanh trên ô tô. Chúng tôi chỉ có ý định hỗ trợ các tính năng mới thông qua CarVolumeGroupEvent
. 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à chế độ tắt tiếng.
Lệnh gọi lại sự kiện nhóm âm lượng ô tô
Android 14 cung cấp một lệnh gọi lại mới cho các ứng dụng đặc quyền và ứng dụng nền tảng để đăng ký và được thông báo về CarVolumeGroupEvents
.
Để đăng ký lệnh 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à CarVolumeCallback
cũ, thì sự kiện CarVolumeGroupEventCallbacks
sẽ được ưu tiên.
Ngăn xếp âm thanh trên ô tô không còn kích hoạt CarVolumeCallback
nữa. Điều này giúp ngăn chặn các điều kiện kích hoạt trùng lặp cho 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ý âm lượng nhóm và các thay đổi về chế độ tắt tiếng.
Lệnh gọi lại tăng â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 thêm API sau:
API | Mục đích |
---|---|
IAudioControl#registerGainCallback |
Đăng ký một thực thể của IAudioGainCallback với AudioControl HAL. |
IAudioGainCallback#onAudioDeviceGainsChanged |
Lệnh gọi lại không đồng bộ để thông báo các thay đổi đối với cấu hình tăng âm thanh. |
Lệnh gọi lại HAL AudioControl bao gồm danh sách lý do và AudioGainConfigInfo
tương ứng, bao gồm:
- Mã vùng
- Địa chỉ cổng thiết bị
- Chỉ mục 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ó thể chia các lý do thành các danh mục sau:
- Lý do hạn chế. Thay đổi tạm thời đối với â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 â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 hao
Quy định hạn chế đang có hiệu lực | Thay đổi âm lượng do người dùng kích hoạt | Nút bật/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 | ❌ (quá hạn) ✔ (dưới hạn) |
✔ |
Độ suy hao | ✔ | ✔ |
Mức độ ưu tiên giữa các chế độ hạn chế là Tắt tiếng > Chặn > Giới hạn > Giảm mức độ.
Các hạn chế về việc tắt tiếng
Các hạn chế về việc tắt tiếng là:
Reasons.TCU_MUTE
Reasons.REMOTE_MUTE
Khung âm thanh trên ô tô duy trì hai trạng thái tắt tiếng sau đây:
Tắt tiếng người dùng. Bật/tắt dựa trên yêu cầu của người dùng, thông qua
CarAudioManager
hoặc sự kiện phím.Tắt tiếng HAL. Bật/tắt dựa trên các quy định hạn chế về chế độ tắt tiếng nhận được thông qua lệnh gọi lại
AudioGain
.
Đối với trình 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 liệu một trong hai chế độ tắt tiếng ở trên có được bật hay không.
Khi chế độ tắt tiếng HAL được bật, tất cả các yêu cầu thay đổi âm lượng và bỏ chế độ tắt tiếng nhóm sẽ bị bỏ qua trong thời gian áp dụng quy định hạn chế.
Trường hợp tương tác: Chế độ tắt tiếng HAL đang hoạt động và Người dùng yêu cầu bật/tắt chế độ Tắt tiếng
Khi chế độ 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 được thay đổi thành
true
. - Chúng tôi sẽ xử lý các yêu cầu của Người dùng về việc bật tính năng tắt tiếng.
- Lý do: Chúng tôi phải luôn tuân thủ yêu cầu tắt tiếng của người dùng để bảo vệ quyền riêng tư của họ.
Khi bạn bật tính năng tắt tiếng HAL và tính năng tắt tiếng Người dùng:
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 của Người dùng về việc tắt chế độ tắt tiếng sẽ được
NOT
xử lý. Trạng thái tắt tiếng của người dùng trong bộ nhớ đệm vẫn được bật.Lý do: Chúng tôi chỉ chấp nhận yêu cầu bật tiếng của người dùng nếu không có quy định hạn chế nào đang có hiệu lực.
Lý do: Việc bỏ chế độ tắt tiếng của người dùng đã lưu vào bộ nhớ đệm có thể gây ra tiếng nổ không mong muốn và làm nguy hiểm đến 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, làm giảm khả năng nhận biết mức âm thanh của người dùng.
Trường hợp tương tác: Bật và tắt tính năng Tắt tiếng HAL trong khi tính năng Tắt tiếng người dùng không có thay đổi nào
Việc bật/tắt chế độ 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, thao tá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ính năng Tắt tiếng người dùng bị tắt và lệnh gọi lại tắt tiếng HAL để bật được nhận:
- 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 của Người dùng về việc thay đổi âm lượng sẽ được
NOT
xử lý khi chế độ tắt tiếng HAL được bật.Lý do: Người dùng không thể nghe thấy âm thanh khi chế độ tắt tiếng đang bật. Việc cho phép thay đổi âm lượng có thể dẫn đến âm thanh bùng nổ 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 tính năng bật tiếng (CarAudioManager.setVolumeGroupMute(...,/* mute=*/ true,..)) tự động mà không cần người dùng can thiệp, nếu đây là hành vi dự kiến của nhà sản xuất thiết bị gốc (OEM).
Khi chế độ tắt tiếng HAL bị tắt trong khi chế độ tắt tiếng 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 thành trạng thái cố định và yêu cầu Người dùng bật tiếng có thể 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 thường xuyên bật/tắt.
Yêu cầu thay đổi âm lượng của người dùng sẽ được xử lý như bình thường.
Chặn
Các quy định hạn chế về việc chặn là:
Reasons.FORCED_MASTER_MUTE
Reasons.REMOTE_MUTE
Reasons.TCU_MUTE
.
Khi các quy định hạn chế về việc Chặn đang hoạt động, các yêu cầu của người dùng để:
- Hệ thống không xử lý yêu cầu thay đổi âm lượng.
- Bật/tắt tiếng được xử lý.
Giới hạn
Các hạn chế về giới hạn là:
Reasons.THERMAL_LIMITATION
Reasons.SUSPEND_EXIT_VOL_LIMITATION
Khi các quy định hạn chế về Giới hạn đang hoạt động, các yêu cầu của người dùng để:
Thay đổi âm lượng:
- Trong giới hạn được xử lý
- Giới hạn trên không được xử lý
Bật/tắt tiếng được xử lý.
Độ suy hao
Các hạn chế về độ suy hao là:
Reasons.ADAS_DUCKING
Reasons.NAV_DUCKING
Reasons.PROJECTION_DUCKING
Khi các quy định hạn chế về việc làm giảm độ sáng đang hoạt động, các yêu cầu của người dùng để:
Đã xử lý yêu cầu thay đổi âm lượng. Mức âm lượng hiện tại mới được đặt thành âm lượng giảm (thay vì âm lượng trước đó). Các thay đổi về âm lượng trong tương lai sẽ được thực hiện từ cấp này.
Đã xử lý nút bật/tắt tiếng.
Cập nhật để lập chỉ mục
Nội dung sau đây được coi là nội dung 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 thành chỉ mục đã chỉ định. Thông tin 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 trên ô tô. Nội dung cập nhật chỉ mục cũng được thông báo với Ứng dụng dưới dạng 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 Volume để thay đổi chỉ mục âm lượng thành 30.
Chỉ mục này được chuyển đổi thành mức tăng âm lượng và gửi đến 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 (chẳng hạn 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 (vì lý do Android không biết).
Cách 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 trên ô tô sử dụng chỉ mục mới từ lệnh gọi lại được dùng cho tính năng lưu trữ và lệnh gọi lại đến ứng dụng âm lượng. Chỉ mục 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ỉ mục thành 15.
Trường hợp sử dụng: Phát âm thanh lần đầu sau khi thoát trạng thái tạm ngưng
Chỉ mục âm lượng trước khi tạm ngưng được đặt ở mức cao là 95 (phạm vi: [0-99]).
Android chuyển sang trạng thái tạm ngưng.
Sau khi Android tồn tại, hãy tạm ngưng (ví dụ: tiếp tục):
Nhà cung cấp
Audio HAL/AudioControl HAL
áp dụng chỉ mục 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 trên ô tô sử dụng chỉ mục mới từ lệnh gọi lại được dùng để lưu trữ và các lệnh gọi lại của riêng dịch vụ này cho ứng dụng âm lượng đồng bộ hoá chỉ mục. Chỉ mục âm lượng trước khi tạm ngưng là 95. Tuy nhiên, sau khi tiếp tục, chỉ mục này sẽ được trình triển khai
AudioControl HAL
đặt thành mức âm lượng an toàn là 30.
Cấu hình dung 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:
Cấu hình xe hết hạn sản xuất (EOL).
Các nhà sản xuất ô tô muốn cập nhật cấu hình âm lượng tại EOL dựa trên chế độ thiết lập hệ thống âm thanh của xe. Thông thường, đây là một quá trình tải không qua cửa hàng mà không cần cập nhật hình ảnh phần mềm Android.
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.
Cấu hình thời gian chạy. Hệ thống âm thanh trên ô 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.
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 dựa trên 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ấu hình phạm vi âm lượng mới có hiệu lực trong thời gian của gói thuê bao.
Thiết kế
Cấu hình dung lượng động được thực hiện theo 3 giai đoạn:
Khám phá. Việc triển khai HAL AudioControl của nhà cung cấp sẽ 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 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 sẽ được tạo thông qua
AudioControl::IModuleChangeCallback
.Cập nhật. Ngăn xếp âm thanh trên ô tô cập nhật trạng thái nhóm âm lượng bằng các dải âm lượng mới.
Chúng tôi cố gắng 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ỉ 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 lệnh gọi lại.
Lệnh gọi lại.
Sau khi cập nhật phạm vi 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 các ứng dụng được đăng ký thông qua
CarVolumeGroupEventCallback
.CarVolumeGroupEvent
chứaCarVolumeGroupInfo
đã cập nhật, Loại sự kiện (thông tin đã thay đổi) và Thông tin bổ sung (lý do thay đổi).
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 giới thiệu các API sau:
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 HAL 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 phương tiện động được hiển thị bên dưới.
Hình 2. Sơ đồ trình tự cho cấu hình âm lượng độ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 định nghĩa về Automotive BUS:
- Cổng thiết bị.
IN_DEVICE
,OUT_DEVICE
- Kết nối.
BUS
- Địa chỉ. Được xác định trong định nghĩa Audio HAL
- Chế độ tăng cường.
JOINT
- Cổng thiết bị.
Nhà cung cấp phải xác định tập hợp con của 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 để tuỳ chỉnh phạm vi âm lượng cho các biến thể xe. Hãy xem định nghĩa AIDL
IModuleChangeCallbac
để biết thêm thông tin.Khi 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 dải âm lượng giống hệt nhau. Nếu không, khung âm thanh trên ô tô sẽ từ chối định nghĩa phạm vi âm lượng mới.