結合音訊裝置路由功能後,系統就能同時將音訊串流至多個音訊裝置。具有特殊權限的應用程式可以使用這項功能 為單一策略選取多個慣用裝置 透過系統 API應用程式可以更發掘音訊裝置的功能 只要使用這項功能提供的公用 API,即可達成精確的目標 對於 Android 11 以下版本,音訊架構實作僅支援同時連線的多個相同類型音訊裝置 (例如 2 個藍牙 A2DP 耳機)。預設音訊路由 規則也不允許使用者為同一類型 或特定用途
自 Android 12 起,系統會移除相關限制 以便實現新用途,例如向群組發布音訊廣播、多點傳播等 ,或同時選取多個 USB 音效卡。 不支援同時轉送至多個 USB 裝置。
自 Android 14 起,USB 架構支援 可連接多個 USB 裝置,因為 USB 裝置具有不同的音訊 可從核心和供應商支援連接多個 USB 裝置 裝置。
本頁面將說明如何實作串流音訊至多個音訊裝置的支援功能,以及如何驗證您實作的這項功能。
支援將音訊串流至多部音訊裝置
Android 12 有兩組 API 可支援這項功能:
- 系統 API 可為策略處理多個偏好的裝置。
- 供應商在音訊 HAL 中實作的 HIDL 介面, 回報裝置功能。
下列各節將詳細說明各個 API。
為策略處理多個偏好裝置
音訊政策管理工具提供的系統 API 能更好地支援串流音訊, 多部音訊裝置。這些系統 API 可讓您進行設定 並移除多個偏好的裝置。改為使用 Android 裝置 12,這項功能僅適用於單一裝置。
音訊政策管理工具會介紹有效媒體裝置的概念, 說明最有可能獲選播放媒體的裝置。時間 會連接卸除式裝置,音訊 HAL 輸出串流 這項功能可能需要開啟及探測,才能取得支援的屬性。
開啟輸出串流時,必須指定音訊裝置。在這個情境中,當輸出串流開啟時,所使用的裝置即為有效媒體裝置。
活動媒體裝置的選取項目可能會因實際連線或斷線的裝置而異。音訊政策管理工具使用下列系列叢書 有效的媒體裝置挑選規則:
- 如果有所有偏好的媒體裝置都有,就會選擇這些裝置 和使用中的裝置一樣。
- 否則,系統會選擇上次連結的可移除裝置。
- 如果沒有連接的卸除式裝置,則預設的音訊政策規則 選擇輸出裝置時,系統會將其套用至所選使用中的裝置。
輸出串流必須符合下列條件,才能重新開啟並路由至有效裝置,以便為播放選取最佳設定:
- 輸出串流必須支援使用中的裝置。
- 輸出串流必須支援動態設定檔。
- 輸出串流目前不應轉送至使用中的裝置。
為了套用新的裝置選項,如果輸出串流處於閒置狀態,Audio Policy Manager 會在裝置連線時關閉及重新開啟輸出串流,或是在輸出串流進入待機狀態時延遲。
Audio Policy Manager 提供下列系統 API 清單 (如 AudioManager.java
中所定義):
setPreferredDeviceForStrategy
針對特定策略設定音訊路由的偏好裝置。注意事項 表示偏好裝置當時可能無法使用裝置 而是在準備就緒後使用。
removePreferredDeviceForStrategy
移除先前設定的慣用音訊裝置
setPreferredDeviceForStrategy
或setPreferredDevicesForStrategy
。getPreferredDeviceForStrategy
傳回先前設定的音訊策略偏好裝置
setPreferredDeviceForStrategy
或setPreferredDevicesForStrategy
。setPreferredDevicesForStrategy
設定指定策略的偏好裝置。
getPreferredDevicesForStrategy
傳回先前透過
setPreferredDeviceForStrategy
或setPreferredDevicesForStrategy
設定的音訊策略所用的偏好裝置。OnPreferredDevicesForStrategyChangedListener
定義介面,用於通知偏好的音訊裝置變更,這些裝置是針對特定音訊策略設定的。
addOnPreferredDevicesForStrategyChangedListener
新增監聽器,以便在策略偏好的音訊裝置發生變更時收到通知。
removeOnPreferredDevicesForStrategyChangedListener
移除先前新增對策略偏好變更的監聽器 音訊裝置。
回報裝置功能
在音訊 HAL 實作過程中,廠商會導入支援 API 的 API 回報裝置功能本節說明資料類型和方法 用於回報裝置功能及列出音訊 HIDL HAL 的一些變更 第 7 版,可支援多種裝置。
資料類型
在音訊 HIDL HAL V7 中,裝置功能會使用 AudioProfile
和 AudioTransport
結構回報。AudioTransport
結構描述音訊端口的功能,其中 AudioProfile
適用於已知的音訊格式,而原始硬體描述符則適用於平台不認識的格式。
AudioProfile
結構包含音訊格式,支援的取樣率
和頻道遮罩清單,如以下程式碼所示
封鎖 types.hal
:
/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
AudioFormat format;
/** List of the sample rates (in Hz) supported by the profile. */
vec<uint32_t> sampleRates;
/** List of channel masks supported by the profile. */
vec<AudioChannelMask> channelMasks;
};
在音訊 HIDL HAL V7 中,AudioPort
資料類型會使用 AudioTransport
和 AudioProfile
結構定義,以便描述裝置的功能。
音訊 HAL 方法
音訊政策管理工具會使用下列方法查詢裝置的 功能:
getParameters:
這是擷取供應商專屬參數值的一般方法,例如支援的音訊格式及其相應的取樣率。getAudioPort:
傳回指定音訊埠的支援屬性清單 (例如取樣率、格式、通道遮罩、增益控制器)。
IDevice.hal
提供的下列程式碼
會顯示 getAudioPort
方法的介面:
/**
* Returns the list of supported attributes for a given audio port.
*
* As input, 'port' contains the information (type, role, address etc...)
* needed by the HAL to identify the port.
*
* As output, 'resultPort' contains possible attributes (sampling rates,
* formats, channel masks, gain controllers...) for this port.
*
* @param port port identifier.
* @return retval operation completion status.
* @return resultPort port descriptor with all parameters filled up.
*/
getAudioPort(AudioPort port)
generates (Result retval, AudioPort resultPort);
舊版 API 異動
為了支援多個音訊設定檔,舊版 API 3.2 版新增了
名為 audio_port_v7
的結構詳情請參閱原始碼。
由於新增 audio_port_v7
,舊版 API 3.2 版新增了
名為 get_audio_port_v7
的新 API,會使用
audio_port_v7
結構。
audio.h
提供的下列程式碼
會顯示 get_audio_port_v7
API 的定義:
/**
* Fills the list of supported attributes for a given audio port.
* As input, "port" contains the information (type, role, address etc...)
* needed by the HAL to identify the port.
* As output, "port" contains possible attributes (sampling rates,
* formats, channel masks, gain controllers...) for this port. The
* possible attributes are saved as audio profiles, which contains audio
* format and the supported sampling rates and channel masks.
*/
int (*get_audio_port_v7)(struct audio_hw_device *dev,
struct audio_port_v7 *port);
如果舊版 API 版本低於 3.2,而 HIDL HAL 版本為 7 以上,則必須將舊版 get_audio_port
API 的資料填入新的 AudioPort
格式。在本例中,所有記錄到的取樣率和管道
假設所有傳回的遮罩都支援 get_audio_port
的遮罩
方便您從 get_audio_port
值對應到
新的 AudioPort
結構
API 實作範例
本節說明幾個測試套件,其中包含使用 API 的方法 。如需這些 API 的實作和使用方式範例,請參考這些方法。
setPreferredDevicesForStrategy
、getPreferredDevicesForStrategy
、removePreferredDeviceForStrategy
和 OnPreferredDevicesForStrategyChangedListener
系統 API 的使用方式範例,可參考 GTS 中的 PreferredDeviceRoutingTest
方法。
如要查看 AudioDeviceInfo
中新結構的使用範例,請參閱 CTS 中的 AudioManagerTest#testGetDevices
方法。
get_audio_port_v7
的實作範例位於
audio_hal.c
並說明多種裝置查詢功能的方式。
驗證
本節將介紹 CTS 和音訊管理員的 GTS (Google 行動服務測試套件) 驗證。
CTS 測試
CTS 測試位於 android.media.cts.AudioManagerTest
。
以下列出可用的音訊管理員測試:
AudioManagerTest#testGetDevices
驗證音訊裝置的精確功能。它也會驗證
AudioDeviceInfo
結構中傳回的音訊設定檔是否保留舊版扁平陣列格式的內容,但採用新的AudioProfile
格式。「
AudioManagerTest#testPreferredDevicesForStrategy
」和AudioManagerTest#testPreferredDeviceForCapturePreset
確認策略的偏好裝置和擷取預設相關 API 測試是否已順利完成。
GTS 測試
GTS 測試位於 com.google.android.gts.audioservice.AudioServiceHostTest
。
驗證慣用裝置的 API 是否可因應策略並擷取預設設定
可正常運作,請執行 AudioServiceHostTest#testPreferredDeviceRouting
和 AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset
測試。