Collega un dispositivo di input nell'AAOS

Puoi utilizzare i seguenti meccanismi per riprodurre audio su Android:

Ogni meccanismo consente di riprodurre audio su Android. Per radio la riproduzione o la riproduzione da dispositivi di input, queste opzioni potrebbero non essere sufficienti, sebbene ciascuna possa essere abbinata all'acquisizione audio o MediaRecorder per acquisire l'audio e poi riprodurlo da Android. Per sistema app in particolare, le seguenti informazioni possono essere usate per collegare dispositivo a un mixer di output in AAOS.

Lettore HwAudioSource

HwAudioSource connette il dispositivo di origine audio direttamente a un mixer Android.

Motivazioni

Quando si utilizza un audio da dispositivo a dispositivo o hardware, potrebbero sorgere diverse limitazioni patch con Android. Ogni opzione non è in grado di ricevere eventi chiave multimediali come RIPRODUCI, METTI IN PAUSA, INTERROMPI e perché aggirano l'audio di Android ognuno dei quali richiede hardware per mixare la patch in altri contenuti audio Android.

Utilizza HwAudioSource

HwAudioSource è un nuovo tipo di player progettato come patch software. Questo consente alle app che usano questo player di ricevere eventi chiave multimediali e output mixato e indirizzato da Android.

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

Modifiche all'HAL audio

Con questo nuovo player, tieni conto di queste aspettative per l'HAL audio. Per ad esempio device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch si aspetta che la richiesta stabilisca una patch audio da un dispositivo a un mixer.

  • adev_open_input_stream prevede che audio_source AUDIO_SOURCE_FM_TUNER.

  • in_read riempie il buffer audio con dati audio radio broadcast.

Ti consigliamo di configurare un sintonizzatore di tipo AUDIO_DEVICE_IN_FM_TUNER tra 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 questa configurazione del dispositivo, puoi trovare più facilmente l'ingresso della radio FM dispositivo tramite l'AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS in combinazione con AudioDeviceInfo.TYPE_FM_TUNER.

Creare patch audio

Puoi creare un patch audio tra due porte audio: una porta mix dalla porta del dispositivo. Di solito, una patch audio dalla porta mix alla porta del dispositivo mentre la direzione inversa è per l'acquisizione.

Ad esempio, una patch audio che instrada campioni audio dalla sorgente FM_TUNER direttamente nel media sink bypassa il software mixer. Devi quindi utilizzare mixer hardware per mixare i campioni audio di Android e FM_TUNER per un lavandino. Quando crei una patch audio direttamente dalla sorgente FM_TUNER al contenuto multimediale sink:

  • Il controllo del volume si applica al sink dei contenuti multimediali e dovrebbe interessare sia Android e audio FM_TUNER.

  • Gli utenti possono passare dall'audio Android a FM_TUNER e viceversa tramite un'app semplice (non è necessaria una scelta esplicita relativa alla fonte multimediale).

Le implementazioni automobilistiche potrebbero anche dover creare una patch audio tra porte del dispositivo. Per farlo, devi prima dichiarare le porte del dispositivo e in audio_policy_configuration.xml, quindi associa i mixport al porte del dispositivo.

Configurazione di esempio

Guarda questa configurazione di esempio, 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

Puoi utilizzare getExternalSources() per recuperare un elenco di fonti disponibili (identificati tramite l'indirizzo), quindi crea patch audio tra queste sorgenti e e il sink delle porte in base agli utilizzi audio. I punti di ingresso corrispondenti sull'Audio HAL compaiono in 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);
...
}

Sintonizzatore radio

Quando crei un'app per la radio, ti consigliamo di usare HwAudioSource così come appare gestisce sia la creazione della patch che una sessione multimediale per gestire le chiavi multimediali eventi. È possibile creare più sorgenti audio per la stessa sorgente e lo stesso audio attributi. È possibile averne uno per il normale utilizzo della radio la seconda per gli annunci sul traffico.

Se registri il dispositivo FM_TUNER, in Android 11 autorizzazione per le attività è stata modificata in android.permission.CAPTURE_AUDIO_OUTPUT. Non viene più sottoposto al controllo delle autorizzazioni OP_RECORD_AUDIO, che si applica solo ai microfoni. Questo non dovrebbe influire sulle app perché sono già FM_TUNER richiede l'autorizzazione SYSTEM_API per l'accesso.

Vedi Implementare la radio per maggiori dettagli su creando un'app per la radio.