連結 AAOS 中的輸入裝置

您可以使用下列機制在 Android 中播放音訊:

每個機制都能在 Android 中執行音訊播放。收音機用 像是透過輸入裝置播放或播放 但每一項可能與音訊擷取 MediaRecorder敬上 類別,擷取音訊,然後從 Android 播放。系統專用 應用程式,會使用以下資訊連結輸入項目 輸出至 AAOS 中的輸出混合器。

HwAudioSource 播放器

HwAudioSource 可將音訊來源裝置直接連接至 Android 混音器。

動機

使用裝置端或硬體音訊時可能會發生一些限制 。每個選項都無法接收媒體重要事件,例如 播放暫停停止,以及遭到規避 Android 音訊 每一種都要求硬體將修補程式混入 Android 中的其他音訊。

使用 HwAudioSource

HwAudioSource 是新型播放器,設計為軟體修補程式。這個 可讓使用這個播放器的應用程式接收媒體重要事件和輸出內容 以及由 Android 轉送及轉送串流

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

音訊 HAL 相關異動

對這個新播放器而言,請考量我們對音訊 HAL 的期望。適用對象 例如:device/generic/car/emulator/audio/driver/audio_hw.c

  • adev_create_audio_patch 預期要求建立音訊修補程式 比如說

  • adev_open_input_stream」的audio_source應為 AUDIO_SOURCE_FM_TUNER

  • in_read 會將廣播無線電音訊資料填入音訊緩衝區。

建議你使用「AUDIO_DEVICE_IN_FM_TUNER」類型設定調諧器裝置 在 audio_policy_configuration.xml

<devicePort
    tagName="Tuner_source"
    type="AUDIO_DEVICE_IN_FM_TUNER"
    role="source"
    address="tuner0">
    <profile
        name=""
        format="AUDIO_FORMAT_PCM_16_BIT"
        samplingRates="48000"
        channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</devicePort>

你可以透過這項裝置設定,尋找 FM 無線電輸入裝置 裝置,AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS 搭配 AudioDeviceInfo.TYPE_FM_TUNER

建立音訊修補程式

您可以在兩個音訊連接埠之間建立音訊修補 (混合連接埠或 裝置通訊埠。一般而言,從混用連接埠到裝置連接埠的音訊修補程式 在擷取時依反向方向播放。

例如,從 FM_TUNER 來源轉送音訊樣本的音訊修補程式 就能略過軟體混音器接著,您必須使用 混合使用 Android 和 FM_TUNER 提供的 接收器。直接從 FM_TUNER 來源建立音訊修補程式時到媒體 接收器:

  • 音量控制項會套用至媒體接收器,且會影響 Android 和 FM_TUNER 音訊。

  • 使用者可以透過簡單的應用程式,在 Android 和 FM_TUNER 音訊之間切換 切換 (不需要明確選擇媒體來源)。

Automotive 實作項目可能也需要在兩個音訊檔之間建立音訊修補程式 裝置通訊埠。為此,您必須先宣告裝置通訊埠,並盡可能提供 audio_policy_configuration.xml中的路線,然後將混合通訊埠與 裝置通訊埠。

範例設定

請參考這個範例設定 device/generic/car/emulator/audio/audio_policy_configuration.xml

<audioPolicyConfiguration>
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_media_out</item>
                <item>bus1_audio_patch_test_in</item>
            </attachedDevices>
            <mixPorts>
                <mixPort name="mixport_bus0_media_out" role="source"
                        flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
                <mixPort name="mixport_audio_patch_in" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                           samplingRates="48000"
                           channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS"
                        address="bus0_media_out">
                    <profile balance="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
                <devicePort tagName="bus1_audio_patch_test_in" type="AUDIO_DEVICE_IN_BUS" role="source"
                        address="bus1_audio_patch_test_in">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_media_out" sources="mixport_bus0_media_out,bus1_audio_patch_test_in"/>
                <route type="mix" sink="mixport_audio_patch_in" sources="bus1_audio_patch_test_in"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>

音訊驅動程式 API

您可以使用 getExternalSources() 擷取可用來源清單 (根據地址識別),然後在這些來源與 並依據音訊用量分配接收器通訊埠音訊 HAL 上相應的進入點 出現在 IDevice.hal

Interface IDevice {
...
/
*   Creates an audio patch between several source and sink ports.  The handle
*   is allocated by the HAL and must be unique for this audio HAL module.
*
*   @param sources patch sources.
*   @param sinks patch sinks.
*   @return retval operation completion status.
*   @return patch created patch handle.
*/
createAudioPatch(vec<AudioPortConfig> sources, vec<AudioPortConfig> sinks)
       generates (Result retval, AudioPatchHandle patch);

*   Release an audio patch.
*
*   @param patch patch handle.
*   @return retval operation completion status.
*/
releaseAudioPatch(AudioPatchHandle patch) generates (Result retval);
...
}

電台調音器

建構電台應用程式時,建議您使用 HwAudioSource 可同時處理建立修補程式及處理媒體鍵的媒體工作階段 事件。您可以為相同的來源和音訊建立多個音訊來源 屬性。一般的無線電使用方法可能還是 第二個服務則用於顯示路況通知

如果記錄 FM_TUNER,在 Android 11 中 執行的權限已變更為「android.permission.CAPTURE_AUDIO_OUTPUT」。 該應用程式不會再通過 OP_RECORD_AUDIO 權限檢查,適用 。由於 FM_TUNER 已經為應用程式,因此這項設定不會影響應用程式 必須具備「SYSTEM_API」權限才能存取。

詳情請參閱「實作無線電」 打造電台應用程式