Routing combinato dei dispositivi audio

La funzionalità di routing combinato dei dispositivi audio aggiunge il supporto per lo streaming audio a: più dispositivi audio contemporaneamente. Grazie a questa funzione, le app con privilegi possono Selezionare più dispositivi preferiti per una particolare strategia attraverso le API di sistema. Le app possono rilevare ulteriormente le funzionalità dei dispositivi audio con precisione utilizzando le API pubbliche fornite da questa funzionalità. Per Android 11 e versioni precedenti, l'implementazione del framework audio ha supporto limitato di più dispositivi audio dello stesso tipo (ad esempio, 2 cuffie Bluetooth A2DP) collegate contemporaneamente. Il routing audio predefinito inoltre non consentono agli utenti di selezionare più dispositivi dello stesso tipo per un caso d'uso specifico.

A partire da Android 12, queste limitazioni verranno rimosse per consentire nuovi casi d'uso come la trasmissione audio, il multicasting di cuffie BLE audio o di selezione di più schede audio USB contemporaneamente. Il routing a più dispositivi USB contemporaneamente non è supportato.

A partire da Android 14, il framework USB supporta routing a più dispositivi USB a condizione che i dispositivi USB abbiano audio diverso tipi di dispositivi ed è disponibile il supporto di kernel e fornitori per la connessione dispositivi contemporaneamente.

In questa pagina viene spiegato come implementare il supporto dello streaming audio per: più dispositivi audio e come convalidare l'implementazione di questa funzionalità.

Supporto dello streaming audio su più dispositivi audio

In Android 12 esistono due insiemi di API che supportano questa funzionalità:

  • Le API di sistema gestiscono più dispositivi preferiti nell'ambito di una strategia.
  • L'interfaccia HIDL, implementata dal fornitore come parte dell'HAL audio, segnala le funzionalità del dispositivo.

Le sezioni seguenti trattano ciascuna di queste API in modo più dettagliato.

Gestire più dispositivi preferiti nell'ambito di una strategia

Audio Policy Manager offre API di sistema per un migliore supporto dello streaming audio per più dispositivi audio contemporaneamente. Queste API di sistema abilitano l'impostazione, e la rimozione di più dispositivi preferiti per una determinata strategia. Fino ad Android 12, questa funzionalità era supportata su un solo dispositivo.

Gestione norme audio introduce il concetto di dispositivi multimediali attivi per descrivono i dispositivi che con maggiore probabilità verranno scelti per la riproduzione di contenuti multimediali. Quando è collegato un dispositivo rimovibile, l'output audio dell'HAL trasmette in streaming instradato a questo dispositivo potrebbe essere necessario aprire e verificare gli attributi supportati.

È necessario specificare un dispositivo audio all'apertura di uno stream di output. Lo stato attivo Il dispositivo multimediale è il dispositivo utilizzato quando gli stream di output vengono aperti in questo contesto.

La selezione dei dispositivi multimediali attivi può variare a seconda dei dispositivi effettivi connesso o disconnesso. Gestione norme audio utilizza le seguenti serie di regole per scegliere i dispositivi multimediali attivi:

  1. Se sono disponibili tutti i dispositivi preferiti per i contenuti multimediali, vengono scelti tutti come dispositivi attivi.
  2. In caso contrario, viene scelto l'ultimo dispositivo rimovibile connesso.
  3. Se non sono connessi dispositivi rimovibili, vengono applicate le regole dei criteri audio predefinite per scegliere i dispositivi di output vengono applicati per scegliere i dispositivi attivi.

Per poter essere riaperto e instradato, un flusso di output deve soddisfare i seguenti criteri ai dispositivi attivi in modo da scegliere la configurazione migliore per la riproduzione:

  • Lo stream di output deve supportare i dispositivi attivi.
  • Il flusso di output deve supportare i profili dinamici.
  • Lo stream di output non deve essere attualmente indirizzato a dispositivi attivi.

Per applicare la selezione di un nuovo dispositivo, Gestione norme audio si chiude e riapre uno stream di output alla connessione del dispositivo se lo stream di output è inattivo oppure lo rimanda quando il flusso di output viene messo in standby.

Gestione norme audio offre il seguente elenco di API di sistema(come definito nella AudioManager.java):

  • setPreferredDeviceForStrategy

    Consente di impostare il dispositivo preferito per il routing dell'audio per una determinata strategia. Nota il dispositivo potrebbe non essere disponibile nel momento in cui il dispositivo preferito è ma viene utilizzata una volta resa disponibile.

  • removePreferredDeviceForStrategy

    Rimuove i dispositivi audio preferiti impostati in precedenza con setPreferredDeviceForStrategy o setPreferredDevicesForStrategy.

  • getPreferredDeviceForStrategy

    Restituisce il dispositivo preferito per una strategia audio precedentemente impostata con setPreferredDeviceForStrategy o setPreferredDevicesForStrategy.

  • setPreferredDevicesForStrategy

    Consente di impostare i dispositivi preferiti per una determinata strategia.

  • getPreferredDevicesForStrategy

    Restituisce i dispositivi preferiti per una strategia audio precedentemente impostata con setPreferredDeviceForStrategy o setPreferredDevicesForStrategy.

  • OnPreferredDevicesForStrategyChangedListener

    Definisce un'interfaccia per la notifica delle modifiche nell'audio preferito impostati per una determinata strategia audio.

  • addOnPreferredDevicesForStrategyChangedListener

    Aggiunge un listener per ricevere notifiche in caso di modifiche all'audio preferito in base alla strategia dispositivo.

  • removeOnPreferredDevicesForStrategyChangedListener

    Rimuove un listener di modifiche aggiunto in precedenza alla strategia preferita dispositivo audio.

Segnala funzionalità del dispositivo

Nell'ambito dell'implementazione di Audio HAL, i fornitori implementano le API che supportano generazione di report sulle funzionalità del dispositivo. Questa sezione illustra i tipi di dati e i metodi utilizzata per segnalare le funzionalità del dispositivo ed elenca alcune modifiche apportate in audio HIDL HAL V7 per supportare più dispositivi.

Tipi di dati

In audio HIDL HAL V7, le funzionalità del dispositivo sono segnalate utilizzando l'AudioProfile e AudioTransport. La struttura AudioTransport descrive funzionalità di una porta audio con AudioProfile per i formati audio noti, oppure con descrittori hardware non elaborati per formati non noti alla piattaforma. La La struttura AudioProfile contiene il formato audio, con le frequenze di campionamento supportate profilo e l'elenco delle maschere del canale, come illustrato nel seguente codice blocca da types.hal:

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

Nel sistema audio HIDL HAL V7, il tipo di dati AudioPort viene definito con AudioTransport e AudioProfile per descrivere le caratteristiche del dispositivo le funzionalità di machine learning.

Metodi HAL per audio

Gestione norme audio utilizza i seguenti metodi per inviare query alle informazioni del dispositivo funzionalità:

  • getParameters:Un metodo generico per recuperare un parametro specifico del fornitore come i formati audio supportati e le rispettive frequenze di campionamento.
  • getAudioPort:Restituisci l'elenco degli attributi supportati (come campionamento frequenze, formati, maschere di canale, controller di guadagno) per una determinata porta audio.

Il seguente codice di IDevice.hal mostra l'interfaccia per il metodo getAudioPort:

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

Modifiche all'API precedente

Per supportare più profili audio, la versione 3.2 dell'API precedente aggiunge una nuova una struttura chiamata audio_port_v7. Vedi il codice sorgente per ulteriori dettagli.

Grazie all'aggiunta di audio_port_v7, la versione 3.2 dell'API precedente aggiunge un la nuova API get_audio_port_v7 per eseguire query sulle funzionalità dei dispositivi utilizzando Struttura audio_port_v7.

Il seguente codice di audio.h mostra la definizione dell'API get_audio_port_v7:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

I dati dell'API get_audio_port precedente devono essere inseriti nella nuova AudioPort quando la versione API legacy è precedente alla 3.2 e il HIDL HAL alla versione 7 o successiva. In questo caso, tutte le frequenze di campionamento riportate e i canali si presume che le maschere da get_audio_port siano supportate per tutti i consentendo una mappatura diretta dai valori get_audio_port nuova struttura di AudioPort.

Esempi di implementazioni dell'API

Questa sezione descrive diverse suite di test contenenti metodi che utilizzano le API trattati nelle sezioni precedenti. Fai riferimento a questi metodi per alcuni esempi come vengono implementate e utilizzate queste API.

Un esempio di utilizzo di setPreferredDevicesForStrategy getPreferredDevicesForStrategy, removePreferredDeviceForStrategy e OnPreferredDevicesForStrategyChangedListener API di sistema sono in PreferredDeviceRoutingTest, che si trova in GTS.

Per un esempio della nuova struttura in uso in AudioDeviceInfo, consulta la metodo AudioManagerTest#testGetDevices che si trova in CTS.

Un esempio di implementazione per get_audio_port_v7 è disponibile in audio_hal.c e mostra come vengono eseguite query sulle funzionalità per più dispositivi.

Convalida

Questa sezione fornisce informazioni sulla CTS. e la convalida GTS (Google Mobile Services Test Suite) di Gestione audio.

Test CTS

I test CTS si trovano nella seguente regione: android.media.cts.AudioManagerTest.

Di seguito è riportato l'elenco dei test di Gestione audio disponibili:

  • AudioManagerTest#testGetDevices

    Verifica le capacità precise del dispositivo audio. Verifica inoltre che i profili audio restituiti nella struttura AudioDeviceInfo conservano il valore dei contenuti del vecchio formato array bidimensionale, ma che si trovano nel nuovo AudioProfile.

  • AudioManagerTest#testPreferredDevicesForStrategy e AudioManagerTest#testPreferredDeviceForCapturePreset

    Verifica che i dispositivi preferiti per la strategia e le preimpostazioni di acquisizione Test dell'API completati.

Test GTS

I test GTS si trovano in com.google.android.gts.audioservice.AudioServiceHostTest.

Per verificare se le API per i dispositivi preferiti per la strategia e le acquisizioni predefinite funzionare correttamente, esegui i test AudioServiceHostTest#testPreferredDeviceRouting e AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset.