Effetti audio

A partire da Android 11, i produttori di dispositivi hanno la possibilità di allegare e abilitare 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à è destinata principalmente agli OEM automobilistici, ma può essere utilizzata anche in altri fattori di forma Android. Un'app di esempio inserisce un effetto di miglioramento della voce sull'uscita del sintonizzatore FM quando è collegato direttamente all'altoparlante tramite il DSP audio.

Prerequisiti

  • Come per qualsiasi altro effetto audio, l'effetto deve essere implementato da una libreria del fornitore ed elencato nel file di configurazione audio_effects.xml .
  • L'effetto deve essere di tipo preprocessing o postprocessing (flag TYPE_PRE_PROC o TYPE_POST_PROC impostato in EffectDescriptor.flags ).
  • Se l'implementazione dell'effetto è accelerata dall'hardware (flag HW_ACC_TUNNEL impostato in EffectDescriptor.flags ), può essere collegata a un percorso audio interamente connesso sotto l'HAL (nessun flusso audio di riproduzione o acquisizione aperto nell'HAL audio).

Crea e attiva un effetto dispositivo

Gli effetti audio specifici del dispositivo possono essere istanziati utilizzando uno dei due metodi seguenti.

Utilizza un file di configurazione degli effetti audio

Questo metodo consente la creazione statica di un effetto audio che viene sistematicamente collegato e abilitato a qualsiasi percorso audio selezionando un dispositivo specifico come sink o sorgente.

Questo viene fatto aggiungendo 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 che l'effetto è stato creato specificando l'ID effetto audio univoco e il descrittore del dispositivo audio, può essere abilitato o disabilitato con le API AudioEffect esistenti.

È inoltre disponibile un'API per interrogare se un'implementazione supporta una determinata combinazione dispositivo/effetto.

static boolean isEffectSupportedForDevice(
            @NonNull UUID uuid, @NonNull AudioDeviceAttributes device);

Nuove API HAL

Effetto audio HAL

L'effetto audio HAL 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)
  • L' AudioSession specificato deve essere AudioSessionConsts.DEVICE .
  • AudioIoHandle viene ignorato se la session è AudioSessionConsts.DEVICE .
  • Il device viene identificato dal suo AudioPortHandle univoco assegnato dal framework audio quando il dispositivo viene selezionato nell'HAL audio con il metodo IDevice::createAudioPatch() .

AudioHAL

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 riporta 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 abilitato o disabilitato su un determinato dispositivo.

Il dispositivo viene identificato dal relativo 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 è necessario il coordinamento tra gli HAL audio e quelli degli effetti quando un effetto è abilitato o disabilitato.