Puoi utilizzare questi meccanismi per riprodurre l'audio in Android:
Ciascun meccanismo consente di eseguire la riproduzione audio in Android. Per la riproduzione radiofonica o la riproduzione da dispositivi di input, queste opzioni potrebbero non essere sufficienti, sebbene ciascuna possa essere abbinata all'acquisizione audio o alla classe MediaRecorder
per acquisire prima l'audio e quindi riprodurlo da Android. Per le app di sistema in particolare, le seguenti informazioni possono essere utilizzate per connettere un dispositivo di input a un mixer di output in AAOS.
Lettore HwAudioSource
HwAudioSource
collega il dispositivo sorgente audio direttamente a un mixer Android.
Motivazioni
Potrebbero verificarsi diverse limitazioni quando si utilizza una patch audio da dispositivo a dispositivo o hardware con Android. Ciascuna opzione non è in grado di ricevere eventi chiave multimediali come PLAY , PAUSE e STOP e, poiché aggirano lo stack audio di Android, ciascuna richiede hardware per combinare la patch con altro audio da Android.
Utilizza HwAudioSource
HwAudioSource
è un nuovo tipo di lettore progettato come patch software. Ciò consente alle app che utilizzano questo lettore per 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, considera queste aspettative per l'HAL audio. Ad esempio, device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
prevede che la richiesta stabilisca una patch audio da un dispositivo a un mixer.adev_open_input_stream
si aspetta cheaudio_source
siaAUDIO_SOURCE_FM_TUNER
.in_read
riempie il buffer audio con i dati audio trasmessi dalla radio.
Ti consigliamo di configurare un dispositivo sintonizzatore con il 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
.
Crea patch audio
È possibile creare una patch audio tra due porte audio, una porta mix o una porta dispositivo. In genere, una patch audio dalla porta del mix alla porta del dispositivo serve per la riproduzione mentre la direzione inversa serve per l'acquisizione.
Ad esempio, una patch audio che instrada campioni audio dalla sorgente FM_TUNER
direttamente al dissipatore multimediale bypassa il mixer software. È quindi necessario utilizzare un mixer hardware per mixare i campioni audio da Android e FM_TUNER
per il sink. Quando si crea una patch audio direttamente dalla sorgente FM_TUNER
al sink multimediale:
Il controllo del volume si applica al sink multimediale e dovrebbe influire sia sull'audio Android che
FM_TUNER
.Gli utenti possono passare dall'audio Android a
FM_TUNER
tramite un semplice cambio di app (non è necessaria la scelta esplicita della fonte multimediale).
Le implementazioni automobilistiche potrebbero anche dover creare una patch audio tra due porte del dispositivo. Per fare ciò, devi prima dichiarare le porte del dispositivo e i possibili percorsi in audio_policy_configuration.xml
e quindi associare mixports alle porte del dispositivo.
Configurazione di esempio
Vedi 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
È possibile utilizzare getExternalSources()
per recuperare un elenco di fonti disponibili (identificate dall'indirizzo), quindi creare patch audio tra queste fonti e le porte sink in base agli utilizzi audio. I punti di ingresso corrispondenti sull'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 radiofonico
Quando crei un'app radio, ti consigliamo di utilizzare HwAudioSource
poiché gestisce sia la creazione della patch sia una sessione multimediale per gestire gli eventi chiave multimediale. È possibile creare più sorgenti audio per la stessa sorgente e gli stessi attributi audio. È possibile averne uno per l'utilizzo regolare della radio e un secondo per gli annunci sul traffico.
Se si registra FM_TUNER
, in Android 11 l'autorizzazione per l'esecuzione è stata modificata in android.permission.CAPTURE_AUDIO_OUTPUT
. Non viene più sottoposto al controllo dei permessi OP_RECORD_AUDIO
, che si applica solo ai microfoni. Ciò non dovrebbe avere alcun impatto sulle app poiché FM_TUNER
richiede già l'autorizzazione SYSTEM_API
per l'accesso.
Vedi Implementare la radio per dettagli sulla creazione di un'app radio.