Collega un dispositivo di input in AAOS

Puoi utilizzare questi meccanismi per riprodurre l'audio in Android:

Ciascun meccanismo consente di eseguire la riproduzione audio in Android. Per la riproduzione radiofonica o la riproduzione da dispositivi di input, queste opzioni potrebbero non essere sufficienti, sebbene ciascuna possa essere abbinata all'acquisizione audio o alla classe MediaRecorder per acquisire prima l'audio e quindi riprodurlo da Android. Per le app di sistema in particolare, le seguenti informazioni possono essere utilizzate per connettere un dispositivo di input a un mixer di output in AAOS.

Lettore HwAudioSource

HwAudioSource collega il dispositivo sorgente audio direttamente a un mixer Android.

Motivazioni

Potrebbero verificarsi diverse limitazioni quando si utilizza una patch audio da dispositivo a dispositivo o hardware con Android. Ciascuna opzione non è in grado di ricevere eventi chiave multimediali come PLAY , PAUSE e STOP e, poiché aggirano lo stack audio di Android, ciascuna richiede hardware per combinare la patch con altro audio da Android.

Utilizza HwAudioSource

HwAudioSource è un nuovo tipo di lettore progettato come patch software. Ciò consente alle app che utilizzano questo lettore per ricevere eventi chiave multimediali e il flusso di output può essere mixato e instradato 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 lettore, considera queste aspettative per l'HAL audio. Ad esempio, device/generic/car/emulator/audio/driver/audio_hw.c .

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

  • adev_open_input_stream si aspetta che audio_source sia AUDIO_SOURCE_FM_TUNER .

  • in_read riempie il buffer audio con i dati audio trasmessi dalla radio.

Ti consigliamo di configurare un dispositivo sintonizzatore con il tipo AUDIO_DEVICE_IN_FM_TUNER in 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 facilitare la ricerca del dispositivo di input della radio FM utilizzando AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS insieme a AudioDeviceInfo.TYPE_FM_TUNER .

Crea patch audio

È possibile creare una patch audio tra due porte audio, una porta mix o una porta dispositivo. In genere, una patch audio dalla porta del mix alla porta del dispositivo serve per la riproduzione mentre la direzione inversa serve per l'acquisizione.

Ad esempio, una patch audio che instrada campioni audio dalla sorgente FM_TUNER direttamente al dissipatore multimediale bypassa il mixer software. È quindi necessario utilizzare un mixer hardware per mixare i campioni audio da Android e FM_TUNER per il sink. Quando si crea una patch audio direttamente dalla sorgente FM_TUNER al sink multimediale:

  • Il controllo del volume si applica al sink multimediale e dovrebbe influire sia sull'audio Android che FM_TUNER .

  • Gli utenti possono passare dall'audio Android a FM_TUNER tramite un semplice cambio di app (non è necessaria la scelta esplicita della fonte multimediale).

Le implementazioni automobilistiche potrebbero anche dover creare una patch audio tra due porte del dispositivo. Per fare ciò, devi prima dichiarare le porte del dispositivo e i possibili percorsi in audio_policy_configuration.xml e quindi associare mixports alle porte del dispositivo.

Configurazione di esempio

Vedi 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 del driver audio

È possibile utilizzare getExternalSources() per recuperare un elenco di fonti disponibili (identificate dall'indirizzo), quindi creare patch audio tra queste fonti e le porte sink in base agli utilizzi audio. I punti di ingresso corrispondenti sull'HAL audio vengono visualizzati 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 radiofonico

Quando crei un'app radio, ti consigliamo di utilizzare HwAudioSource poiché gestisce sia la creazione della patch sia una sessione multimediale per gestire gli eventi chiave multimediale. È possibile creare più sorgenti audio per la stessa sorgente e gli stessi attributi audio. È possibile averne uno per l'utilizzo regolare della radio e un secondo per gli annunci sul traffico.

Se si registra FM_TUNER , in Android 11 l'autorizzazione per l'esecuzione è stata modificata in android.permission.CAPTURE_AUDIO_OUTPUT . Non viene più sottoposto al controllo dei permessi OP_RECORD_AUDIO , che si applica solo ai microfoni. Ciò non dovrebbe avere alcun impatto sulle app poiché FM_TUNER richiede già l'autorizzazione SYSTEM_API per l'accesso.

Vedi Implementare la radio per dettagli sulla creazione di un'app radio.