Use estes mecanismos para tocar áudio no Android:
- Player de mídia
- Exo Player (link em inglês)
- Faixa de áudio
- AAudio
Cada mecanismo permite que a reprodução de áudio seja realizada no Android. Para rádio
reprodução ou reprodução a partir de dispositivos de entrada, essas opções podem não ser suficientes,
embora cada um possa ser acoplado à captura de áudio ou
MediaRecorder
para capturar o áudio e depois reproduzi-lo no Android. Para o sistema
aplicativos em particular, as informações a seguir podem ser usadas para conectar uma entrada
para um mixer de saída no AAOS.
Player HwAudioSource
O HwAudioSource
conecta o dispositivo de fonte de áudio diretamente a um mixer do Android.
Motivações
Várias limitações podem surgir ao usar um áudio entre dispositivos ou de hardware com o Android. Cada opção não pode receber eventos principais de mídia, como PLAY, PAUSE e STOP, além de porque eles burlam o áudio do Android cada uma delas exige que os hardwares misturem o patch em outros áudios do Android.
Usar HwAudioSource
HwAudioSource
é um novo tipo de player projetado como um patch de software. Isso
permite que os apps que usam esse player recebam eventos de tecla de mídia e a saída
para que o stream seja misto e roteado pelo Android.
mHwAudioSource = new HwAudioSource.Builder()
.setAudioDeviceInfo(AudioDeviceInfo: info)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.build();
mHwAudioSource.play();
mHwAudioSource.stop();
Mudanças na HAL de áudio
Com esse novo player, considere essas expectativas para a HAL de áudio. Para
exemplo: device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
espera que a solicitação estabeleça um patch de áudio de um dispositivo para um mixer.adev_open_input_stream
espera que oaudio_source
sejaAUDIO_SOURCE_FM_TUNER
in_read
preenche o buffer de áudio com dados de áudio de rádio de transmissão.
Recomendamos que você configure um sintonizador com o tipo AUDIO_DEVICE_IN_FM_TUNER
em 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>
Com esta configuração do dispositivo, é mais fácil encontrar a entrada de rádio FM
dispositivo usando AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
conjunção com AudioDeviceInfo.TYPE_FM_TUNER
.
Criar patches de áudio
Você pode criar um patch de áudio entre duas portas de áudio, uma porta de mix ou uma na porta do dispositivo. Normalmente, um patch de áudio da porta de mix para a porta do dispositivo é para a reprodução do vídeo enquanto o sentido inverso é para a captura.
Por exemplo, um patch de áudio que encaminha amostras de áudio da origem FM_TUNER
diretamente no coletor de mídia ignora o mixer de software. Em seguida, use um
mixer de hardware para misturar as amostras de áudio do Android e FM_TUNER
da
afundam. Ao criar um patch de áudio diretamente da origem FM_TUNER
para a mídia
coletor:
O controle de volume se aplica ao coletor de mídia e afeta o ciclo de vida e
FM_TUNER
de áudio.Os usuários podem alternar entre o áudio do Android e do
FM_TUNER
em um app simples (nenhuma escolha explícita da fonte de mídia é necessária).
Implementações automotivas também podem precisar criar um patch de áudio entre dois
portas do dispositivo. Para isso, declare as portas do dispositivo primeiro e as possíveis
rotas no audio_policy_configuration.xml
e associar mixports à
portas do dispositivo.
Exemplo de configuração
Confira este exemplo de configuração,
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 Audio driver
Use getExternalSources()
para recuperar uma lista de fontes disponíveis.
(identificadas pelo endereço), depois criar patches de áudio entre essas fontes e as
do coletor por uso de áudio. Os pontos de entrada correspondentes na HAL de áudio
aparecem em 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);
...
}
Sintonizador de rádio
Ao criar um app de rádio, recomendamos que você use o HwAudioSource
lida com a criação do patch e com uma sessão de mídia para lidar com a chave de mídia
eventos. Várias fontes de áudio podem ser criadas para a mesma fonte e o mesmo áudio
atributos. É possível ter um para uso regular de rádio, bem como um
e o segundo para avisos de trânsito.
Se estiver gravando a FM_TUNER
, no Android 11 a
permissão para fazer foi alterada para android.permission.CAPTURE_AUDIO_OUTPUT
.
Ela não passa mais pela verificação de permissão OP_RECORD_AUDIO
, que se aplica
apenas aos microfones. Isso não deve afetar os apps porque FM_TUNER
já
O acesso requer a permissão SYSTEM_API
.
Consulte Implementar rádio para conferir detalhes sobre criando um app de rádio.