您可以使用下列機制在 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
」權限才能存取。
詳情請參閱「實作無線電」 打造電台應用程式