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

Vous pouvez utiliser ces mécanismes pour lire de l'audio sous Android :

Chaque mécanisme permet d'effectuer la lecture audio sous Android. Pour la lecture radio ou la lecture à partir de périphériques d'entrée, ces options peuvent ne pas suffire, bien que chacune puisse être couplée à la capture audio ou à la classe MediaRecorder pour capturer d'abord l'audio, puis le lire depuis 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 mélangeur de sortie dans AAOS.

Lecteur HwAudioSource

HwAudioSource connecte le périphérique source audio directement à un mixeur Android.

Motivations

Plusieurs limitations peuvent survenir lors de l'utilisation d'un correctif audio d'appareil à appareil ou matériel avec Android. Chaque option est incapable de recevoir des événements clés multimédias tels que PLAY , PAUSE et STOP et, parce qu'elles contournent la pile audio d'Android, chacune nécessite du matériel pour mélanger le patch avec d'autres fichiers 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 clés multimédia et le flux de sortie doit être mixé 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 au HAL audio

Avec ce nouveau lecteur, considérez ces attentes pour le HAL audio. Par exemple, device/generic/car/emulator/audio/driver/audio_hw.c .

  • adev_create_audio_patch attend que la requête établisse un patch audio d'un périphérique vers un mixeur.

  • adev_open_input_stream s'attend à ce que la audio_source soit AUDIO_SOURCE_FM_TUNER .

  • in_read remplit le tampon audio avec des données audio radio diffusées.

Nous vous recommandons de configurer un périphérique 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 périphérique, vous pouvez faciliter la recherche du périphérique d'entrée 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, soit un port de mixage, soit un port de périphérique. En règle générale, un patch audio du port de mixage au port de périphérique est destiné à la lecture tandis que le sens inverse est destiné à la capture.

Par exemple, un patch audio qui achemine les échantillons audio de la source FM_TUNER directement vers le récepteur multimédia contourne le mélangeur logiciel. Vous devez ensuite utiliser un mixeur matériel pour mélanger les échantillons audio d'Android et FM_TUNER pour le récepteur. Lors de la création d'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 devrait affecter à la fois l'audio Android et FM_TUNER .

  • Les utilisateurs peuvent basculer entre l'audio Android et FM_TUNER via un simple commutateur d'application (aucun choix explicite de source multimédia n'est nécessaire).

Les implémentations automobiles peuvent également devoir créer un patch audio entre deux ports de périphérique. Pour ce faire, vous devez d'abord déclarer les ports de périphérique et les routes possibles dans audio_policy_configuration.xml , puis associer les mixports aux ports de périphérique.

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 patchs audio entre ces sources et les ports récepteurs par utilisations audio. Les points d'entrée correspondants sur l'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

Lors de la création d'une application radio, nous vous recommandons d'utiliser HwAudioSource car il gère à la fois la création du correctif ainsi qu'une session multimédia pour gérer les événements clés 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 un pour un usage radio régulier ainsi qu'un deuxième pour les annonces routières.

Si vous enregistrez le FM_TUNER , dans Android 11, l'autorisation de le faire a été modifiée en android.permission.CAPTURE_AUDIO_OUTPUT . Il ne passe plus par la vérification des autorisations OP_RECORD_AUDIO , qui s'applique uniquement aux microphones. Cela ne devrait pas avoir d'impact sur les applications puisque FM_TUNER nécessite déjà l'autorisation SYSTEM_API pour y accéder.

Consultez Implémenter la radio pour plus de détails sur la création d’une application radio.