Vous pouvez utiliser les mécanismes suivants pour lire de l'audio sur Android:
Chaque mécanisme permet la lecture audio sur Android. Pour la lecture de la radio ou la lecture à partir d'appareils d'entrée, ces options peuvent ne pas suffire, bien que chacune puisse être associée à la capture audio ou à la classe MediaRecorder
pour capturer d'abord l'audio, puis le lire à partir d'Android. Pour les applications système en particulier, les informations suivantes peuvent être utilisées pour connecter un appareil d'entrée à un mélangeur de sortie dans AAOS.
Lecteur HwAudioSource
HwAudioSource
connecte l'appareil de source audio directement à un mixeur Android.
Motivations
Plusieurs limites peuvent survenir lors de l'utilisation d'un correctif audio d'appareil à appareil ou matériel avec Android. Aucune de ces options ne peut recevoir d'événements de touche multimédia tels que PLAY (LECTURE), PAUSE (PAUSE) et STOP (ARRÊT). Comme elles contournent la pile audio d'Android, elles nécessitent toutes du matériel pour mixer le correctif avec d'autres éléments audio d'Android.
Utiliser HwAudioSource
HwAudioSource
est un nouveau type de lecteur conçu comme un correctif logiciel. Cela permet aux applications qui utilisent ce lecteur de recevoir des événements de touche multimédia et de mélanger et de router le flux de sortie par Android.
mHwAudioSource = new HwAudioSource.Builder()
.setAudioDeviceInfo(AudioDeviceInfo: info)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.build();
mHwAudioSource.play();
mHwAudioSource.stop();
Modifications apportées au HAL audio
Avec ce nouveau lecteur, tenez compte de ces attentes pour le HAL audio. Par exemple, device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
s'attend à ce que la requête établisse un patch audio d'un appareil à un mélangeur.adev_open_input_stream
s'attend à ce queaudio_source
soitAUDIO_SOURCE_FM_TUNER
.in_read
remplit le tampon audio avec des données audio de radiodiffusion.
Nous vous recommandons de configurer un appareil de tuner avec le type AUDIO_DEVICE_IN_FM_TUNER
dans 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>
Avec cette configuration de l'appareil, vous pouvez faciliter la recherche de l'appareil d'entrée de la radio FM à l'aide de AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
en conjonction avec AudioDeviceInfo.TYPE_FM_TUNER
.
Créer des correctifs audio
Vous pouvez créer un patch audio entre deux ports audio, un port de mixage ou un port d'appareil. En règle générale, un patch audio du port de mixage au port de l'appareil est destiné à la lecture, tandis que l'inverse est destiné à la capture.
Par exemple, un patch audio qui achemine des échantillons audio de la source FM_TUNER
directement vers le collecteur multimédia contourne le mixeur logiciel. Vous devez ensuite utiliser un mélangeur matériel pour mixer les échantillons audio d'Android et de FM_TUNER
pour le sink. Lorsque vous créez un patch audio directement à partir de la source FM_TUNER
vers le collecteur multimédia:
La commande de volume s'applique au collecteur multimédia et doit affecter à la fois l'audio Android et
FM_TUNER
.Les utilisateurs peuvent basculer entre l'audio Android et
FM_TUNER
via un simple bouton d'application (aucun choix de source multimédia explicite n'est nécessaire).
Les implémentations pour l'automobile peuvent également nécessiter de créer un patch audio entre deux ports d'appareil. Pour ce faire, vous devez d'abord déclarer les ports de l'appareil et les routes possibles dans audio_policy_configuration.xml
, puis associer des mixports aux ports de l'appareil.
Exemple de configuration
Consultez cet exemple de configuration, 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 du pilote audio
Vous pouvez utiliser getExternalSources()
pour récupérer une liste des sources disponibles (identifiées par adresse), puis créer des correctifs audio entre ces sources et les ports de destination en fonction des utilisations audio. Les points d'entrée correspondants sur le HAL audio apparaissent dans 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);
...
}
Syntoniseur radio
Lorsque vous créez une application de radio, nous vous recommandons d'utiliser HwAudioSource
, car il gère à la fois la création du correctif et une session multimédia pour gérer les événements de clé multimédia. Vous pouvez créer plusieurs sources audio pour la même source et les mêmes attributs audio. Vous pouvez en avoir une pour l'écoute régulière de la radio et une autre pour les annonces routières.
Si vous enregistrez FM_TUNER
, l'autorisation pour ce faire a été remplacée par android.permission.CAPTURE_AUDIO_OUTPUT
dans Android 11.
Il ne passe plus par la vérification de l'autorisation OP_RECORD_AUDIO
, qui ne s'applique qu'aux micros. Cela ne devrait pas avoir d'incidence sur les applications, car FM_TUNER
nécessite déjà l'autorisation SYSTEM_API
pour accéder à l'application.
Pour en savoir plus sur la création d'une application de radio, consultez la section Implémenter la radio.