結合音訊裝置轉送功能現支援在以下國家/地區播放音訊: 多部音訊裝置。具有特殊權限的應用程式可以使用這項功能 為單一策略選取多個慣用裝置 透過系統 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 輸出串流 這項功能可能需要開啟及探測,才能取得支援的屬性。
開啟輸出串流時,必須指定音訊裝置。有效 媒體裝置是指在此環境開啟輸出串流時使用的裝置。
使用中的媒體裝置選項可能因實際裝置而異 已連線或中斷連線。音訊政策管理工具使用下列系列叢書 有效的媒體裝置挑選規則:
- 如果有所有偏好的媒體裝置都有,就會選擇這些裝置 和使用中的裝置一樣。
- 否則,系統會選擇最後連接的卸除式裝置。
- 如果沒有連接的卸除式裝置,則預設的音訊政策規則 選擇輸出裝置時,系統會將其套用至所選使用中的裝置。
輸出串流必須符合下列條件,才能重新開啟及轉送 到使用中的裝置,以便挑選最適合播放的設定:
- 輸出串流必須支援使用中的裝置。
- 輸出串流必須支援動態設定檔。
- 輸出串流目前不應轉送至使用中的裝置。
為套用選擇的新裝置,音訊政策管理工具會關閉並 如果輸出串流處於閒置狀態,系統會在裝置連線時重新開啟輸出串流,或 延後輸出串流進入待機模式時。
音訊政策管理工具提供下列系統 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);
舊版 get_audio_port
API 的資料必須填入新的
AudioPort
格式 (舊版 API 低於 3.2,且 HIDL HAL)
第 7 版以上。在本例中,所有記錄到的取樣率和管道
假設所有傳回的遮罩都支援 get_audio_port
的遮罩
方便您從 get_audio_port
值對應到
新的 AudioPort
結構
API 實作範例
本節說明幾個測試套件,其中包含使用 API 的方法 。請參考這些方法,瞭解 實作及使用這些 API 的方式
setPreferredDevicesForStrategy
的使用範例。
getPreferredDevicesForStrategy
、removePreferredDeviceForStrategy
和
OnPreferredDevicesForStrategyChangedListener
系統 API 位於
PreferredDeviceRoutingTest
方法,位於 GTS 中。
如要查看 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
測試。