A partire da Android 11, i produttori di dispositivi hanno la possibilità di collegare e attivare automaticamente effetti audio specifici quando viene selezionato un determinato dispositivo audio per l'acquisizione o la riproduzione audio. Un miglioramento importante è che gli effetti audio inseriti in 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à è destinata principalmente agli OEM del settore automobilistico, ma può essere utilizzata anche in altri fattori di forma Android. Un'app di esempio inserisce un effetto di miglioramento della voce nell'output 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 ed essere elencato nel file di configurazione
audio_effects.xml. - L'effetto deve essere di tipo pre-elaborazione o post-elaborazione (flag
TYPE_PRE_PROCoTYPE_POST_PROCimpostato inEffectDescriptor.flags). - Se l'implementazione dell'effetto è accelerata dall'hardware (flag
HW_ACC_TUNNELimpostato inEffectDescriptor.flags), può essere collegata a un percorso audio interamente connesso sotto l'HAL (nessuno stream audio di riproduzione o acquisizione aperto nell'HAL audio).
Creare e attivare un effetto del dispositivo
Gli effetti audio specifici del dispositivo possono essere creati 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 collegato e attivato sistematicamente a qualsiasi percorso audio che seleziona un dispositivo specificato come sink o origine.
Per farlo, 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>
Utilizzare un'API di sistema
È stato aggiunto un nuovo costruttore @SystemApi alla
android.media.audiofx.AudioEffect classe per creare e attivare un effetto del dispositivo:
AudioEffect(@NonNull UUID uuid, @NonNull AudioDeviceAttributes device);
Dopo aver creato l'effetto specificando l'ID univoco dell'effetto audio e il descrittore del dispositivo audio, può essere attivato o disattivato con le API AudioEffect esistenti.
È disponibile anche un'API per verificare se un'implementazione supporta una determinata combinazione di 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 collegato a un dispositivo:
IEffectFactory::createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle, AudioPortHandle device)
- La
AudioSessionspecificata deve essereAudioSessionConsts.DEVICE. AudioIoHandleviene ignorato sesessionèAudioSessionConsts.DEVICE.- Il
deviceè identificato dal suoAudioPortHandleunivoco assegnato dal framework audio quando il dispositivo viene selezionato nell' HAL audio con il metodoIDevice::createAudioPatch().
HAL audio
Per supportare la funzionalità degli effetti del dispositivo, l'HAL audio deve implementare il controllo del routing audio utilizzando l'API IDevice::createAudioPatch(). Ciò è indicato dal metodo IDevice::supportsAudioPatches() che restituisce true.
Due nuovi metodi API, IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) e IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId), indicano all'implementazione HAL che un effetto del 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 HAL audio possono essere utilizzate da un'implementazione se è necessaria la coordinazione tra gli HAL audio ed effetti quando un effetto viene attivato o disattivato.