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

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