Conectar um dispositivo de entrada no AAOS

Use estes mecanismos para tocar áudio no Android:

Cada mecanismo permite que a reprodução de áudio seja realizada no Android. Para rádio reprodução ou reprodução a partir de dispositivos de entrada, essas opções podem não ser suficientes, embora cada um possa ser acoplado à captura de áudio ou MediaRecorder para capturar o áudio e depois reproduzi-lo no Android. Para o sistema aplicativos em particular, as informações a seguir podem ser usadas para conectar uma entrada para um mixer de saída no AAOS.

Player HwAudioSource

O HwAudioSource conecta o dispositivo de fonte de áudio diretamente a um mixer do Android.

Motivações

Várias limitações podem surgir ao usar um áudio entre dispositivos ou de hardware com o Android. Cada opção não pode receber eventos principais de mídia, como PLAY, PAUSE e STOP, além de porque eles burlam o áudio do Android cada uma delas exige que os hardwares misturem o patch em outros áudios do Android.

Usar HwAudioSource

HwAudioSource é um novo tipo de player projetado como um patch de software. Isso permite que os apps que usam esse player recebam eventos de tecla de mídia e a saída para que o stream seja misto e roteado pelo Android.

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

Mudanças na HAL de áudio

Com esse novo player, considere essas expectativas para a HAL de áudio. Para exemplo: device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch espera que a solicitação estabeleça um patch de áudio de um dispositivo para um mixer.

  • adev_open_input_stream espera que o audio_source seja AUDIO_SOURCE_FM_TUNER

  • in_read preenche o buffer de áudio com dados de áudio de rádio de transmissão.

Recomendamos que você configure um sintonizador com o tipo AUDIO_DEVICE_IN_FM_TUNER em 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>

Com esta configuração do dispositivo, é mais fácil encontrar a entrada de rádio FM dispositivo usando AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS conjunção com AudioDeviceInfo.TYPE_FM_TUNER.

Criar patches de áudio

Você pode criar um patch de áudio entre duas portas de áudio, uma porta de mix ou uma na porta do dispositivo. Normalmente, um patch de áudio da porta de mix para a porta do dispositivo é para a reprodução do vídeo enquanto o sentido inverso é para a captura.

Por exemplo, um patch de áudio que encaminha amostras de áudio da origem FM_TUNER diretamente no coletor de mídia ignora o mixer de software. Em seguida, use um mixer de hardware para misturar as amostras de áudio do Android e FM_TUNER da afundam. Ao criar um patch de áudio diretamente da origem FM_TUNER para a mídia coletor:

  • O controle de volume se aplica ao coletor de mídia e afeta o ciclo de vida e FM_TUNER de áudio.

  • Os usuários podem alternar entre o áudio do Android e do FM_TUNER em um app simples (nenhuma escolha explícita da fonte de mídia é necessária).

Implementações automotivas também podem precisar criar um patch de áudio entre dois portas do dispositivo. Para isso, declare as portas do dispositivo primeiro e as possíveis rotas no audio_policy_configuration.xml e associar mixports à portas do dispositivo.

Exemplo de configuração

Confira este exemplo de configuração, 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

Use getExternalSources() para recuperar uma lista de fontes disponíveis. (identificadas pelo endereço), depois criar patches de áudio entre essas fontes e as do coletor por uso de áudio. Os pontos de entrada correspondentes na HAL de áudio aparecem em 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 rádio

Ao criar um app de rádio, recomendamos que você use o HwAudioSource lida com a criação do patch e com uma sessão de mídia para lidar com a chave de mídia eventos. Várias fontes de áudio podem ser criadas para a mesma fonte e o mesmo áudio atributos. É possível ter um para uso regular de rádio, bem como um e o segundo para avisos de trânsito.

Se estiver gravando a FM_TUNER, no Android 11 a permissão para fazer foi alterada para android.permission.CAPTURE_AUDIO_OUTPUT. Ela não passa mais pela verificação de permissão OP_RECORD_AUDIO, que se aplica apenas aos microfones. Isso não deve afetar os apps porque FM_TUNER já O acesso requer a permissão SYSTEM_API.

Consulte Implementar rádio para conferir detalhes sobre criando um app de rádio.