您可以使用以下机制在 Android 中播放音频:
每种机制都允许在 Android 中执行音频播放。电台适用
从输入设备播放或播放内容时,这些选项可能不够用
尽管每个功能都可以与音频捕获或
MediaRecorder
类,先捕获音频,然后从 Android 进行播放。系统专用
尤其是应用,以下信息可用于连接输入源
输出混音器(位于 AAOS 中)。
HwAudioSource 播放器
HwAudioSource
可将音频源设备直接连接到 Android 混音器。
动机
在 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
”权限才能访问。
请参阅实现电台功能,详细了解 构建电台应用