Puoi utilizzare questi meccanismi per riprodurre l'audio in Android:
Ogni meccanismo consente di eseguire la riproduzione audio in Android. Per la riproduzione della radio
o da dispositivi di input, queste opzioni potrebbero non essere sufficienti,
anche se ognuna potrebbe essere accoppiata con l'acquisizione audio o la
MediaRecorder
classe per acquisire prima l'audio e poi riprodurlo da Android. Per le app di sistema in particolare, le seguenti informazioni possono essere utilizzate per collegare un dispositivo di input a un mixer di output in AAOS.
Lettore HwAudioSource
HwAudioSource collega il dispositivo di origine audio direttamente a un mixer Android.
Motivazioni
Quando utilizzi una patch audio hardware o da dispositivo a dispositivo con Android, potrebbero verificarsi diverse limitazioni. Ogni opzione non è in grado di ricevere eventi chiave multimediali come PLAY, PAUSE e STOP e, poiché aggirano lo stack audio di Android, ognuna richiede hardware per mixare la patch in altri audio da Android.
Utilizzare HwAudioSource
HwAudioSource è un nuovo tipo di lettore progettato come patch software. In questo modo, le app che utilizzano questo lettore possono ricevere eventi chiave multimediali e il flusso di output può essere mixato e instradato da Android.
mHwAudioSource = new HwAudioSource.Builder()
.setAudioDeviceInfo(AudioDeviceInfo: info)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.build();
mHwAudioSource.play();
mHwAudioSource.stop();
Modifiche all'HAL audio
Con questo nuovo lettore, tieni presente queste aspettative per l'HAL audio. Ad esempio, device/generic/car/emulator/audio/driver/audio_hw.c.
adev_create_audio_patchprevede che la richiesta stabilisca una patch audio da un dispositivo a un mixer.adev_open_input_streamprevede cheaudio_sourcesiaAUDIO_SOURCE_FM_TUNER.in_readriempie il buffer audio con i dati audio della radio di trasmissione.
Ti consigliamo di configurare un dispositivo sintonizzatore con tipo AUDIO_DEVICE_IN_FM_TUNER in 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>
Con questa configurazione del dispositivo, puoi facilitare la ricerca del dispositivo di input della radio FM utilizzando AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS insieme a AudioDeviceInfo.TYPE_FM_TUNER.
Creare patch audio
Puoi creare una patch audio tra due porte audio, una porta di mix o una porta del dispositivo. In genere, una patch audio dalla porta di mix alla porta del dispositivo è per la riproduzione, mentre la direzione inversa è per l'acquisizione.
Ad esempio, una patch audio che instrada i campioni audio dalla sorgente FM_TUNER direttamente al sink multimediale bypassa il mixer software. Devi quindi utilizzare un mixer hardware per mixare i campioni audio da Android e FM_TUNER per il sink. Quando crei una patch audio direttamente dalla sorgente FM_TUNER al sink multimediale:
Il controllo del volume si applica al sink multimediale e dovrebbe interessare sia l'audio Android sia l'audio
FM_TUNER.Gli utenti possono passare dall'audio Android all'audio
FM_TUNERtramite un semplice cambio di app (non è necessaria una scelta esplicita della sorgente multimediale).
Le implementazioni automobilistiche potrebbero anche dover creare una patch audio tra due porte del dispositivo. Per farlo, devi prima dichiarare le porte del dispositivo e i possibili percorsi in audio_policy_configuration.xml, quindi associare le porte di mix alle porte del dispositivo.
Esempio di configurazione
Consulta questa configurazione di esempio, 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 del driver audio
Puoi utilizzare getExternalSources() per recuperare un elenco di sorgenti disponibili (identificate dall'indirizzo), quindi creare patch audio tra queste sorgenti e le porte di sink in base agli utilizzi audio. I punti di ingresso corrispondenti nell'HAL audio vengono visualizzati in 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);
...
}
Sintonizzatore radio
Quando crei un'app radio, ti consigliamo di utilizzare HwAudioSource, in quanto gestisce sia la creazione della patch sia una sessione multimediale per gestire gli eventi chiave multimediali. È possibile creare più sorgenti audio per la stessa sorgente e gli stessi attributi audio. È possibile averne una per l'utilizzo normale della radio e una seconda per gli annunci sul traffico.
Se registri FM_TUNER, in Android 11 l'autorizzazione per farlo è stata modificata in android.permission.CAPTURE_AUDIO_OUTPUT.
Non passa più attraverso il controllo dell'autorizzazione OP_RECORD_AUDIO, che si applica solo ai microfoni. Questo non dovrebbe influire sulle app, poiché FM_TUNER richiede già l'autorizzazione SYSTEM_API per l'accesso.
Per maggiori dettagli sulla creazione di un'app radio, consulta Implementare la radio.