Allocation vocale
La plupart des pilotes d’adaptateur qui contiennent un pilote miniport de synthétiseur contiennent également une accélération matérielle DirectSound. Cela soulève la question de l’allocation de la voix entre les voix du synthétiseur et les mémoires tampons DirectSound accélérées par le matériel.
Les synthèses DirectMusic, à la fois matérielles et logicielles, doivent prendre en charge plusieurs instances afin d’optimiser le nombre de clients simultanés. Un synthétiseur peut être tenté d’allouer statiquement des voix aux synthés, mais doit probablement considérer toutes les instances de synthé disponibles comme tirant d’un pool de voix dynamique commun. Chaque instance indique ensuite le nombre de voix disponibles en tant que nombre total disponible dans le pool.
Lorsqu’elle est implémentée de cette façon, même un synthé matériel avec un nombre limité de voix physiques peut prendre en charge de nombreuses instances de synthé. En temps réel, l’appel STATS informe le client du nombre de voix que chaque instance utilise actuellement. Si le pool dynamique est épuisé et qu’un synthé instance nécessite une nouvelle voix, cette instance synthé doit implémenter un schéma de vol de voix pour libérer une voix de l’intérieur de cette instance.
Le schéma d’allocation suivant est basé sur l’idée que les voix utilisées par un synthétiseur sont plus facilement partagées que les mémoires tampons DirectSound, car le pilote contrôle les données envoyées dans quelle voix et peut prendre des décisions concernant le vol de voix (décrit dans la spécification DLS Level 1).
Toutes les voix disponibles pour le pilote miniport (matériel, logiciel ou une combinaison de matériel et de logiciel) sont divisées en deux pools. La première piscine, la piscine gratuite, se compose de voix qui ne sont validées nulle part. Le deuxième pool, le pool dynamique, se compose de voix qui sont validées pour être utilisées par les instances de synthétiseur. Ces voix peuvent être utilisées ou non par un synthétiseur instance. Le pool dynamique est dimensionné comme le nombre maximal de voix demandé par n’importe quel synthétiseur instance, sous réserve du contenu actuel du pool gratuit. Les mémoires tampons DirectSound sont supprimées du pool gratuit lors de l’allocation et retournées lors de la désallocation.
Le tableau suivant contient un exemple de séquence d’allocations de voix qui illustrent le schéma dans la pratique.
Temps | Requête | Piscine gratuite | Pool dynamique | Action du pilote miniport |
---|---|---|---|---|
T0 |
Mise sous tension |
64 |
0 |
Initialiser. |
T1 |
DSound (4) | 60 |
0 |
Allouez statiquement quatre voix aux mémoires tampons DirectSound. |
T2 |
Synthé (32) | 28 |
32 |
Augmenter le pool dynamique à 32 voix. |
T3 |
Synthé (24) | 28 |
32 |
Aucune action. Il y a déjà plus de 24 voix dans le pool dynamique. |
T4 |
DSound (24) | 4 |
32 |
Allouez statiquement 24 voix aux mémoires tampons DirectSound. |
T5 |
Synthé (48) | 0 |
36 |
Augmenter le pool dynamique à 36 voix. (La méthode qui crée le port retourne S_FALSE et définit DMUS_PORTPARAMS. dwVoices = 36.) |
T6 |
DSound (10) | 0 |
36 |
Échouer. Pas de voix dans la piscine libre. |
T7 |
DSound (-5) | 5 |
36 |
Libre à cinq voix. Notez que celles-ci ne retournent pas dans le pool dynamique, même si la dernière requête (à l’époque T5) était supérieure à ce qui a été accordé. |
Notez que les mémoires tampons DirectSound sont en fait allouées une par une et sont regroupées dans le tableau pour des raisons de lisibilité.
Immédiatement après la création d’une broche de synthétiseur instance, aucune voix ne doit être allouée en fonction de celle-ci. Peu après sa création, un élément de propriété KSPROPERTY_SYNTH_PORTPARAMETERS est reçu. Cet élément de propriété indique, entre autres, le nombre de voix qui doivent être associées à cette instance. Cet élément donne également au pilote miniport la possibilité de signaler la nouvelle taille réelle du pool dynamique au cas où toutes les voix demandées ne pourraient pas être allouées.