Compartir a través de


Asignación de voz

La mayoría de los controladores de adaptador que contienen un controlador de minipuerto de sintetizador también contienen aceleración de hardware de DirectSound. Esto plantea la cuestión de la asignación de voz entre las voces del sintetizador y los búferes de DirectSound acelerados por hardware.

DirectMusic synths,tanto el hardware como el software, deben admitir varias instancias para maximizar el número de clientes simultáneos. Un escritor de sintetizadores podría verse tentado a asignar voces estáticamente a los sintetizadores, pero probablemente debería considerar todas las instancias disponibles de los sintetizadores como dibujo de un grupo de voz dinámico común. A continuación, cada instancia notifica el número disponible de voces como el número total disponible en el grupo.

Cuando se implementa de esta manera, incluso un sintetizador de hardware con un número limitado de voces físicas puede admitir numerosas instancias de synth. En tiempo real, la llamada a STATS informa al cliente de cuántas voces usa actualmente cada instancia. Si el grupo dinámico se agota y una instancia de synth requiere una nueva voz, esa instancia de synth debe implementar un esquema de robo de voz para liberar una voz desde esa instancia.

El siguiente esquema de asignación se basa en la idea de que las voces usadas por un sintetizador se comparten más fácilmente que los búferes de DirectSound porque el controlador tiene control sobre qué datos van en qué voz y pueden tomar decisiones sobre el robo de voz (descrito en la especificación DLS Level 1).

Todas las voces disponibles para el controlador de minipuerto (hardware, software o alguna combinación de hardware y software) se dividen en dos grupos. El primer grupo, el grupo gratuito, consta de voces que no se confirman en ningún lugar. El segundo grupo, el grupo dinámico, consta de voces confirmadas para su uso por instancias del sintetizador. Estas voces pueden o no estar en uso actualmente por una instancia de sintetizador. El grupo dinámico tiene el tamaño máximo de voces solicitadas por cualquier instancia del sintetizador, sujeto al contenido actual del grupo libre. Los búferes de DirectSound se quitan del grupo libre tras la asignación y se devuelven en la desasignación.

La tabla siguiente contiene una secuencia de ejemplo de asignaciones de voz que ilustran el esquema en la práctica.

Time Solicitud Grupo gratuito Grupo dinámico Acción del controlador de minipuerto

T0

Encendido

64

0

Inicializar.

T1

DSound (4)

60

0

Asigne estáticamente cuatro voces a los búferes de DirectSound.

T2

Synth (32)

28

32

Aumente el grupo dinámico a 32 voces.

T3

Synth (24)

28

32

No sucede nada. Ya hay más de 24 voces en el grupo dinámico.

T4

DSound (24)

4

32

Asigne estáticamente 24 voces a los búferes de DirectSound.

T5

Synth (48)

0

36

Aumente el grupo dinámico a 36 voces. (El método que crea el puerto devuelve S_FALSE y establece DMUS_PORTPARAMS. dwVoices = 36.)

T6

DSound (10)

0

36

Error. No hay voces en la piscina gratuita.

T7

DSound (-5)

5

36

Libera cinco voces. Tenga en cuenta que estos no vuelven al grupo dinámico, aunque la última solicitud (en el momento T5) fuera para más de lo concedido.

Tenga en cuenta que los búferes de DirectSound se asignan uno por uno y se agrupan en la tabla con el fin de mejorar la legibilidad.

Inmediatamente después de crear una instancia de anclaje de sintetizador, no se debe asignar ninguna voz en función de ella. Poco después de la creación, se recibe un elemento de propiedad KSPROPERTY_SYNTH_PORTPARAMETERS . Este elemento de propiedad indica, entre otras cosas, el número de voces que se van a asociar a esta instancia. Este elemento también ofrece al controlador de minipuerto la posibilidad de notificar el nuevo tamaño real del grupo dinámico en caso de que no se puedan asignar todas las voces solicitadas.