HwAudioSource 播放器

HwAudioSource 将音频来源设备直接连接到 Android 混音器。

动机

在 Android 中使用设备到设备或硬件音频补丁程序时,可能会存在一些限制。这些限制会导致无法接收 PLAY、PAUSE 和 STOP 等媒体键事件,因为这些事件会绕过 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_policy_configuration.xml 中配置类型为 AUDIO_DEVICE_IN_FM_TUNER 的调谐器设备:

<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>

通过此设备配置,结合使用 AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)AudioDeviceInfo.TYPE_FM_TUNER可便于查找 FM 电台输入设备。