Connecter un périphérique d'entrée dans AAOS

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 que audio_source soit AUDIO_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.