A partire da Android 11, i produttori di dispositivi hanno la possibilità di collegare e attivare automaticamente effetti audio specifici quando un determinato dispositivo audio viene selezionato per l'acquisizione o la riproduzione audio. Un miglioramento importante è che gli effetti audio inseriti su un percorso audio interamente implementato sotto l'HAL audio (connessione diretta tra un dispositivo di input e un dispositivo di output) possono essere controllati dal framework degli effetti audio.
Questa funzionalità è rivolta principalmente agli OEM nel settore auto e motori, ma può essere utilizzata anche in altri fattori di forma Android. Un'app di esempio è l'inserimento di un effetto di miglioramento della voce sull'uscita del sintonizzatore FM quando è collegato direttamente allo speaker tramite il DSP audio.
Prerequisiti
- Come per qualsiasi altro effetto audio, l'effetto deve essere implementato da una libreria del fornitore e elencato nel file di configurazione
audio_effects.xml
. - L'effetto deve essere di tipo preelaborazione o post-elaborazione
(flag
TYPE_PRE_PROC
oTYPE_POST_PROC
impostato inEffectDescriptor.flags
). - Se l'implementazione dell'effetto è accelerata hardware (flag
HW_ACC_TUNNEL
impostato inEffectDescriptor.flags
), può essere collegata a un percorso audio interamente collegato sotto l'HAL (nessun stream audio di riproduzione o acquisizione aperto nell'HAL audio).
Creare e attivare un effetto dispositivo
Gli effetti audio specifici del dispositivo possono essere istanziati utilizzando uno dei due metodi riportati di seguito.
Utilizzare un file di configurazione degli effetti audio
Questo metodo consente la creazione statica di un effetto audio che viene sistematicamente collegato e attivato a qualsiasi percorso audio selezionando un dispositivo specificato come destinazione o sorgente.
A tale scopo, aggiungi una sezione specifica nel file audio_effects.xml
come segue:
<deviceEffects> <devicePort type="AUDIO_DEVICE_IN_BUILTIN_MIC" address="bottom"> <apply effect="agc"/> </devicePort> </deviceEffects>
Utilizza un'API di sistema
Un nuovo costruttore @SystemApi è stato aggiunto alla classe
android.media.audiofx.AudioEffect
per creare e abilitare un effetto dispositivo:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Dopo aver creato l'effetto specificando l'ID effetto audio univoco e il descrittore del dispositivo audio, puoi attivarlo o disattivarlo con le API AudioEffect esistenti.
È disponibile anche un'API per le query se un'implementazione supporta una determinata combinazione dispositivo/effetto.
static boolean isEffectSupportedForDevice( @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Nuove API HAL
HAL degli effetti audio
L'HAL degli effetti audio V6.0 ha una nuova firma per il metodo createEffect()
che consente la creazione di un effetto associato a un dispositivo:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- Il valore
AudioSession
specificato deve essereAudioSessionConsts.DEVICE
. AudioIoHandle
viene ignorato sesession
èAudioSessionConsts.DEVICE
.- Il
device
viene identificato dal suoAudioPortHandle
univoco assegnato dal framework audio quando il dispositivo viene selezionato all'HAL audio con il metodoIDevice::createAudioPatch()
.
HAL audio
Per supportare la funzionalità di effetti del dispositivo, l'HAL audio deve implementare il controllo del routing audio utilizzando l'API IDevice::createAudioPatch()
. Ciò è indicato dal
IDevice::supportsAudioPatches()
report del metodo true
.
Due nuovi metodi API: IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId)
e IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId)
indicano all'implementazione dell'HAL che un effetto dispositivo è stato attivato o disattivato su un determinato dispositivo.
Il dispositivo è identificato dal suo ID AudioPortHandle
, che viene utilizzato quando viene creata una patch
audio con il metodo IDevice::createAudioPatch()
.
Le API Audio HAL possono essere utilizzate da un'implementazione se è necessario un coordinamento tra gli HAL per gli effetti e l'audio quando un effetto è abilitato o disabilitato.