綜合音訊裝置轉送

結合音訊裝置轉送功能現支援在以下國家/地區播放音訊: 多部音訊裝置。具有特殊權限的應用程式可以使用這項功能 為單一策略選取多個慣用裝置 透過系統 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 輸出串流 這項功能可能需要開啟及探測,才能取得支援的屬性。

開啟輸出串流時,必須指定音訊裝置。有效 媒體裝置是指在此環境開啟輸出串流時使用的裝置。

使用中的媒體裝置選項可能因實際裝置而異 已連線或中斷連線。音訊政策管理工具使用下列系列叢書 有效的媒體裝置挑選規則:

  1. 如果有所有偏好的媒體裝置都有,就會選擇這些裝置 和使用中的裝置一樣。
  2. 否則,系統會選擇最後連接的卸除式裝置。
  3. 如果沒有連接的卸除式裝置,則預設的音訊政策規則 選擇輸出裝置時,系統會將其套用至所選使用中的裝置。

輸出串流必須符合下列條件,才能重新開啟及轉送 到使用中的裝置,以便挑選最適合播放的設定:

  • 輸出串流必須支援使用中的裝置。
  • 輸出串流必須支援動態設定檔。
  • 輸出串流目前不應轉送至使用中的裝置。

為套用選擇的新裝置,音訊政策管理工具會關閉並 如果輸出串流處於閒置狀態,系統會在裝置連線時重新開啟輸出串流,或 延後輸出串流進入待機模式時。

音訊政策管理工具提供下列系統 API 清單(定義請見 AudioManager.java):

  • setPreferredDeviceForStrategy

    針對特定策略設定音訊路由的偏好裝置。注意事項 表示偏好裝置當時可能無法使用裝置 而是在準備就緒後使用。

  • removePreferredDeviceForStrategy

    移除先前設定的慣用音訊裝置 setPreferredDeviceForStrategysetPreferredDevicesForStrategy

  • getPreferredDeviceForStrategy

    傳回先前設定的音訊策略偏好裝置 setPreferredDeviceForStrategysetPreferredDevicesForStrategy

  • setPreferredDevicesForStrategy

    設定特定策略的偏好裝置。

  • getPreferredDevicesForStrategy

    傳回先前設定的音訊策略偏好裝置 setPreferredDeviceForStrategysetPreferredDevicesForStrategy

  • 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 資料類型是以 AudioTransportAudioProfile 結構,用於描述裝置的 即便沒有技術背景,也能因這些工具的功能而受益

音訊 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 的使用範例。 getPreferredDevicesForStrategyremovePreferredDeviceForStrategyOnPreferredDevicesForStrategyChangedListener 系統 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#testPreferredDeviceRoutingAudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset 測試。