Vous pouvez utiliser les mécanismes suivants pour lire de l'audio dans Android :
Chaque mécanisme permet de lire de l'audio dans Android. Pour la lecture de la radio
ou la lecture à partir de périphériques d'entrée, ces options peuvent ne pas suffire.
Toutefois, chacune d'elles peut être associée à la capture audio ou à la
MediaRecorder
classe 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 directement le périphérique source audio à un mixeur Android.
Motivations
Plusieurs limites peuvent survenir lors de l'utilisation d'un patch audio matériel ou d'un appareil à appareil avec Android. Chaque option ne peut pas recevoir d'événements de touche multimédia tels que PLAY (LECTURE), PAUSE et STOP (ARRÊT). De plus, comme elles contournent la pile audio d'Android , chacune nécessite du matériel pour mixer le patch dans d'autres contenus audio d'Android.
Utiliser HwAudioSource
HwAudioSource est un nouveau type de lecteur conçu comme un patch 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 à la HAL audio
Avec ce nouveau lecteur, tenez compte des attentes suivantes pour la HAL audio. Par exemple, device/generic/car/emulator/audio/driver/audio_hw.c.
adev_create_audio_patchs'attend à ce que la requête établisse un patch audio d'un appareil à un mixeur.adev_open_input_streams'attend à ce queaudio_sourcesoitAUDIO_SOURCE_FM_TUNER.in_readremplit le tampon audio avec des données audio de la radio.
Nous vous recommandons de configurer un appareil de syntoniseur 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 d'appareil, vous pouvez faciliter la recherche du périphérique d'entrée radio FM en utilisant AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS en association 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 d'un port de mixage à un port d'appareil est destiné à la lecture, tandis que le sens inverse est destiné à la capture.
Par exemple, un patch audio qui achemine des é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 patch audio directement 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_TUNERen changeant simplement d'application (aucun choix explicite de source multimédia n'est nécessaire).
Les implémentations automobiles peuvent également avoir besoin de créer un patch audio entre deux ports d'appareil. Pour ce faire, vous devez d'abord déclarer les ports d'appareil et les routes possibles dans audio_policy_configuration.xml, puis associer les ports de mixage aux ports d'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 de pilote audio
Vous pouvez utiliser getExternalSources() pour récupérer une liste des sources disponibles (identifiées par adresse), puis créer des patchs audio entre ces sources et les ports de récepteur par utilisations audio. Les points d'entrée correspondants sur la HAL audio s'affichent 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 radio, nous vous recommandons d'utiliser HwAudioSource, car il gère à la fois la création du patch et une session multimédia pour gérer les événements de touche multimédia. Plusieurs sources audio peuvent être créées pour la même source et les mêmes attributs audio. Il est possible d'en avoir une pour une utilisation radio normale et une seconde pour les annonces de trafic.
Si vous enregistrez le FM_TUNER, dans Android 11, l'autorisation a été remplacée par android.permission.CAPTURE_AUDIO_OUTPUT.
Elle ne passe plus par la vérification de l'autorisation OP_RECORD_AUDIO, qui ne s'applique qu'aux microphones. 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.