Vous pouvez utiliser les mécanismes suivants pour lire de l'audio sur Android :
Chaque mécanisme permet la lecture audio dans Android. Pour la lecture de la radio ou à partir de périphériques d'entrée, ces options peuvent ne pas suffire, bien que chacune puisse être associée à la capture audio ou à la classe MediaRecorder
pour d'abord capturer 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 périphérique d'entrée à un mixeur de sortie dans AAOS.
Lecteur HwAudioSource
HwAudioSource
connecte l'appareil de source audio directement à un mixeur Android.
Motivations
Plusieurs limites peuvent se présenter lorsque vous utilisez un patch audio matériel ou d'appareil à appareil avec Android. Chaque option ne peut pas recevoir d'événements de touches multimédias tels que PLAY, PAUSE et STOP. De plus, comme elles contournent la pile audio d'Android, chacune nécessite du matériel pour mixer le patch 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 au flux de sortie d'être mixé et routé 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 à l'HAL audio
Avec ce nouveau lecteur, tenez compte des attentes suivantes concernant la couche d'abstraction matérielle 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 vers un mixeur.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 radio.
Nous vous recommandons de configurer un appareil tuner de 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 du périphérique d'entrée de la radio FM en utilisant AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
en conjonction avec AudioDeviceInfo.TYPE_FM_TUNER
.
Créer des patchs audio
Vous pouvez créer un patch audio entre deux ports audio, qu'il s'agisse d'un port de mixage ou d'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 le sens inverse est destiné à la capture.
Par exemple, un correctif audio qui achemine les échantillons audio de la source FM_TUNER
directement vers le récepteur multimédia contourne le mixeur logiciel. Vous devez ensuite utiliser un mixeur matériel pour mixer les échantillons audio d'Android et FM_TUNER
pour le récepteur. Lorsque vous créez un correctif audio directement à partir de la source FM_TUNER
vers le récepteur multimédia :
Le contrôle du volume s'applique au récepteur multimédia et doit affecter à la fois l'audio Android et
FM_TUNER
.Les utilisateurs peuvent passer de l'audio Android à l'audio
FM_TUNER
en changeant simplement d'application (aucune sélection explicite de source multimédia n'est nécessaire).
Les implémentations automobiles peuvent également avoir besoin de créer un correctif audio entre deux ports d'appareil. Pour ce faire, vous devez d'abord déclarer les ports de l'appareil et les itinéraires possibles dans audio_policy_configuration.xml
, puis associer les 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 leur adresse), puis créer des patchs audio entre ces sources et les ports de récepteur par usages audio. Les points d'entrée correspondants sur Audio HAL
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);
...
}
Tuner radio
Lorsque vous créez une application 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 touches multimédias. Il est possible de créer plusieurs sources audio pour les mêmes attributs audio et sources. Il est possible d'en avoir un pour l'utilisation régulière de la radio et un second pour les annonces de trafic.
Si vous enregistrez FM_TUNER
, l'autorisation correspondante 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 y accéder.
Pour en savoir plus sur la création d'une application radio, consultez Implémenter la radio.