裝置類型限制

在 Android 音訊中,audio_devices_t 用於表示音訊裝置類型。音訊原始碼廣泛使用這個欄位,做為位元欄位來篩選或選取一或多個指定裝置。在 Android 11 之前,音訊輸入/輸出裝置類型上限為 30 種,且沒有備用位置可新增音訊裝置類型。我們已移除音訊裝置類型數量限制,因此現在可以新增音訊裝置類型。

為移除音訊裝置類型數量限制,音訊裝置類型現在是列舉值,而非位元遮罩。

所有現有的音訊裝置類型都會維持不變。AUDIO_DEVICE_BIT_IN 仍用於區分輸入或輸出裝置。新增音訊裝置類型時,這些類型會列舉為現有值之間的間隙值。

原始設備製造商不應使用 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 中的輔助函式。舉例來說,在 AudioContainers.h 中使用 areAllOfSameDeviceType (DeviceTypeSet, std::function),檢查所有指定的音訊裝置類型是否為同一類型。

實作

原始設備製造商必須從音訊 HAL 實作中移除音訊裝置類型位元欄位表示法。

  1. 移除位元欄位中所有裝置的儲存空間。

    audio_devices_t 不應用於表示多種音訊裝置類型。請改用清單或向量。

  2. 停止使用位元運算進行裝置類型比較。

    在 Android 11 之前,音訊裝置類型可做為位元欄位使用。在這種情況下,通常會使用位元運算來比較裝置類型。新增列舉的音訊裝置類型時,位元運算可能會導致非預期的結果。請改用輔助函式。如果只有單一音訊裝置類型,請使用直接比較來比較這兩個值。如要檢查音訊裝置類型是否屬於特定類別,請使用 /system/media/audio/include/system/audio.h 中的輔助函式。例如:audio_is_output_device(audio_devices_t device)

  3. 停止使用音訊裝置類型群組的預先定義值。

    音訊裝置類型群組 (AUDIO_DEVICE_OUT_ALL) 有一些預先定義的值,位於 system/media/audio/include/system/audio-base-utils.h 中。這些值都會保留,但可能會遭到淘汰,因為新增列舉音訊裝置類型時,這些值就不正確了。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 以上。詳情請參閱 Device::supportsAudioPatches() 中的 預設 HIDL 實作,這項資訊也適用於 Cuttlefish 的音訊 HAL。

自訂

您無法關閉這項功能,也無法還原架構中的音訊裝置重構,因為這樣就無法新增音訊裝置類型。

新增的所有音訊裝置類型都允許以單一位元集表示裝置類型,因此目前的 HAL 實作項目仍可運作。

如果新增音訊裝置類型,且原始設備製造商想使用這些類型,就必須升級音訊 HAL 實作,並改用 HIDL 6.0 以上版本。您必須將主要 HAL 版本升級至 3.0,並實作 create_audio_patchrelease_audio_patch 方法,因為使用 set_parameters 路由傳輸串流時,如果新增音訊裝置類型,可能會導致非預期的結果。

驗證

原始設備製造商必須更新 HAL 實作項目。音訊 HAL 的 VTS 可用於驗證實作項目是否正常運作。所有測試都位於 VTS 檔案中。