Você pode usar estes mecanismos para reproduzir áudio no Android:
Cada mecanismo permite que a reprodução de áudio seja realizada no Android. Para reprodução de rádio
ou de dispositivos de entrada, essas opções podem não ser suficientes,
embora cada uma possa ser combinada com a captura de áudio ou a
MediaRecorder
classe para primeiro capturar o áudio e depois reproduzi-lo no Android. Para apps do sistema, em particular, as informações a seguir podem ser usadas para conectar um dispositivo de entrada a um mixer de saída no AAOS.
Player HwAudioSource
HwAudioSource conecta o dispositivo de origem de áudio diretamente a um mixer do Android.
Motivações
Várias limitações podem surgir ao usar um patch de áudio de dispositivo para dispositivo ou de hardware com o Android. Cada opção não pode receber eventos de tecla de mídia, como PLAY, PAUSE e STOP e, como contornam a pilha de áudio do Android, cada uma exige hardware para mixar o patch em outro áudio 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 que o stream de saída seja mixado 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 estas expectativas para a HAL de áudio. Por exemplo, device/generic/car/emulator/audio/driver/audio_hw.c.
adev_create_audio_patchespera que a solicitação estabeleça um patch de áudio de um dispositivo para um mixer.adev_open_input_streamespera queaudio_sourcesejaAUDIO_SOURCE_FM_TUNER.in_readpreenche o buffer de áudio com dados de áudio de rádio transmitido.
Recomendamos que você configure um dispositivo 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 essa configuração de dispositivo, você pode facilitar a localização do dispositivo de entrada de rádio FM usando AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS em conjunto com AudioDeviceInfo.TYPE_FM_TUNER.
Criar patches de áudio
É possível criar um patch de áudio entre duas portas de áudio, uma porta de mixagem ou uma porta de dispositivo. Normalmente, um patch de áudio da porta de mixagem para a porta do dispositivo é para reprodução, enquanto a direção inversa é para captura.
Por exemplo, um patch de áudio que roteia amostras de áudio da origem FM_TUNER diretamente para o coletor de mídia ignora o mixer de software. Em seguida, você precisa usar um mixer de hardware para mixar as amostras de áudio do Android e FM_TUNER para o coletor. Ao criar um patch de áudio diretamente da origem FM_TUNER para o coletor de mídia:
O controle de volume se aplica ao coletor de mídia e afeta o áudio do Android e do
FM_TUNER.Os usuários podem alternar entre o áudio do Android e do
FM_TUNERcom uma simples troca de app (não é necessária uma escolha explícita da origem de mídia).
As implementações automotivas também podem precisar criar um patch de áudio entre duas portas de dispositivo. Para fazer isso, primeiro declare as portas do dispositivo e as possíveis rotas em audio_policy_configuration.xml e associe as mixports às portas do dispositivo.
Exemplo de configuração
Consulte 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 do driver de áudio
É possível usar getExternalSources() para recuperar uma lista de origens disponíveis (identificadas por endereço) e, em seguida, criar patches de áudio entre essas origens e as portas do coletor por usos 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, porque ele processa a criação do patch e uma sessão de mídia para processar eventos de tecla de mídia. Várias origens de áudio podem ser criadas para a mesma origem e atributos de áudio. É possível ter uma para uso normal de rádio e outra para anúncios de trânsito.
Se você estiver gravando o FM_TUNER, no Android 11 a permissão para fazer isso 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 a microfones. Isso não deve afetar os apps, já que o FM_TUNER já exige a permissão SYSTEM_API para acesso.
Consulte Implementar rádio para detalhes sobre como criar um app de rádio.