Gestione risorse hardware audio
Windows 10 include la possibilità di esprimere vincoli di concorrenza usando un file XML. Nel dispositivo vincolato alle risorse la possibilità di specificare la priorità per flussi audio specifici può migliorare l'esperienza del cliente.
Una sfida con la creazione di un'esperienza audio ottimale su un portatile o un dispositivo tablet a basso costo è che alcuni dispositivi hanno vari vincoli di concorrenza. Ad esempio, è possibile che il dispositivo possa riprodurre fino a 6 flussi audio simultaneamente e supporti solo 2 flussi offload. Quando è presente una chiamata video attiva con audio in tempo reale, è possibile che il dispositivo supporti solo 2 flussi audio. Quando il dispositivo acquisisce audio, il dispositivo può riprodurre fino a 4 flussi audio.
Windows 10 include un meccanismo per esprimere i vincoli di concorrenza per garantire che i flussi audio ad alta priorità possano essere riprodotti. Se il sistema non dispone di risorse sufficienti, i flussi con priorità bassa vengono terminati.
Windows 11 offre funzionalità aggiuntive con l'uso dei gruppi di risorse e vengono trattate più avanti in questo argomento in Gruppi di risorse - Gestione risorse audio estese.
Per specificare i vincoli, completare questi due passaggi.
- Creare un file XML di vincoli di concorrenza come descritto in Specificare i vincoli di concorrenza.
- Configurare una voce del Registro di sistema per usare il file XML dei vincoli di concorrenza personalizzati, come descritto in Configurazione della chiave del Registro di sistema.
Specificare i vincoli delle risorse di concorrenza
Il file di vincoli XML è costituito da tre sezioni. La prima sezione obbligatoria è definita da <Limiti></Limiti>. Questa sezione può essere usata per definire fino a quindici vincoli di risorse. Ad esempio, è possibile definire vincoli per il numero massimo di flussi di rendering e il numero massimo di flussi che possono essere scaricati.
<?xml version="1.0" encoding="utf-8"?>
<ConstraintModel>
<Limits>
<Resource>
<ID>MaxRender</ID>
<Consumption>6</Consumption>
</Resource>
<Resource>
<ID>MaxOffLoad</ID>
<Consumption>2</Consumption>
</Resource>
...
</Limits>
La sezione successiva del file XML definisce uno o più elenchi di endpoint esclusivi, con ogni elenco contenente due o più endpoint. Si tratta di endpoint che non possono essere attivi contemporaneamente. Questa sezione è facoltativa.
Ad esempio, se l'hardware audio ha sia HandsetSpeaker che WiredHeadsetSpeaker cablato allo stesso DAC, che non può essere attivo contemporaneamente, questi devono trovarsi nello stesso elenco ExclusiveEndpoints.
Questa sezione può avere più <nodi ExclusiveEndpoints> . Ogni nodo ExclusiveEndpoints contiene due o più nodi endpoint. Ogni nodo Endpoint contiene HWID, TopologyName e PinId.
<ExclusiveEndpoints>
<Endpoint>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
</Endpoint>
<Endpoint>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetSpeaker</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
</Endpoint>
</ExclusiveEndpoints>
La sezione successiva del file XML definisce vari consumer di risorse. Questa sezione del file contiene più <voci di ResourceConsumer> . Ogni voce identifica le informazioni relative a un consumer di risorse e all'uso delle risorse associate. Ogni risorsa usata deve essere definita in precedenza nella <sezione Limiti> .
<ResourceConsumer>
<!-- Active Phone call -->
<ConsumerInfo>
<PhoneCall>
<CallState>Active</CallState>
</PhoneCall>
</ConsumerInfo>
<Resource>
<ID>MaxRender</ID>
<Consumption>2</Consumption>
</Resource>
<Resource>
<ID>MaxOffLoad</ID>
<Consumption>2</Consumption>
</Resource>
...
</ResourceConsumer>
Quando vengono usate risorse audio, il servizio audio tiene traccia delle risorse. Quando sono disponibili risorse insufficienti, i flussi con priorità inferiore vengono terminati o la richiesta di risorsa corrente ha esito negativo se i consumer di risorse esistenti hanno priorità più alta.
Si tratta delle voci ConsumerInfo> valide<.
<Telefono Call>: il <nodo Telefono call> contiene un oggetto con il nodo figlio CallState, che può essere "Attivo" o "Hold".
<Stream> - Flussi audio. Il <nodo Stream> contiene i nodi figlio seguenti.
<HWID: ID hardware (hw-id) del consumer di risorse, come specificato nel file INF del driver.
<TopologyName> : stringa di riferimento del filtro della topologia del consumer di risorse.
<PinId> : ID pin del consumer di risorse.
<Mode> : GUID della modalità associata. Per altre informazioni, vedere Modalità di elaborazione del segnale audio.
<Connessione orType>: tipo di connettore del consumer di risorse. I valori validi sono: Host, Loopback o Offload.
<KeywordDetector> : rilevatore di parole chiave usato per supportare le interazioni vocali con trigger di parole chiave.
La tabella seguente riepiloga le priorità del flusso audio di rendering, elencate dalla priorità più alta alla più bassa.
Eseguire il rendering del flusso audio | Priorità |
---|---|
Comunicazioni | 1 |
Game Chat | 2 |
Utilità per la lettura dello schermo | 3 |
Fotocamera otturatore | 4 |
Push To Talk | 5 |
In Notifica chiamata | 6 |
Assistente personale | 6 |
Voce | 7 |
Suoneria | 8 |
Allarme | 9 |
Film | 10 |
Solo supporto in primo piano | 10 |
Supporti con supporto in background | 11 |
File media | 11 |
Effetti sonori | 12 |
DTMF | 12 |
Game Media | 12 |
Sistema | 12 |
Effetti del gioco | 12 |
Altro | 13 |
Avvisi | 14 |
La tabella seguente riepiloga le priorità del flusso audio di acquisizione, elencate dalla priorità più alta alla più bassa.
Acquisire il flusso audio | Priorità |
---|---|
Comunicazioni | 1 |
Game Chat | 2 |
Push To Talk | 4 |
Assistente personale | 6 |
Voce | 7 |
Supporti con supporto in background | 8 |
File media | 8 |
Altro | 13 |
Game Media | 15 |
Utilità per la lettura dello schermo | 15 |
Avvisi | 15 |
Solo supporto in primo piano | 15 |
Effetti del gioco | 15 |
Effetti sonori | 15 |
DTMF | 15 |
In Notifica chiamata | 15 |
Allarme | 15 |
Fotocamera otturatore | 15 |
Film | 15 |
Suoneria | 15 |
Sistema | 15 |
Esempi
Esempio 1: l'utente sta parlando con Skype, usando flussi di rendering e acquisizione delle comunicazioni. Avviano un gioco, che tenta di creare un flusso di Effetti gioco. Se non sono disponibili risorse sufficienti, la creazione del flusso Game Effects avrà esito negativo.
Esempio 2: L'utente sta riproducendo musica. Avviano un'applicazione che crea un flusso voce. Se non sono disponibili risorse sufficienti, il flusso musicale verrà terminato e la creazione del flusso voce avrà esito positivo.
Opzione con caratteri jolly per TopologyName
È disponibile un'opzione con caratteri jolly da usare con il tag TopologyName. Questa funzionalità può essere usata per supportare il comportamento dinamico associato al Bluetooth sideband. Questa opzione consente al driver audio di creare un nuovo set di interfacce per ogni periferica Bluetooth abbinata che corrisponda a un modello specifico. In questo modo le impostazioni utente per diverse periferiche audio non vengono combinate.
A tale scopo, è consigliabile aggiungere l'ID hardware della periferica alla stringa di riferimento dell'interfaccia audio. A tale scopo, è possibile usare un hash del collegamento simbolico per la periferica. Il codice di esempio sysvad del driver audio include implementazioni di esempio per la banda laterale HFP, la banda laterale A2DP e la banda laterale USB. Le funzioni di esempio sono denominate "CreateFilterNames". Questa funzione esegue l'hash del collegamento simbolico e lo combina con i nomi dei filtri per generare i nomi di filtro univoci per ogni periferica.
Le definizioni XML della risorsa fanno parte del pacchetto driver e l'ID hardware è sconosciuto al momento della creazione.
Per supportare questa corrispondenza dinamica, viene fornita un'opzione con caratteri jolly "*" asterisco per l'ultimo carattere nella dichiarazione XML della risorsa del nome della topologia.
Esempio di nome topologia con caratteri jolly
Ad esempio, la stringa di riferimento dell'interfaccia effettiva potrebbe essere "BTHFPCapture-00AABBCCDD" e la voce corrispondente nel codice XML della risorsa sarà <TopologyName>BTHFPCapture-*</TopologyName>
.
Tutti gli endpoint creati dal driver che seguono il modello "BTHFPCapture-*" userebbero la stessa definizione di risorsa.
Gruppi di risorse - Gestione risorse audio estese
I gruppi di risorse sono disponibili a partire da Windows 11. I gruppi di risorse consentono l'assegnazione di endpoint a gruppi di risorse diversi predefiniti in XML. I gruppi di risorse consentono l'allocazione di risorse audio, ad esempio flussi, in base ai limiti definiti.
Prima della creazione dei flussi, gestione risorse hardware audio determina il gruppo di risorse da usare e notifica al driver del gruppo assegnato. Quando il gestore risorse hardware audio rileva un conflitto, al rendering del flusso con priorità più alta (l'impostazione predefinita corrente) viene assegnato il gruppo di risorse preferito e i flussi con priorità più bassa riceveranno il successivo gruppo di risorse disponibile. Questo processo viene ripetuto fino a quando non sono presenti più flussi o non ci sono più risorse. Quando le risorse vengono esaurite, la creazione dei flussi con priorità più bassa restituirà un errore che indica che ci sono risorse insufficienti.
Quando viene assegnato il gruppo di risorse, l'endpoint audio riceve una notifica del gruppo di risorse assegnato. Il codice XML della risorsa dichiara quali gruppi di risorse sono applicabili all'endpoint, in ordine di priorità/preferenza e l'endpoint può essere spostato tra i gruppi di risorse supportati in base alle esigenze complessive delle risorse di sistema.
Senza gruppi di risorse, nelle versioni precedenti a Windows 11, il sistema di gestione delle risorse presuppone che le risorse hardware siano limitate, ma tali risorse possono essere spostate liberamente tra gli endpoint audio (DSP MIPS). Ad esempio, il sistema può creare fino a tre flussi di offload, un flusso di comunicazione e un flusso vocale alla volta, in qualsiasi combinazione di endpoint audio. Quando le risorse vengono dichiarate e usate, tutte provengono da un singolo pool. Questo può essere considerato come avere un singolo gruppo di risorse condiviso tra tutti gli endpoint audio. Poiché era presente un solo gruppo di risorse, non è necessario notificare al driver quale gruppo era in uso.
Scenario del gruppo di risorse di esempio
Ad esempio, se un driver ha due endpoint audio e due percorsi separati per il rendering dell'audio, uno tramite un DSP e uno senza il DSP. Scelto in anticipo, entrambi i percorsi possono essere usati per entrambi gli endpoint, ma l'endpoint assegnato per l'uso del provider di servizi di dominio ha un uso esclusivo del provider di servizi di dominio e tutto l'audio per l'endpoint deve passare attraverso il dsp. cioè non c'è nessuna combinazione di audio tra questi due percorsi.
Il provider di servizi di dominio avrebbe vincoli e funzionalità di risorse diversi rispetto all'endpoint senza DSP. Lo scambio delle risorse tra i due endpoint richiederebbe l'interruzione di tutto l'audio in entrambi gli endpoint, la riassegnazione dell'hardware e la ripresa dell'audio. Poiché la scelta di usare o meno il provider di servizi di dominio deve essere effettuata prima che vengano creati flussi nell'endpoint, la decisione deve essere presa all'esterno del driver. In caso di conflitto, due applicazioni che desiderano una funzionalità DSP contemporaneamente, i gruppi di risorse vengono usati per decidere quale endpoint ottiene la risorsa.
Ogni gruppo di risorse viene creato con un proprio set di risorse, ma può anche usare facoltativamente anche le risorse condivise a livello globale. Ad esempio, DSPGroup può essere definito per consentire due flussi di offload e un flusso vocale host, mentre NoDSPGroup consente solo un flusso offload e nessun flusso vocale host. Questa definizione consente di attivare fino a tre flussi di offload contemporaneamente. Potrebbe anche essere disponibile un massimo di sistema massimo massimo di due flussi di offload contemporaneamente, condivisi sia tra DSPGroup che NoDSPGroup.
Quando viene creato un flusso, verrà assegnato a DSPGroup o NoDSPGroup in base al tipo di flusso creato e alla priorità del flusso e dell'endpoint. Se il flusso creato è offload, verrà assegnato DSPGroup, in caso contrario, potrebbe essere assegnato a DSPGroup o NoDSPGroup.
Mentre un endpoint viene assegnato a un gruppo, tutti i flussi in tale endpoint sono limitati alle risorse di flusso associate al gruppo. Ad esempio, massimo due flussi offload disponibili quando un endpoint viene assegnato a DSPGroup.
Può essere determinato che un endpoint deve passare da un gruppo a un altro, a causa della priorità dei flussi. Ad esempio, se il primo flusso di offload è stato creato in un endpoint dell'altoparlante e viene creato un nuovo flusso di offload nell'endpoint del visore VR e è disponibile un solo set di risorse DSPGroup, la risorsa DSPGroup dovrà essere riallocata dall'endpoint del parlante all'endpoint del visore VR. A tale scopo, tutti i flussi DSPGroup voce verranno invalidati. DSPGroup verrà quindi allocato all'endpoint del visore VR e al flusso di offload creato. Dopo aver invalidato il flusso ricreato dalle app invalidate, si noterà che l'offload non è più disponibile perché sono priorità inferiore rispetto all'utente di offload dell'endpoint del visore VR esistente. NoDSPGroup verrà assegnato all'endpoint dell'altoparlante e i flussi saranno limitati ai vincoli delle risorse dell'endpoint voce, massimo sei flussi host possibili nel sistema, ad esempio.
L'esempio descritto è semplificato. Il sistema consente un numero qualsiasi di gruppi condivisi tra un numero qualsiasi di endpoint. Ad esempio, potrebbero essere presenti tre endpoint, condividendo due DSP con supporto e un DSP limitato o cinque endpoint che condividono due percorsi software e due DSP.
XML del gruppo di risorse di esempio
Questo segmento XML di esempio definisce due gruppi di risorse, DSPGroup e NoDSPGroup.
<Limits>
<Resource>
<ID>DataBus</ID>
<Consumption>8</Consumption>
</Resource>
<ResourceGroup Name="DSPGroup">
<Consumption>1</Consumption>
<Resource>
<ID>MaxOffload</ID>
<Consumption>3</Consumption>
</Resource>
<Resource>
<ID>DspMaxLoopback</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceGroup>
<ResourceGroup Name="NoDSPGroup">
<Consumption>2</Consumption>
<Resource>
<ID>MaxHost</ID>
<Consumption>2</Consumption>
</Resource>
<Resource>
<ID>MaxLoopback</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceGroup>
</Limits>
Comportamento di allocazione del gruppo di risorse
All'avvio, le risorse globali esistenti verranno allocate dal gestore risorse esterne. Ogni gruppo di risorse avrà quindi una risorsa allocata con il gestore risorse esterno, con il conteggio uguale alle istanze massime del gruppo.
In fase di esecuzione, ogni endpoint verrà associato a un solo gruppo di risorse.
Flussi in tale endpoint avrà accesso solo alle risorse all'interno del gruppo di risorse associato.
È anche possibile usare le risorse del pool condiviso globale originale.
Quando il primo flusso viene creato in un endpoint, verrà acquisito il vincolo di risorsa endpoint richiesto. Quando l'ultimo flusso viene chiuso nell'endpoint, il vincolo verrà rilasciato.
Quando a un endpoint viene assegnato un gruppo di risorse, deve ricevere una notifica del gruppo di risorse assegnato.
Il gruppo di risorse assegnato dipenderà dalla priorità dei requisiti del gruppo di risorse per i flussi attualmente attivi e dalla disponibilità.
Quando viene acquisito il vincolo di risorsa endpoint, i flussi nell'endpoint sono limitati alle risorse di flusso globali e alle risorse di flusso all'interno del gruppo di risorse acquisito. Potrebbero non acquisire una risorsa disponibile in un gruppo diverso.
Le risorse che fanno parte del gruppo di risorse vengono usate solo dall'endpoint a cui è attualmente assegnato il gruppo di risorse.
I gruppi di risorse possono facoltativamente contenere risorse specifiche del gruppo aggiuntive. Una risorsa verrà allocata dal gestore di risorse esterno per ogni risorsa quando il numero massimo di istanze per il gruppo di risorse.
Quando l'assegnazione del gruppo di risorse viene modificata, tutti i flussi nell'endpoint vengono terminati prima della modifica.
Affinché un endpoint passi da un gruppo di risorse a un altro gruppo di risorse, tutti i flussi che contengono risorse dall'altro gruppo devono essere invalidati e al momento della creazione del flusso tutte le nuove risorse verranno acquisite dal nuovo gruppo di risorse.
Configurazione della chiave del Registro di sistema
Il percorso completo del file XML dei vincoli di concorrenza deve essere specificato nella chiave del Registro di sistema seguente.
HKR\SYSTEM\MultiMedia\DeviceCapability\ResourceSettings\XMLConfig
Il percorso è relativo all'installazione del driver. Nell'installazione del driver INF è necessario copiare il file XML del vincolo e la riga seguente verrà aggiunta per registrarla nel sistema:
HKR,SYSTEM\MultiMedia\DeviceCapability\ResourceSettings\XMLConfig,<Name of the constraint>,,<Path to the constraint>
In questa chiave del Registro di sistema specificare un valore contenente il percorso del codice XML. È consigliabile che il nome del file XML e il nome del valore regkey siano univoci poiché è possibile che altri sottosistemi/dispositivi audio forniscano il proprio set di vincoli nei file XML. La chiave regkey può essere impostata nel file INF del driver audio.
File di vincoli XML di esempio
Questo è un file di vincoli XML di esempio dell'esempio di driver audio virtuale SYSVAD.
<?xml version="1.0" encoding="utf-8"?>
<ConstraintModel>
<Limits>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>3</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>2</Consumption>
</Resource>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>2</Consumption>
</Resource>
<Resource>
<ID>MaxOneLoopback</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>27</Consumption>
</Resource>
</Limits>
<ExclusiveEndpoints>
<Endpoint>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologySpeaker</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
</Endpoint>
<Endpoint>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetS*</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
</Endpoint>
</ExclusiveEndpoints>
<ExclusiveEndpoints>
<Endpoint>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicArray1</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
</Endpoint>
<Endpoint>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetM*</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
</Endpoint>
</ExclusiveEndpoints>
<ResourceConsumer>
<!-- Phone call -->
<ConsumerInfo>
<PhoneCall>
<CallState>Active</CallState>
</PhoneCall>
</ConsumerInfo>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>2</Consumption>
</Resource>
<Resource>
<ID>MaxOneLoopback</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>26</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- Keyword Detector -->
<ConsumerInfo>
<KeywordDetector />
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>2</Consumption>
</Resource>
<!-- Don't include MaxOneRawStreamInPhoneCall
so we can validate Capture stream causing
KD release then PhoneCall releasing Capture
and letting KD acquire -->
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, default mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<!--Signal processing mode default-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, Communications mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{98951333-B9CD-48B1-A0A3-FF40682D73F7}</Mode>
<!--Signal processing mode Communications-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, Speech mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{FC1CFC9B-B9D6-4CFA-B5E0-4BB2166878B2}</Mode>
<!--Signal processing mode Speech-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, Notification mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{9CF2A70B-F377-403B-BD6B-360863E0355C}</Mode>
<!--Signal processing mode Notification-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, Media mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{4780004E-7133-41D8-8C74-660DADD2C0EE}</Mode>
<!--Signal processing mode Media-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, Movie mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{B26FEB0D-EC94-477C-9494-D1AB8E753F6E}</Mode>
<!--Signal processing mode Movie-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, raw mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<!--Signal processing mode raw-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, default mode, offload -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<!--Signal processing mode default-->
<ConnectorType>Offload</ConnectorType>
<!-- Offload -->
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, Media mode, Offload -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{4780004E-7133-41D8-8C74-660DADD2C0EE}</Mode>
<!--Signal processing mode Media-->
<ConnectorType>Offload</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, Movie mode, offload -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{B26FEB0D-EC94-477C-9494-D1AB8E753F6E}</Mode>
<!--Signal processing mode Movie-->
<ConnectorType>Offload</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to speaker, default mode, loopback -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeaker</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<!--Signal processing mode default-->
<ConnectorType>Loopback</ConnectorType>
<!-- Loopback -->
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneLoopback</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, default mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, Communications mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{98951333-B9CD-48B1-A0A3-FF40682D73F7}</Mode>
<!--Signal processing mode Communications-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, Speech mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{FC1CFC9B-B9D6-4CFA-B5E0-4BB2166878B2}</Mode>
<!--Signal processing mode Speech-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, Notification mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{9CF2A70B-F377-403B-BD6B-360863E0355C}</Mode>
<!--Signal processing mode Notification-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, Media mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{4780004E-7133-41D8-8C74-660DADD2C0EE}</Mode>
<!--Signal processing mode Media-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, Movie mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{B26FEB0D-EC94-477C-9494-D1AB8E753F6E}</Mode>
<!--Signal processing mode Movie-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, default mode, offload -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<!-- Offload -->
<ConnectorType>Offload</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, Media mode, Offload -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{4780004E-7133-41D8-8C74-660DADD2C0EE}</Mode>
<!--Signal processing mode Media-->
<ConnectorType>Offload</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, Movie mode, offload -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{B26FEB0D-EC94-477C-9494-D1AB8E753F6E}</Mode>
<!--Signal processing mode Movie-->
<ConnectorType>Offload</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to wired headset, default mode, loopback -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologySpeakerHeadset</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<!-- Loopback -->
<ConnectorType>Loopback</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneLoopback</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to BT speaker, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyBthHfpSpeaker</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to BT speaker, raw mode, offload -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyBthHfpSpeaker</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<!-- Offload -->
<ConnectorType>Offload</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxTwoOffload</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to BT speaker, default mode, loopback -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyBthHfpSpeaker</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<!-- Loopback -->
<ConnectorType>Loopback</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneLoopback</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to handset speaker, default mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetS*</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to handset speaker, Communications mode, host -->
<ConsumerInfo>
<Stream>
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<TopologyName>TopologyHandsetS*</TopologyName>
<!-- Topology filter reference string-->
<PinId>1</PinId>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<Mode>{98951333-B9CD-48B1-A0A3-FF40682D73F7}</Mode>
<!--Signal processing mode Communications-->
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to handset speaker, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetS*</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream to handset speaker, default mode, loopback -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetS*</TopologyName>
<!-- KSPIN_TOPO_LINEOUT_DEST -->
<PinId>1</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<!-- Loopback -->
<ConnectorType>Loopback</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxThreeRender</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneLoopback</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic, default mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicIn</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic, communications mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicIn</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode communications-->
<Mode>{98951333-B9CD-48B1-A0A3-FF40682D73F7}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic, speech mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicIn</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode speech-->
<Mode>{FC1CFC9B-B9D6-4CFA-B5E0-4BB2166878B2}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic, notification mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicIn</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode notification-->
<Mode>{9CF2A70B-F377-403B-BD6B-360863E0355C}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicIn</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from wired headset mic, default mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicHeadset</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from wired headset mic, communications mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicHeadset</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode communications-->
<Mode>{98951333-B9CD-48B1-A0A3-FF40682D73F7}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from wired headset mic, speech mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicHeadset</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode speech-->
<Mode>{FC1CFC9B-B9D6-4CFA-B5E0-4BB2166878B2}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from wired headset mic, notification mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicHeadset</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode notification-->
<Mode>{9CF2A70B-F377-403B-BD6B-360863E0355C}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from wired headset mic, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicHeadset</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic array, default mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicArray1</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic array, communications mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicArray1</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode communications-->
<Mode>{98951333-B9CD-48B1-A0A3-FF40682D73F7}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic array, speech mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicArray1</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode speech-->
<Mode>{FC1CFC9B-B9D6-4CFA-B5E0-4BB2166878B2}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic array, notification mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicArray1</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode notification-->
<Mode>{9CF2A70B-F377-403B-BD6B-360863E0355C}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from mic array, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyMicArray1</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from BT mic, default mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyBthHfpMic</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from BT mic, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyBthHfpMic</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from handset mic, default mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetM*</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode default-->
<Mode>{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from handset mic, communications mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetM*</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode communications-->
<Mode>{98951333-B9CD-48B1-A0A3-FF40682D73F7}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from handset mic, speech mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetM*</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode speech-->
<Mode>{FC1CFC9B-B9D6-4CFA-B5E0-4BB2166878B2}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from handset mic, notification mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetM*</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode notification-->
<Mode>{9CF2A70B-F377-403B-BD6B-360863E0355C}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>2</Consumption>
</Resource>
</ResourceConsumer>
<ResourceConsumer>
<!-- AudioStream from handset mic, raw mode, host -->
<ConsumerInfo>
<Stream>
<!-- Example of h/w id specified in phoneaudiosample.inf -->
<HWID>Root\sysvad_PhoneAudioSample</HWID>
<!-- Topology filter reference string-->
<TopologyName>TopologyHandsetM*</TopologyName>
<!-- KSPIN_TOPO_MIC_ELEMENTS -->
<PinId>0</PinId>
<!--Signal processing mode raw-->
<Mode>{9E90EA20-B493-4FD1-A1A8-7E1361A956CF}</Mode>
<ConnectorType>Host</ConnectorType>
</Stream>
</ConsumerInfo>
<Resource>
<ID>MaxTwoCapture</ID>
<Consumption>1</Consumption>
</Resource>
<Resource>
<ID>MaxOneRawStreamInPhoneCall</ID>
<Consumption>1</Consumption>
</Resource>
</ResourceConsumer>
</ConstraintModel>