Puoi utilizzare i seguenti meccanismi per riprodurre audio su Android:
Ogni meccanismo consente di riprodurre audio su Android. Per radio
la riproduzione o la riproduzione da dispositivi di input, queste opzioni potrebbero non essere sufficienti,
sebbene ciascuna possa essere abbinata all'acquisizione audio o
MediaRecorder
per acquisire l'audio e poi riprodurlo da Android. Per sistema
app in particolare, le seguenti informazioni possono essere usate per collegare
dispositivo a un mixer di output in AAOS.
Lettore HwAudioSource
HwAudioSource
connette il dispositivo di origine audio direttamente a un mixer Android.
Motivazioni
Quando si utilizza un audio da dispositivo a dispositivo o hardware, potrebbero sorgere diverse limitazioni patch con Android. Ogni opzione non è in grado di ricevere eventi chiave multimediali come RIPRODUCI, METTI IN PAUSA, INTERROMPI e perché aggirano l'audio di Android ognuno dei quali richiede hardware per mixare la patch in altri contenuti audio Android.
Utilizza HwAudioSource
HwAudioSource
è un nuovo tipo di player progettato come patch software. Questo
consente alle app che usano questo player di ricevere eventi chiave multimediali e output
mixato e indirizzato 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 player, tieni conto di queste aspettative per l'HAL audio. Per
ad esempio device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
si aspetta che la richiesta stabilisca una patch audio da un dispositivo a un mixer.adev_open_input_stream
prevede cheaudio_source
AUDIO_SOURCE_FM_TUNER
.in_read
riempie il buffer audio con dati audio radio broadcast.
Ti consigliamo di configurare un sintonizzatore di tipo AUDIO_DEVICE_IN_FM_TUNER
tra 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 trovare più facilmente l'ingresso della radio FM
dispositivo tramite l'AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
in combinazione con AudioDeviceInfo.TYPE_FM_TUNER
.
Creare patch audio
Puoi creare un patch audio tra due porte audio: una porta mix dalla porta del dispositivo. Di solito, una patch audio dalla porta mix alla porta del dispositivo mentre la direzione inversa è per l'acquisizione.
Ad esempio, una patch audio che instrada campioni audio dalla sorgente FM_TUNER
direttamente nel media sink bypassa il software mixer. Devi quindi utilizzare
mixer hardware per mixare i campioni audio di Android e FM_TUNER
per
un lavandino. Quando crei una patch audio direttamente dalla sorgente FM_TUNER
al contenuto multimediale
sink:
Il controllo del volume si applica al sink dei contenuti multimediali e dovrebbe interessare sia Android e audio
FM_TUNER
.Gli utenti possono passare dall'audio Android a
FM_TUNER
e viceversa tramite un'app semplice (non è necessaria una scelta esplicita relativa alla fonte multimediale).
Le implementazioni automobilistiche potrebbero anche dover creare una patch audio tra
porte del dispositivo. Per farlo, devi prima dichiarare le porte del dispositivo e
in audio_policy_configuration.xml
, quindi associa i mixport al
porte del dispositivo.
Configurazione di esempio
Guarda 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 Audio driver
Puoi utilizzare getExternalSources()
per recuperare un elenco di fonti disponibili
(identificati tramite l'indirizzo), quindi crea patch audio tra queste sorgenti e
e il sink delle porte in base agli utilizzi audio. I punti di ingresso corrispondenti sull'Audio HAL
compaiono 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 per la radio, ti consigliamo di usare HwAudioSource
così come appare
gestisce sia la creazione della patch che una sessione multimediale per gestire le chiavi multimediali
eventi. È possibile creare più sorgenti audio per la stessa sorgente e lo stesso audio
attributi. È possibile averne uno per il normale utilizzo della radio
la seconda per gli annunci sul traffico.
Se registri il dispositivo FM_TUNER
, in Android 11
autorizzazione per le attività è stata modificata in android.permission.CAPTURE_AUDIO_OUTPUT
.
Non viene più sottoposto al controllo delle autorizzazioni OP_RECORD_AUDIO
, che si applica
solo ai microfoni. Questo non dovrebbe influire sulle app perché sono già FM_TUNER
richiede l'autorizzazione SYSTEM_API
per l'accesso.
Vedi Implementare la radio per maggiori dettagli su creando un'app per la radio.