設備類型限制

在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中的輔助函數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 檔案中找到。