Effetti audio

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 importante miglioramento è 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 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 vocale sul sintonizzatore FM quando il dispositivo è collegato direttamente all'altoparlante tramite il DSP audio.

Prerequisiti

  • Come per qualsiasi altro effetto audio, questo deve essere implementato da una libreria del fornitore ed essere elencato nel file di configurazione audio_effects.xml.
  • L'effetto deve essere di tipo preelaborazione o post-elaborazione (flag TYPE_PRE_PROC o TYPE_POST_PROC impostato in EffectDescriptor.flags).
  • Se l'effetto di implementazione è accelerato HW (segnalazione HW_ACC_TUNNEL impostata in EffectDescriptor.flags), può essere collegato a un percorso audio interamente collegato sotto l'HAL (nessuna riproduzione o acquisire lo stream audio 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 collegato sistematicamente e abilitato per qualsiasi percorso audio selezionando un dispositivo specificato come sink o origine.

Per farlo, devi aggiungere una sezione specifica nella 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 classe android.media.audiofx.AudioEffect per creare e attivare un effetto del 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, può essere abilitato o disabilitato 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 6.0 ha una nuova firma per il metodo createEffect() che consente di creare un effetto associato a un dispositivo:

IEffectFactory::createEffect(Uuid uid, AudioSession session,
AudioIoHandle ioHandle, AudioPortHandle device)
  • Il valore AudioSession specificato deve essere AudioSessionConsts.DEVICE.
  • AudioIoHandle viene ignorato se session è AudioSessionConsts.DEVICE.
  • Il device è identificato dal suo AudioPortHandle univoco assegnato dal framework audio quando il dispositivo viene selezionato nell'HAL audio con il metodo IDevice::createAudioPatch().

HAL audio

Per supportare la funzionalità degli effetti del dispositivo, l'HAL audio deve implementare il routing audio usando l'API IDevice::createAudioPatch(). Ciò è indicato Metodo IDevice::supportsAudioPatches() di reporting true.

Due nuovi metodi dell'API: IDevice::addDeviceEffect(AudioPortHandle device, uint64_t effectId) e IDevice::removeDeviceEffect(AudioPortHandle device, uint64_t effectId) indicano all'implementazione HAL che un effetto dispositivo è stato attivato o disattivato su un determinato dispositivo.

Il dispositivo è identificato dal suo ID AudioPortHandle, che viene utilizzato quando un audio con il metodo IDevice::createAudioPatch().

Le API Audio HAL possono essere utilizzate da un'implementazione se è necessario un coordinamento tra audio ed effetti HAL quando un effetto è attivato o disattivato.