Cómo conectar un dispositivo de entrada en AAOS

Puedes usar estos mecanismos para reproducir audio en Android:

Cada mecanismo permite reproducir audio en Android. Para radio reproducción desde dispositivos de entrada, es posible que estas opciones no sean suficientes, aunque cada uno podría combinarse con captura de audio MediaRecorder para capturar el audio y, luego, reproducirlo desde Android. Para sistema en particular, la siguiente información se puede usar para conectar una entrada a un mezclador de salida en AAOS.

Reproductor HwAudioSource

HwAudioSource conecta el dispositivo de origen de audio directamente a un mezclador de Android.

Motivaciones

Pueden surgir varias limitaciones cuando se usa un audio de dispositivo a dispositivo o de hardware parche con Android. Cada opción no puede recibir eventos clave multimedia, como REPRODUCIR, PAUSAR y DETENER, y porque eluden el audio de Android cada una requiere hardware para mezclar el parche con otro audio de Android.

Cómo usar HwAudioSource

HwAudioSource es un nuevo tipo de reproductor diseñado como un parche de software. Esta permite que las apps que usan este reproductor reciban eventos clave multimedia y el resultado de transmisión para que Android mezcle y enrute.

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

Cambios en la HAL de audio

Con este nuevo reproductor, ten en cuenta estas expectativas para la HAL de audio. Para por ejemplo, device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch espera que la solicitud establezca un parche de audio de un dispositivo a un mezclador.

  • adev_open_input_stream espera que el audio_source sea AUDIO_SOURCE_FM_TUNER

  • in_read llena el búfer de audio con datos de audio de radio de transmisión.

Te recomendamos configurar un dispositivo sintonizador con el tipo AUDIO_DEVICE_IN_FM_TUNER en 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>

Con esta configuración del dispositivo, puedes facilitar la búsqueda de la entrada de radio FM mediante el AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS en conjunción con AudioDeviceInfo.TYPE_FM_TUNER.

Cómo crear parches de audio

Puedes crear un parche de audio entre dos puertos de audio, uno de combinación o uno puerto del dispositivo. Por lo general, un parche de audio de puerto de combinación a puerto de dispositivo es para la reproducción mientras que la dirección inversa es para la captura.

Por ejemplo, un parche de audio que enruta muestras de audio desde la fuente FM_TUNER directamente al receptor evita el mezclador de software. Luego, debes usar un mezclador de hardware para mezclar las muestras de audio de Android y FM_TUNER para la receptor. Cuando se crea un parche de audio directamente desde la fuente FM_TUNER al contenido multimedia receptor:

  • El control de volumen se aplica al receptor de contenido multimedia y FM_TUNER.

  • Los usuarios pueden cambiar entre audio de Android y FM_TUNER con una simple app. interruptor (no es necesario elegir una fuente de medios explícita).

Es posible que las implementaciones de Automotive también deban crear un parche de audio entre dos puertos del dispositivo. Para ello, primero debes declarar los puertos del dispositivo y los posibles rutas en audio_policy_configuration.xml y, luego, asociar los mixports con el puertos del dispositivo.

Configuración de ejemplo

Observa esta configuración de muestra 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 controlador de audio

Puedes usar getExternalSources() para recuperar una lista de fuentes disponibles. (identificada por la dirección), crea parches de audio entre estas fuentes y las puertos receptores por usos de audio. Los puntos de entrada correspondientes en la HAL de audio aparecen en 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);
...
}

Sintonizador de radio

Cuando compiles una app de radio, te recomendamos que uses HwAudioSource, ya que Controla la creación del parche y una sesión multimedia para controlar las claves multimedia. eventos. Se pueden crear varias fuentes de audio para la misma fuente y para el mismo audio atributos. Se puede utilizar para un uso normal de la radio, además de la segunda para los anuncios de tráfico.

Si se graba el FM_TUNER, en Android 11, la El permiso para realizar se cambió a android.permission.CAPTURE_AUDIO_OUTPUT. Ya no pasa por la verificación de permisos OP_RECORD_AUDIO, que aplica solo a los micrófonos. Esto no debería afectar a las apps, dado que FM_TUNER ya requiere el permiso SYSTEM_API para acceder.

Consulta Cómo implementar la radio para obtener detalles sobre compilando una app de radio.