在Android音頻中, audio_devices_t
用於表示音頻設備類型。它在音頻源代碼中被廣泛用作位域,以過濾或選擇一個或多個指定設備。在Android 11之前的版本中,音頻輸入/輸出設備類型限制為30種,並且沒有可用的插槽來添加新的音頻設備類型。我們已取消了對音頻設備類型數量的限制,以允許添加新的音頻設備類型。
為了消除對音頻設備類型數量的限制,音頻設備類型現在是枚舉值,而不是位掩碼。
所有現有的音頻設備類型均保持不變。 AUDIO_DEVICE_BIT_IN
仍用於區分輸入或輸出設備。添加新的音頻設備類型時,它們是在現有值之間的空白中枚舉的值。
OEM不應將audio_devices_t
用作位掩碼,因為當添加新的枚舉音頻設備類型時,這可能會導致意外結果。
實例和來源
在Android 11之前,音頻設備類型有兩種典型用法,用作位掩碼。
- 使用
audio_devices_t
值表示多個音頻設備。 - 檢查
audio_devices_t
值是否包含指定類別中的音頻設備類型。
來表示多個音頻設備類型,一命名的類DeviceTypeSet
在/libaudiofoundation/include/media/AudioContainers.h
被使用,這是一個std::set
的容器audio_devices_t
。該類在供應商可用的libaudiofoundation
庫中聲明。 audio_devices_t
C代碼表示多種音頻設備類型,可以使用audio_devices_t
的數組或列表。
要檢查是否單個設備類型是一個指定的類別的,使用輔助功能audio_is_.*_device
在/system/media/audio/include/system/audio.h
。對於多種音頻設備類型,請在libaudiofoundation
使用輔助函數。例如,使用areAllOfSameDeviceType (DeviceTypeSet, std::function )
areAllOfSameDeviceType (DeviceTypeSet, std::function )
在AudioContainers.h
中檢查所有給定的音頻設備類型是否都相同。
實作
OEM需要從音頻HAL實現中刪除音頻設備類型位字段表示。
- 刪除位字段上的所有設備存儲。
audio_devices_t
不應用於表示多種音頻設備類型。而是使用列表或向量。 - 停止將位操作用於設備類型比較。
在Android 11之前的版本中,音頻設備類型可以用作位域。在這種情況下,通常使用位運算進行設備類型比較。添加新的枚舉音頻設備類型時,位操作可能會導致意外結果。而是使用輔助函數作為替代。如果只有一個音頻設備類型,則使用直接比較來比較兩個值。要檢查音頻設備類型是否屬於指定類別,請使用
/system/media/audio/include/system/audio.h
輔助函數。例如,audio_is_output_device(audio_devices_t device)
。 - 停止對音頻設備類型的組使用預定義的值。
在
system/media/audio/include/system/audio-base-utils.h
,有一些針對音頻設備類型AUDIO_DEVICE_OUT_ALL
預定義值。所有這些值均已保留,但可能會被棄用,因為添加新的枚舉音頻設備類型時它們將不正確。在audio-base-utils.h
定義了新的音頻設備類型組,它們是音頻設備類型的數組,例如AUDIO_DEVICE_OUT_ALL_ARRAY
。 - 實現用於路由而不是
set_parameters
的create_audio_patch()
和release_audio_patch()
方法。set_parameters
方法將音頻設備類型用作位域,因此,如果添加新的枚舉音頻設備類型,則可能會出現意外結果。當前,需要兩種音頻補丁:
- 混音到設備補丁,以便播放
- 混合補丁的設備,用於記錄
在後續更新中,設備到設備可能需要其他補丁。
創建音頻補丁時,如果未指定補丁句柄,則要求音頻HAL生成可識別音頻補丁的唯一補丁句柄。否則,音頻HAL應該使用給定的音頻補丁句柄來更新音頻補丁。
如果使用傳統音頻HAL和AOSP HIDL包裝器,則傳統音頻HAL應將主要HAL版本設置為3.0。
要啟用音頻補丁功能,音頻HAL應該將主要HAL版本設置為3.0或更高版本。有關更多信息,請參見默認HIDL實現中的
Device::supportsAudioPatches()
,也可以在針對墨魚的音頻HAL中找到該信息。
客制化
無法關閉功能或在框架中還原音頻設備重構,從而無法添加音頻設備類型。
添加的所有音頻設備類型都允許以單個位來表示設備類型,因此當前的HAL實現仍然有效。
如果添加了新的音頻設備類型,並且OEM想要使用它們,則他們必須升級其音頻HAL實施並轉移到HIDL 6.0版或更高版本。必須將主要的HAL版本升級到3.0,並實現create_audio_patch
和release_audio_patch
方法,因為在添加新的音頻設備類型時,使用set_parameters
路由流會導致意外的結果。
驗證方式
OEM所需的工作是更新其HAL實施。音頻HAL的VTS可用於驗證實現是否按預期工作。所有測試都可以在VTS文件中找到。