Allocazione vocale
La maggior parte dei driver di adattatori che contengono un driver miniport di sintetizzatore contiene anche l'accelerazione hardware DirectSound. Ciò illustra la questione dell'allocazione vocale tra le voci del sintetizzatore e i buffer DirectSound accelerati dall'hardware.
DirectMusic synths,sia hardware che software--deve supportare più istanze per ottimizzare il numero di client simultanei. Un writer synth potrebbe essere tentato di allocare staticamente le voci ai synth, ma probabilmente dovrebbe considerare tutte le istanze disponibili di synth come disegno da un pool di voci comuni e dinamiche. Ogni istanza segnala quindi il numero disponibile di voci come numero totale disponibile nel pool.
Quando implementato in questo modo, anche un synth hardware con un numero limitato di voci fisiche può supportare numerose istanze di synth. In tempo reale, la chiamata STATS informa il client del numero di voci che ogni istanza sta attualmente usando. Se il pool dinamico è esaurito e un'istanza di synth richiede una nuova voce, tale istanza di synth deve implementare uno schema di furto vocale per liberare una voce dall'interno di tale istanza.
Lo schema di allocazione seguente si basa sull'idea che le voci usate da un sintetizzatore siano più facilmente condivise rispetto ai buffer DirectSound perché il driver ha il controllo sui dati che passano nella voce e possono prendere decisioni sul furto vocale (descritto nella specifica DLS Level 1).
Tutte le voci disponibili per il driver miniport (hardware, software o una combinazione di hardware e software) sono suddivise in due pool. Il primo pool, il pool gratuito, è costituito da voci che non vengono eseguite ovunque. Il secondo pool, il pool dinamico, è costituito da voci che vengono eseguite dal commit per l'uso da parte delle istanze del sintetizzatore. Queste voci possono o non essere attualmente in uso da un'istanza del sintetizzatore. Il pool dinamico viene ridimensionato come numero massimo di voci richieste da qualsiasi istanza del sintetizzatore, soggetto al contenuto corrente del pool libero. I buffer DirectSound vengono rimossi dal pool gratuito al momento dell'allocazione e restituiti in deallocation.
La tabella seguente contiene una sequenza di esempi di allocazioni vocali che illustrano lo schema in pratica.
Ora | Richiesta | Pool gratuito | Pool dinamico | Azione del driver miniport |
---|---|---|---|---|
T0 |
Alimentazione |
64 |
0 |
Inizializzare. |
T1 |
DSound (4) | 60 |
0 |
Allocare staticamente quattro voci ai buffer DirectSound. |
T2 |
Synth (32) | 28 |
32 |
Aumentare il pool dinamico a 32 voci. |
T3 |
Synth (24) | 28 |
32 |
Nessuna azione. Nel pool dinamico sono già presenti più di 24 voci. |
T4 |
DSound (24) | 4 |
32 |
Allocare staticamente 24 voci ai buffer DirectSound. |
T5 |
Synth (48) | 0 |
36 |
Aumentare il pool dinamico a 36 voci. Il metodo che crea la porta restituisce S_FALSE e imposta DMUS_PORTPARAMS. dwVoices = 36.) |
T6 |
DSound (10) | 0 |
36 |
Operazione non riuscita. Nessuna voce nel pool libero. |
T7 |
DSound (-5) | 5 |
36 |
Libera cinque voci. Si noti che questi non tornano al pool dinamico, anche se l'ultima richiesta (alla volta T5) era per più di quanto è stato concesso. |
Si noti che i buffer DirectSound vengono effettivamente allocati uno per uno e vengono raggruppati insieme nella tabella a scopo di leggibilità.
Immediatamente dopo la creazione di un'istanza del pin del sintetizzatore, non è necessario allocare voci in base a essa. Poco dopo la creazione, viene ricevuto un elemento della proprietà KSPROPERTY_SYNTH_PORTPARAMETERS . Questo elemento della proprietà indica, tra le altre cose, il numero di voci che devono essere associate a questa istanza. Questo elemento offre anche al driver miniport la possibilità di segnalare le nuove dimensioni effettive del pool dinamico nel caso in cui tutte le voci richieste non siano state allocate.