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.