Vous pouvez utiliser les mécanismes suivants pour lire du contenu audio dans Android:
Chaque mécanisme permet d'effectuer la lecture audio dans Android. Radio
à partir de périphériques d'entrée, ces options peuvent ne pas suffire,
bien que chacun puisse être associé à une capture audio
MediaRecorder
pour enregistrer l'audio, puis le lire à partir d'Android. Système
en particulier, les informations suivantes peuvent servir à connecter une entrée
sur un mélangeur de
sortie dans AAOS.
Lecteur HwAudioSource
HwAudioSource
connecte directement l'appareil source audio à un mélangeur Android.
Motivations
Plusieurs limites peuvent survenir lors de l'utilisation de données audio d'appareil à appareil ou matérielles avec Android. Chaque option ne permet pas de recevoir des événements de touches multimédias tels que PLAY, PAUSE et STOP, et, parce qu'ils contournent le son d'Android chacun nécessite du matériel pour mélanger le correctif à d'autres contenus audio d'Android.
Utiliser HwAudioSource
HwAudioSource
est un nouveau type de lecteur conçu comme un correctif logiciel. Ce
permet aux applis qui utilisent ce lecteur de recevoir les événements de touches multimédias et la sortie
pour qu'il soit mixte et acheminé 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 couche d'abstraction du contenu audio (HAL)
Avec ce nouveau lecteur, tenez compte de ces attentes pour le HAL audio. Pour
Exemple : device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
s'attend à ce que la requête établit un correctif audio d’un appareil à un mélangeur.adev_open_input_stream
s'attend à ce queaudio_source
soitAUDIO_SOURCE_FM_TUNER
in_read
remplit la mémoire tampon audio avec les données audio de la radiodiffusion.
Nous vous recommandons de configurer un 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 d'appareil, vous pouvez trouver plus facilement l'entrée de radio FM
appareil à l'aide du AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
dans
conjointement avec AudioDeviceInfo.TYPE_FM_TUNER
.
Créer des correctifs audio
Vous pouvez créer un correctif audio entre deux ports audio : un port de mix port de l'appareil. En règle générale, un correctif audio du port de mix vers le port de l'appareil est destiné dans le sens inverse pour la capture.
Par exemple, un correctif audio qui achemine les échantillons audio depuis la source FM_TUNER
directement au récepteur multimédia contourne
le mélangeur logiciel. Vous devez ensuite utiliser un
mélangeur matériel permettant de mélanger les échantillons audio d'Android et de FM_TUNER
pour le
sur un récepteur Google Cloud. Lors de la création d'un correctif audio directement depuis la source FM_TUNER
vers le contenu multimédia
récepteur:
Le contrôle du volume s'applique au récepteur multimédia et doit affecter à la fois l'appareil Android et
FM_TUNER
audio.Les utilisateurs peuvent basculer entre l'audio Android et l'audio
FM_TUNER
via une application simple switch (pas de choix explicite de la source multimédia n'est nécessaire).
Les implémentations automobiles peuvent également avoir besoin de créer un correctif audio entre deux
ports de l'appareil. Pour ce faire, vous devez d'abord déclarer les ports de l'appareil et les valeurs
routes dans audio_policy_configuration.xml
, puis associer des ports mixports au
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 Audio Driver
Vous pouvez utiliser getExternalSources()
pour récupérer la liste des sources disponibles
(identifiées par l'adresse), puis créez des correctifs audio entre ces sources et les
par usages audio. Les points d'entrée correspondants du 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);
...
}
Tuner 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 clés multimédias.
événements. Vous pouvez créer plusieurs sources audio pour la même source et le même contenu audio
. Il est possible d'en avoir un pour une
utilisation normale de la radio ainsi qu'un
le deuxième pour les annonces sur le trafic.
Si vous enregistrez le FM_TUNER
, dans Android 11,
autorisation de faire a été remplacée par android.permission.CAPTURE_AUDIO_OUTPUT
.
Il ne passe plus par la vérification des autorisations OP_RECORD_AUDIO
, qui s'applique
aux micros uniquement. Cela ne devrait pas avoir d'incidence sur les applis, car FM_TUNER
L'accès nécessite l'autorisation SYSTEM_API
.
Consultez la section Implémenter la radio pour en savoir plus sur créer une application radio.