Limite di tipo di dispositivo

Nell'audio Android, audio_devices_t viene utilizzato per rappresentare il tipo di dispositivo audio. È ampiamente utilizzato nel codice sorgente audio come campo di bit per filtrare o selezionare uno o più dispositivi specificati. Prima di Android 11, era previsto un limite di 30 tipi di dispositivi di input/output audio e non erano disponibili slot di riserva per aggiungere nuovi tipi di dispositivi audio. Abbiamo rimosso il limite sul numero di tipi di dispositivi audio per consentire l'aggiunta di nuovi tipi di dispositivi audio.

Per rimuovere il limite al numero di tipi di dispositivi audio, ora i tipi di dispositivi audio sono valori enumerati anziché maschere di bit.

Tutti i tipi di dispositivi audio esistenti vengono mantenuti invariati. AUDIO_DEVICE_BIT_IN viene ancora utilizzato per distinguere i dispositivi di input o di output. Quando aggiungi nuovi tipi di dispositivi audio, vengono enumerati i valori negli spazi tra i valori esistenti.

Gli OEM non devono utilizzare audio_devices_t come maschera di bit, perché ciò può causare risultati imprevisti quando vengono aggiunti nuovi tipi di dispositivi audio enumerati.

Esempi e origine

Prima di Android 11, erano previsti due utilizzi tipici dei tipi di dispositivi audio come maschere di bit.

  • Utilizzo del valore audio_devices_t per rappresentare più dispositivi audio.
  • Controlla se il valore audio_devices_t contiene tipi di dispositivi audio di una categoria specificata.

Per rappresentare più tipi di dispositivi audio, viene utilizzata una classe denominata DeviceTypeSet in /libaudiofoundation/include/media/AudioContainers.h, che è un contenitore std::set di audio_devices_t. La classe viene dichiarata nella libreria libaudiofoundation disponibile per il fornitore. Per rappresentare più tipi di dispositivi audio nel codice C, puoi utilizzare un array o un elenco di audio_devices_t.

Per verificare se un singolo tipo di dispositivo appartiene a una categoria specificata, utilizza le funzioni di assistenzaaudio_is_.*_device in /system/media/audio/include/system/audio.h. Per il caso di più tipi di dispositivi audio, utilizza le funzioni di supporto in libaudiofoundation. Ad esempio, utilizza areAllOfSameDeviceType (DeviceTypeSet, std::function) in AudioContainers.h per verificare se tutti i tipi di dispositivi audio specificati sono dello stesso tipo.

Implementazione

Gli OEM devono rimuovere la rappresentazione del campo di bit del tipo di dispositivo audio dall'implementazione dell'HAL audio.

  1. Rimuovi tutto lo spazio di archiviazione dei dispositivi in un campo di bit.

    audio_devices_t non deve essere utilizzato per rappresentare più tipi di dispositivi audio. Utilizza invece un elenco o un vettore.

  2. Interrompi l'utilizzo delle operazioni sui bit per i confronti dei tipi di dispositivi.

    Prima di Android 11, i tipi di dispositivi audio possono essere utilizzati come bitfield. In questo caso, è comune utilizzare operazioni sui bit per i confronti tra i tipi di dispositivi. Quando vengono aggiunti nuovi tipi di dispositivi audio enumerati, le operazioni sui bit possono causare risultati inaspettati. Utilizza invece le funzioni di supporto. Se esiste un solo tipo di dispositivo audio, utilizza il confronto diretto per confrontare i due valori. Per verificare se un tipo di dispositivo audio appartiene a una categoria specificata, utilizza le funzioni di supporto in /system/media/audio/include/system/audio.h. Ad esempio, audio_is_output_device(audio_devices_t device).

  3. Interrompi l'utilizzo di valori predefiniti per gruppi di tipi di dispositivi audio.

    Esistono alcuni valori predefiniti per gruppi di tipi di dispositivi audio, AUDIO_DEVICE_OUT_ALL, in system/media/audio/include/system/audio-base-utils.h. Tutti questi valori sono riservati, ma potrebbero essere ritirati in quanto non saranno corretti quando verranno aggiunti nuovi tipi di dispositivi audio enumerati. In audio-base-utils.h sono definiti nuovi gruppi di tipi di dispositivi audio, ovvero array di tipi di dispositivi audio, come AUDIO_DEVICE_OUT_ALL_ARRAY.

  4. Implementa i metodi create_audio_patch() e release_audio_patch() per i percorsi anziché set_parameters.

    Il metodo set_parameters utilizza i tipi di dispositivi audio come un campo di bit, pertanto possono verificarsi risultati inaspettati se vengono aggiunti nuovi tipi di dispositivi audio enumerati.

    Attualmente sono necessari due tipi di patch audio:

    • Esegui il mixaggio con i patch del dispositivo per la riproduzione
    • Dispositivo per mixare i patch, per la registrazione

    Negli aggiornamenti successivi potrebbero essere necessarie patch aggiuntive per il trasferimento da dispositivo a dispositivo.

    Quando crei una patch audio, se l'handle della patch non è specificato, l'HAL audio è tenuto a generare un handle della patch univoco che possa identificare la patch audio. In caso contrario, l'HAL audio deve utilizzare l'handle della patch audio specificato per aggiornare la patch audio.

    Se utilizzi un HAL audio precedente e il wrapper HIDL AOSP, l'HAL audio precedente deve impostare la versione principale dell'HAL su 3.0.

    Per attivare la funzionalità di patch audio, l'HAL audio deve impostare la versione principale dell'HAL su 3.0 o versioni successive. Per ulteriori informazioni, consulta Device::supportsAudioPatches() nell' implementazione HIDL predefinita e nell'HAL audio per Cuttlefish.

Personalizzazione

Non è possibile disattivare la funzionalità o ripristinare il refactoring dei dispositivi audio nel framework che consente di aggiungere tipi di dispositivi audio.

Tutti i tipi di dispositivi audio aggiunti consentono di rappresentare un tipo di dispositivo con un singolo bit impostato, quindi le implementazioni HAL attuali continuano a funzionare.

Se vengono aggiunti nuovi tipi di dispositivi audio e gli OEM vogliono utilizzarli, devono eseguire l'upgrade dell'implementazione dell'HAL audio e passare alla versione HIDL 6.0 o successiva. È obbligatorio eseguire l'upgrade della versione principale HAL alla 3.0 e implementare i metodi create_audio_patch e release_audio_patch, perché l'utilizzo di set_parameters per instradare lo stream può causare risultati inaspettati quando vengono aggiunti nuovi tipi di dispositivi audio.

Convalida

L'attività richiesta agli OEM è aggiornare le implementazioni HAL. I VTS per la scheda audio HAL possono essere utilizzati per verificare se l'implementazione funziona come previsto. Tutti i test sono disponibili nei file VTS.