Composizione multi circuito ACX
Questo argomento illustra la composizione multi circuito ACX. Per una panoramica generale di ACX e dell'elenco dei termini ACX, vedere Panoramica delle estensioni della classe audio ACX.
Come descritto in Riepilogo degli oggetti ACX, un AcxCircuit rappresenta un percorso audio parziale o completo a un dispositivo audio percepito dall'utente (altoparlanti, microfoni e così via). Un AcxCircuit ha almeno un pin di input e un pin di output (ACXPIN) e può aggregare uno o più oggetti simili a AcxElements. Per informazioni generali, vedere Circuiti ACX.
Composizione del circuito ACX
ACX associa i circuiti fino a quando non formano un percorso audio completo. ACX usa associazioni audio per connettere i circuiti audio tra loro. Allo stesso tempo, ogni circuito ACX viene convertito in un filtro KS, questi filtri KS vengono quindi rilevati dal Generatore di endpoint audio (AEB) che viene eseguito come servizio in modalità utente. AEB analizza il grafico del filtro KS rilevato e crea l'endpoint audio software che rappresenta l'infrastruttura audio sottolineata quando rileva un percorso audio completo.
Il diagramma seguente illustra gli oggetti ACX usati da ACX per rilevare, compilare e monitorare i circuiti che costituiscono l'endpoint audio composito.
Importante
Si noti che solo i tipi visualizzati in blu sono pubblici: ACXCIRCUITTEMPLATE, ACXCOMPOSITETEMPLATE (non mostrato), ACXMANAGER, ACXCIRCUITFACTORY e ACXCIRCUIT. Tutti i tipi visualizzati in viola sono interni e sono elencati qui solo a scopo illustrativo. Non è garantito che i tipi interni rimangano invariati o siano disponibili in versioni diverse di ACX e non devono essere chiamati o usati direttamente.
Il gestore ACX analizza i modelli di circuito init quando i driver ACX li registrano con il gestore ACX. I driver ACX registrano modelli/binding compositi usando ACXCIRCUTTEMPLATES (#1).
Quando acx manager riceve un modello di circuito, controlla se si tratta di un modello di istanza o di un modello di classe generico.
Per i modelli di istanza, ACX crea un ACXCOMPOSITEMANAGER (#4), per i modelli di classe generici, ACX crea un ACXCOMPOSITEFACTORY (#2), responsabile della creazione di elementi ACXCOMPOSITEMANAGER (#3) quando rileva il circuito "core" del composito. I circuiti principali sono i circuiti che danno l'identità a un endpoint audio composito.
ACXCOMPOSITEMANAGER crea a sua volta ACXCOMPOSITE (#5) per rappresentare l'endpoint audio composito sottolineato. Il gestore composito è responsabile del monitoraggio di qualsiasi segmento di circuito facoltativo che può verificarsi dopo la creazione/inizializzazione del composito.
ACXCOMPOSITE crea a sua volta un ACXCIRCUITMANAGER (#6) per ogni circuito che fa parte del composito. ACXCIRCUITMANAGER è responsabile della creazione, del monitoraggio e del controllo di un singolo circuito (#7).
Può essere possibile che un circuito venga contrassegnato come "su richiesta", in tal caso ACXCIRCUITMANAGER trova la factory del circuito e richiede un nuovo circuito per il composito (#8). ACXCIRCUITFACTORY crea un OGGETTO ACXCIRCUIT come richiesta (#9).
Quando vengono rilevati e attivi tutti gli ACXCIRCUIT, ACXCOMPOSITE diventa attivo e indica a ACXCIRCUITMANAGERS di attivare le interfacce 'audio' per i circuiti.
Il diagramma di sequenza seguente mostra come due circuiti ACX (Circuito A e B) siano associati insieme per creare un percorso audio completo, rappresentato dal generatore di endpoint audio (AEB) con un dispositivo audio software.
Negoziazione in formato multi circuito
In questa sezione viene descritta la negoziazione del formato che si verifica quando l'endpoint audio è composto da due o più circuiti. Per informazioni generali sui circuiti ACX, vedere Comunicazioni tra driver multi stack ACX.
Pin del ponte di livello inferiore
I pin del bridge di livello inferiore sono i pin che inviano dati a (rendering) o ricevono dati da un dispositivo audio fisico direttamente o indirettamente. Questo tipo di pin può essere associato o meno a ACXMODEFORMATLISTs. Questi pin del bridge hanno un tipo "AcxPinQualifierBridgeB" o "AcxPinQualifierBridgeDevice". Per altre informazioni su ACXMODEFORMATLIST, vedere l'intestazione acxdataformat.h.
In questo diagramma e in questo articolo viene usato un livello superiore e un livello inferiore per descrivere la direzione del flusso, in quanto la direzione del flusso verso l'alto o verso il basso dipende dal fatto che i pin inviano dati a (rendering) o ricevono dati (acquisizione).
Pin del bridge di livello inferiore senza ACXMODEFORMATLIST
Un driver può scegliere di non esporre elenchi in formato modalità sul relativo pin di livello inferiore. Se gli elenchi in formato modalità non sono disponibili in un pin bridge di livello inferiore, un utente (tramite il pannello di controllo audio) o un'altra entità software non può controllare o specificare direttamente il formato audio di questo pin e dei flussi associati. Questi sono alcuni scenari in cui questi elenchi non sono necessari:
Circuiti di sola streaming che possono essere collegati a un circuito DSP, a un circuito CODEC o direttamente al dispositivo audio. Questi circuiti spostano semplicemente i dati dal punto A al punto B senza modificarli. Questi circuiti non modificano la frequenza di campionamento dei dati dei flussi in ingresso/in uscita. In questo caso gli elenchi in formato modalità sono associati al pin di livello superiore.
Circuiti a flusso singolo senza elementi che modificano la frequenza di campionamento in ingresso/in uscita. Un esempio è il circuito del dispositivo audio USB. In questo scenario gli elenchi in formato modalità sono associati al pin di livello superiore.
L'assenza dell'elenco di formato dati implica che il formato dei dati del flusso originato da questo pin sia compatibile con uno dei formati di dati del pin di livello superiore del circuito collegato.
Pin del bridge di livello inferiore con ACXMODEFORMATLIST
Un driver può scegliere di esporre elenchi in formato modalità sui relativi pin di livello inferiore. Se gli elenchi in formato modalità sono disponibili su un pin bridge di livello inferiore, un utente (tramite il pannello di controllo audio) o un'altra entità software può controllare/specificare direttamente il formato audio di questo pin e flussi associati.
Questi sono alcuni scenari validi in cui vengono usati questi elenchi in formato modalità:
- Circuiti DSP: in genere questo tipo di circuiti supporta più flussi in esecuzione a frequenze di campionamento diverse, questi flussi vengono convertiti internamente in una frequenza di campionamento comune e mista prima che i dati passino al circuito successivo. I controlli elenco in formato dati/specifica la frequenza di campionamento finale (per questo circuito).
Quando l'elenco di formato dati è presente, questi formati di dati devono corrispondere agli esempi di formato dati nel pin di livello superiore del pin del circuito successivo. Si noti che le modalità non devono corrispondere, vedere la discussione delle modalità, nelle sezioni seguenti.
Gli elenchi di formati di livello inferiore offrono l'opportunità di controllare il formato del flusso risultante, in questo caso il valore predefinito dell'elenco è la frequenza di campionamento usata fino a quando non viene eseguita un'azione esplicita per modificare il formato su questo pin.
Per altre informazioni sugli elenchi di formato, vedere l'intestazione acxdataformat.h.
Pin del ponte di rilievo
I pin del bridge di livello superiore sono i pin che ricevono dati da (rendering) o inviano dati a un modulo software direttamente o indirettamente. Questo tipo di pin deve essere associato a ACXMODEFORMATLISTs. Questi pin di ponte hanno un tipo "AcxPinQualifierBridgeA".
Il diagramma precedente illustrato di nuovo qui può essere usato anche per mostrare il flusso di dati di rendering e acquisizione tra un pin di streaming, due circuiti e un dispositivo.
Pin di livello superiore [Bridge] senza ACXMODEFORMATLIST
I pin di livello superiore senza elenchi in formato modalità non sono una combinazione valida e questo comporta un endpoint non configurato correttamente. L'endpoint non è visibile dal punto di vista dell'utente.
Pin di livello superiore [Bridge] con ACXMODEFORMQATLIST
I pin di livello superiore devono avere sempre uno o più ACLXMODEFORMATLISTs. Gli elenchi in formato modalità specificano tutte le percentuali di campionamento possibili per una modalità e la frequenza di campionamento predefinita. Diverse modalità possono avere diversi set di frequenze di campionamento. La frequenza di campionamento predefinita è la frequenza di campionamento preferita per tale modalità.
Modalità e circuiti
I pin di livello superiore di circuiti a flusso singolo o circuiti multi-flusso possono supportare uno o più elenchi di formati in modalità. I circuiti a flusso singolo hanno una modalità attiva contemporaneamente, mentre i circuiti multi-flusso possono avere due o più flussi in esecuzione contemporaneamente possibilità di usare modalità diverse.
Mapping della modalità
In questa sezione viene fornita una breve introduzione delle modalità standard e viene illustrato il motivo per cui viene usato il mapping "mode".
Modalità RAW: il flusso o il circuito non applica alcun effetto sul flusso ,ad eccezione di eventuali vincoli di volume, disattivazione e sicurezza, ad esempio la protezione dell'altoparlante.
Modalità PREDEFINITA: il flusso o il circuito produce un effetto predefinito.
<mode_name> mode
: il flusso/circuito applica effetti specifici della <modalità di mode_name> selezionata.
È obbligatorio che i pin di streaming supportino la modalità non elaborata e/o predefinita. È facoltativo per i pin di streaming per supportare qualsiasi altro <mode_name> modes
oggetto .
In un endpoint composito, può essere possibile che il circuito di livello superiore supporti più modalità e che i circuiti di livello inferiore supportino solo RAW e/o DEFAULT.
Esempio in un endpoint a due circuiti:
Il pin di livello inferiore del circuito di livello superiore supporta le modalità e i formati associati m1{f1,f2} e m2{f3,f4}, vale a dire che il flusso del pin ha un formato f1 o f2 quando viene usato m1 o un formato f3 o f4 quando viene usato m2. Si presuppone che il circuito di livello superiore sia un singolo circuito di flusso.
Il pin di livello superiore del circuito inferiore supporta la modalità predefinita{f1,f2,f3}.
In questo caso la modalità del flusso viene convertita dalla <modalità mode_name> alla modalità predefinita mantenendo le stesse frequenze di campionamento.
da m1/f1 a > default/f1
da m1/f2 a > default/f2
da m2/f3 a > default/f3
Voce non valida: da m2/f4 a > Nessuno
Il mapping della modalità viene eseguito dal driver con l'aiuto di ACX. Nella tabella precedente, l'ultima voce non è valida, il pin di livello inferiore del circuito superiore deve rimuovere l'opzione m2/f4 come opzione per i formati supportati. Si noti che questo potrebbe essersi verificato inverso, ad esempio, il pin di rilievo del circuito inferiore potrebbe avere supportato anche f4 e f5. Nel qual caso default-f4 è supportato ma il valore predefinito-f5 non era. In questo caso è il pin di livello superiore del circuito inferiore responsabile di non elencare m?/f5 come opzione dal relativo elenco. Altre sezioni seguenti illustrano questo processo.
Formattare le trattative
Prima che ACX consenta le interfacce audio dei circuiti che costituiscono il dispositivo composito, assicura che i circuiti possano negoziare la modalità/formati dei dati audio. ACX esegue questa notifica del circuito richiamando il callback di inizializzazione composita in tutti i circuiti del composito. La sequenza è da livello inferiore (lato dispositivo) a livello superiore (lato sistema). I circuiti hanno l'opportunità di aggiornare i formati durante questa fase.
Visualizzazione del pannello di controllo Formato dispositivo
La logica corrente del pannello di controllo audio mostra l'elenco dei formati di dispositivo come indicato di seguito:
- Se il dispositivo audio supporta un elemento del motore audio, l'elenco dei formati di dati visualizzati nel pannello di controllo è l'elenco di formato dati del dispositivo, ad esempio l'elenco di formato dati associato al pin di livello inferiore (connesso al pin di output dell'elemento del motore audio).
- Se il dispositivo audio non supporta un elemento del motore audio, l'elenco dei formati di dati visualizzati nel pannello di controllo è l'elenco di formati di dati del pin di streaming, ovvero l'elenco di formato dati attaccato al pin di livello superiore.
Creazione automatica del flusso a più circuiti
ACX usa gli oggetti ACXSTREAMBRIDGE associati a un pin del bridge di livello inferiore per propagare automaticamente le richieste create-stream ai circuiti remoti.
Quando un'app client crea un flusso, tale richiesta viene ricevuta per la prima volta da un pin di streaming. ACX invia una notifica al driver a causa del pin di streaming relativo alla richiesta di creazione del flusso tramite il callback specificato in fase di creazione del circuito. Nel callback il driver crea un oggetto ACXSTREAM che rappresenta il flusso e quindi restituisce di nuovo il controllo ad ACX. Quando ACX riceve il controllo, verifica se deve inoltrare questa richiesta di creazione al circuito successivo (di livello inferiore). Facoltativamente, il driver può inoltrare la richiesta di creazione al circuito successivo (di livello inferiore) prima di tornare dal callback create-stream. Quest'ultima opzione consente al conducente di eseguire qualsiasi operazione post dopo i circuiti di livello inferiore ha avuto la possibilità di elaborare le richieste di creazione.
ACX usa la logica predefinita seguente per la creazione del flusso:
- Se non c'è un pin ponte di livello inferiore, tutto fatto.
- Se il driver ha già associato manualmente il flusso a un ACXSTREAMBRIDGE, tutto fatto.
- Se il pin del bridge di livello inferiore non dispone di ACXSTREAMBRIDGE per la modalità specificata, non eseguire la richiesta.
- ACX aggiunge il nuovo flusso creato con ACXSTREAMBRIDGE recuperato.
ACXSTREAMBRIDGE funge da multi-in/single-out. Purché sia presente un flusso in flusso, ACXSTREAMBRIDGE mantiene presente un flusso out-stream. Il flusso out viene eliminato solo quando viene rimosso l'ultimo flusso in-stream. ACXSTREAMBRIDGE usa gli ACXDATAFORMATLIST associati al pin del bridge di livello inferiore quando si decide la modalità e il formato da usare per il circuito remoto.
ACXSTREAMBRIDGE usa la logica seguente per selezionare la modalità e il formato dati del flusso out:
Se mode per out-stream non è specificato, verificare se è presente un elenco di formato "predefinito".
Se mode per out-stream non è specificato e l'elenco di formato 'default' non è presente, verificare se è presente un elenco di formato 'raw'.
Se MODE è NULL_GUID, verificare se è presente un elenco di formati associato alla modalità del primo flusso.
Se si specifica MODE, verificare se è presente un elenco di formati per questa modalità.
Se viene trovato un elenco di formati, ottenere il formato predefinito dall'elenco di formati.
Se il formato non viene trovato, ACXSTREAMBRIDGE usa il formato del primo in-stream.
ACXSTREAMBRIDGE compila una richiesta di creazione di flusso usando ACXTARGETSTREAM usando la modalità recuperata e il formato di dati come indicato di seguito:
- Se è stato specificato MODE, viene utilizzata tale modalità.
- Se MODE è stato NULL_GUID, viene usata la modalità del primo flusso.
- Altrimenti non viene usata alcuna modalità.
ACX si occupa di eliminare o chiudere il flusso di destinazione quando viene rimosso l'ultimo flusso in-stream.
Un altro processo di ACXSTREAMCIRCUIT consiste nel propagare automaticamente uno stato del flusso lungo la catena di streaming.
Un driver ha la possibilità di disattivare la creazione del bridge di flusso remoto del circuito predefinito chiamando AcxCircuitInitDisableDefaultStreamBridgeHandling o associando manualmente l'oggetto ACXSTREAM a un ACXSTREAMBRIDGE prima di restituire il controllo ad ACX. In quest'ultimo caso, il flusso remoto viene creato prima che il driver restituisca dalla funzione di callback 'create-stream' EVT_ACX_CIRCUIT_CREATE_STREAM.
Per i circuiti che usano più pin di acquisizione/rendering, ad esempio host/offload/loopback/kws, ad esempio quando è supportato l'elemento del motore audio, il driver deve creare un bridge di flusso senza alcuna modalità specificata e aggiungere manualmente gli oggetti ACXSTREAM in ingresso al bridge durante l'elaborazione del callback create-stream.
Per altre informazioni sulla creazione del bridge di flusso, vedere:
Propagazione automatica dello stato del flusso a più circuiti in flussi di livello inferiore
ACXSTREAMBRIDGE propaga automaticamente una richiesta di stato di flusso a circuiti remoti. Quando lo stato di un flusso cambia, ACXSTREAMBRIDGE calcola lo stato misto del flusso out-stream e invia la nuova richiesta "stream-state" al flusso remoto usando ACXTARGETSTREAM.
ACXSTREAM insieme a ACXSTREAMBRIDGE usano la logica seguente:
Modificare i primi stati dei flussi di livello superiore in questi scenari:
- Esegui & rendering dall'esecuzione interrotta>
- Acquisisci e passa da Run-Stop>
- Altro && andare da Run-Stop>
Modificare gli stati dei flussi di livello superiore per ultimi in questi scenari:
- Rendering & esecuzione dall'arresto>
- Acquisisci e passa da Interrompi esecuzione>
- Altro && andare da Stop-Run>
I driver hanno un'opzione per invertire questo ordine tramite un'impostazione di configurazione.
Nota
È un requisito per un driver/circuito/flusso per avere sempre esito positivo delle transizioni di flusso dall'esecuzione all'arresto. D'altra parte, è consentito che un driver non riesca a eseguire il contrario, ovvero dall'arresto all'esecuzione.
Vedi anche
Panoramica delle estensioni della classe audio ACX