Compartilhar via


Alocação de voz

A maioria dos drivers de adaptador que contêm um driver de miniporto sintetizador também contém aceleração de hardware DirectSound. Isso abre a questão da alocação de voz entre vozes do sintetizador e buffers DirectSound acelerados por hardware.

Os sintetizadores DirectMusic – hardware e software – devem dar suporte a várias instâncias para maximizar o número de clientes simultâneos. Um gravador de sintetizador pode ser tentado a alocar vozes estaticamente para sintetizadores, mas provavelmente deve considerar todas as instâncias disponíveis de sintetizadores como desenhadas de um pool de voz comum e dinâmico. Em seguida, cada instância relata o número disponível de vozes como o número total disponível no pool.

Quando implementado dessa forma, até mesmo um sintetizador de hardware com um número limitado de vozes físicas pode dar suporte a várias instâncias de sintetização. Em tempo real, a chamada STATS informa ao cliente quantas vozes cada instância está usando no momento. Se o pool dinâmico estiver esgotado e uma instância de sintetizador exigir uma nova voz, essa instância de sintetizador deverá implementar um esquema de roubo de voz para liberar uma voz de dentro dessa instância.

O esquema de alocação a seguir baseia-se na ideia de que as vozes usadas por um sintetizador são mais facilmente compartilhadas do que os buffers directSound porque o driver tem controle sobre quais dados vão em qual voz e podem tomar decisões sobre roubo de voz (descrito na especificação de Nível 1 do DLS).

Todas as vozes disponíveis para o driver de miniporta (hardware, software ou alguma combinação de hardware e software) são divididas em dois pools. O primeiro pool, o pool gratuito, consiste em vozes que não são confirmadas em nenhum lugar. O segundo pool, o pool dinâmico, consiste em vozes confirmadas para uso por instâncias do sintetizador. Essas vozes podem ou não estar em uso por uma instância do sintetizador. O pool dinâmico é dimensionado como o número máximo de vozes solicitadas por qualquer instância do sintetizador, sujeito ao conteúdo atual do pool gratuito. Os buffers directSound são removidos do pool livre após a alocação e retornados na desalocação.

A tabela a seguir contém uma sequência de exemplo de alocações de voz que ilustram o esquema na prática.

Hora Solicitação Pool Gratuito Pool Dinâmico Ação do driver de miniporto

T0

Ligar/Ligar

64

0

Inicializar.

T1

DSound (4)

60

0

Alocar estaticamente quatro vozes para buffers DirectSound.

T2

Synth (32)

28

32

Aumente o pool dinâmico para 32 vozes.

T3

Synth (24)

28

32

Nenhuma ação. Já existem mais de 24 vozes no pool dinâmico.

T4

DSound (24)

4

32

Aloque estaticamente 24 vozes para buffers DirectSound.

T5

Synth (48)

0

36

Aumente o pool dinâmico para 36 vozes. (O método que cria a porta retorna S_FALSE e define DMUS_PORTPARAMS. dwVoices = 36.)

T6

DSound (10)

0

36

Falha. Sem vozes na piscina gratuita.

T7

DSound (-5)

5

36

Cinco vozes grátis. Observe que eles não voltam para o pool dinâmico, mesmo que a última solicitação (no momento T5) tenha sido para mais do que foi concedida.

Observe que os buffers directSound são realmente alocados um por um e são agrupados na tabela para fins de legibilidade.

Imediatamente após a criação de uma instância de pin do sintetizador, nenhuma voz deve ser alocada com base nela. Logo após a criação, um item de propriedade KSPROPERTY_SYNTH_PORTPARAMETERS é recebido. Esse item de propriedade indica, entre outras coisas, o número de vozes que devem ser associadas a essa instância. Esse item também dá ao driver de miniporto a chance de relatar o novo tamanho real do pool dinâmico caso todas as vozes solicitadas não possam ser alocadas.