Conecte um dispositivo de entrada em AAOS

Você pode usar estes mecanismos para reproduzir áudio no Android:

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

Reprodutor HwAudioSource

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

Motivações

Várias limitações podem surgir ao usar um patch de áudio de dispositivo para dispositivo ou de hardware com Android. Cada opção não pode receber eventos importantes de mídia, como PLAY, PAUSE e STOP e, como contornam a pilha de áudio do Android, cada uma exige hardware para mixar o patch em outro áudio do Android.

Usando HwAudioSource

HwAudioSource é um novo tipo de reprodutor projetado como um patch de software. Isso permite que os aplicativos que usam esse player recebam eventos importantes de mídia e o fluxo de saída seja mixado 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 no áudio HAL

Com este novo player, considere estas expectativas para o áudio HAL. Por 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 audio_source seja AUDIO_SOURCE_FM_TUNER .

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

Recomendamos que você configure um dispositivo 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 de dispositivo, você pode facilitar a localização do dispositivo de entrada de rádio FM usando AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS em conjunto com AudioDeviceInfo.TYPE_FM_TUNER .

Crie patches de áudio

Você pode criar um patch de áudio entre duas portas de áudio, uma porta de mixagem ou uma porta de dispositivo. Normalmente, um patch de áudio da porta de mixagem para a porta do dispositivo é para reprodução, enquanto a direção inversa é para captura.

Por exemplo, um patch de áudio que roteia amostras de áudio da fonte FM_TUNER diretamente para o coletor de mídia ignora o mixer de software. Você deve então usar um mixer de hardware para mixar as amostras de áudio do Android e FM_TUNER para o coletor. Ao criar um patch de áudio diretamente da fonte FM_TUNER para o coletor de mídia:

  • O controle de volume se aplica ao coletor de mídia e deve afetar o áudio do Android e FM_TUNER .

  • Os usuários podem alternar entre áudio Android e FM_TUNER por meio de uma simples troca de aplicativo (não é necessária nenhuma escolha explícita de fonte de mídia).

As implementações automotivas também podem precisar criar um patch de áudio entre duas portas de dispositivos. Para fazer isso, você deve primeiro declarar as portas do dispositivo e possíveis rotas em audio_policy_configuration.xml e depois associar mixports às portas do dispositivo.

Configuração de amostra

Consulte este exemplo de configurações, 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 driver de áudio

Você pode usar getExternalSources() para recuperar uma lista de fontes disponíveis (identificadas por endereço) e, em seguida, criar patches de áudio entre essas fontes e as portas sink por usos de áudio. Os pontos de entrada correspondentes no Audio HAL 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 aplicativo de rádio, recomendamos que você use o HwAudioSource , pois ele lida com a criação do patch e também com uma sessão de mídia para lidar com eventos importantes de mídia. Várias fontes de áudio podem ser criadas para a mesma fonte e atributos de áudio. É possível ter um para uso regular do rádio, bem como um segundo para anúncios de trânsito.

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

Consulte Implementando rádio para obter detalhes sobre como criar um aplicativo de rádio.