設備類型限制

在 Android 音頻中, audio_devices_t用於表示音頻設備類型。它在音頻源代碼中被廣泛用作位域來過濾或選擇一個或多個指定設備。在 Android 11 之前,音頻輸入/輸出設備類型限制為 30 種,並且沒有用於添加新音頻設備類型的備用插槽。我們已經取消了對音頻設備類型數量的限制,以允許添加新的音頻設備類型。

為了消除對音頻設備類型數量的限制,音頻設備類型現在是枚舉值而不是位掩碼。

所有現有的音頻設備類型都保持原樣。 AUDIO_DEVICE_BIT_IN仍然用於區分輸入或輸出設備。添加新的音頻設備類型時,它們是現有值之間間隙中的枚舉值。

OEM 不應使用audio_devices_t作為位掩碼,因為在添加新的枚舉音頻設備類型時可能會導致意外結果。

示例和來源

在 Android 11 之前,音頻設備類型作為位掩碼有兩種典型用法。

  • 使用audio_devices_t值來表示多個音頻設備。
  • 檢查audio_devices_t值是否包含來自指定類別的音頻設備類型。

為了表示多種音頻設備類型,使用/libaudiofoundation/include/media/AudioContainers.h中名為DeviceTypeSet的類,它是audio_devices_tstd::set容器。該類在供應商可用的libaudiofoundation庫中聲明。要在 C 代碼中表示多種音頻設備類型,可以使用audio_devices_t的數組或列表。

要檢查單個設備類型是否屬於指定類別,請使用 /system/media/audio/include/system/audio.h 中的輔助函數/system/media/audio/include/system/audio.h audio_is_.*_device 。對於多種音頻設備類型的情況,請使用libaudiofoundation中的輔助函數。例如,使用areAllOfSameDeviceType (DeviceTypeSet, std::function ) areAllOfSameDeviceType (DeviceTypeSet, std::function )AudioContainers.h中檢查是否所有給定的音頻設備類型都屬於同一類型。

執行

OEM 需要從音頻 HAL 實現中刪除音頻設備類型位字段表示。

  1. 刪除位域上的所有設備存儲。

    audio_devices_t不應用於表示多種音頻設備類型。相反,請使用列表或向量。

  2. 停止使用位操作進行設備類型比較。

    在 Android 11 之前,音頻設備類型可以用作位域。在這種情況下,通常使用位操作進行設備類型比較。添加新的枚舉音頻設備類型時,位操作可能會導致意外結果。相反,使用輔助函數作為替代方法。如果只有一個音頻設備類型,則使用直接比較來比較兩個值。要檢查音頻設備類型是否屬於指定類別,請使用/system/media/audio/include/system/audio.h中的輔助函數。例如, audio_is_output_device(audio_devices_t device)

  3. 停止對音頻設備類型組使用預定義值。

    system/media/audio/include/system/audio-base-utils.h中,音頻設備類型組AUDIO_DEVICE_OUT_ALL有一些預定義值。所有這些值都是保留的,但可能會被棄用,因為當添加新的枚舉音頻設備類型時它們將不正確。在audio-base-utils.h中定義了新的音頻設備類型組,它們是音頻設備類型的數組,例如AUDIO_DEVICE_OUT_ALL_ARRAY

  4. 實現用於路由的create_audio_patch()release_audio_patch()方法而不是set_parameters

    set_parameters方法使用音頻設備類型作為位域,因此如果添加新的枚舉音頻設備類型,可能會出現意外結果。

    目前,需要兩種音頻補丁:

    • 混合到設備補丁,用於播放
    • 混合補丁的設備,用於錄製

    在後續更新中,設備到設備可能需要額外的補丁。

    創建音頻補丁時,如果未指定補丁句柄,則需要音頻 HAL 生成可以識別音頻補丁的唯一補丁句柄。否則,音頻 HAL 應使用給定的音頻補丁句柄來更新音頻補丁。

    如果使用舊版音頻 HAL 和 AOSP HIDL 包裝器,則舊版音頻 HAL 應將主要 HAL 版本設置為 3.0。

    要啟用音頻補丁功能,音頻 HAL 應將主要 HAL 版本設置為 3.0 或更高版本。有關詳細信息,請參閱默認 HIDL 實現中的Device::supportsAudioPatches() ,也可以在 Cuttlefish 的音頻 HAL 上找到。

定制

無法關閉該功能,或恢復框架中的音頻設備重構,從而可以添加音頻設備類型。

添加的所有音頻設備類型都允許使用單個位集表示設備類型,因此當前的 HAL 實現仍然有效。

如果添加了新的音頻設備類型並且 OEM 想要使用它們,他們必須升級其音頻 HAL 實施並遷移到 HIDL 6.0 或更高版本。必須將主要 HAL 版本升級到 3.0 並實現create_audio_patchrelease_audio_patch方法,因為在添加新的音頻設備類型時使用set_parameters路由流可能會導致意外結果。

驗證

OEM 所需的工作是更新其 HAL 實施。用於音頻 HAL 的 VTS 可用於驗證實現是否按預期工作。所有測試都可以在VTS 文件中找到。