Распределение голосов

Большинство драйверов адаптеров, содержащих минипорт-драйвер синтезатора, также содержат аппаратное ускорение DirectSound. Это поднимает вопрос о распределении голосов между голосами синтезатора и аппаратно ускоренными буферами DirectSound.

Синтезаторы DirectMusic — как оборудование, так и программное обеспечение — должны поддерживать несколько экземпляров с целью максимального увеличения числа одновременно обслуживаемых клиентов. Автор синтезатора может поддаться искушению выделять голоса для синт статически, но, вероятно, следует рассматривать все доступные экземпляры синтезаторов как использующие общий динамический пул голосов. Затем каждый экземпляр сообщает доступное количество голосов в качестве общего числа, доступного в пуле.

При выполнении этого метода даже аппаратный синтезатор с ограниченным числом голосов может поддерживать множество экземпляров синта. В режиме реального времени вызов STATS сообщает клиенту о том, сколько голосов использует каждый экземпляр в настоящее время. Если динамический пул истощен и экземпляр синта требует нового голоса, то этот экземпляр синта должен реализовать схему кражи голоса, чтобы освободить голос из этого экземпляра.

Следующая схема распределения основана на идее, что голоса, используемые синтезатором, легче распределять, чем буферы DirectSound, так как драйвер управляет тем, какие данные передаются в какой голос, и может принимать решения о перехвате голоса (описано в спецификации уровня 1 DLS).

Все голоса, доступные минипорт драйверу (оборудованию, программному обеспечению или некоторому сочетанию оборудования и программного обеспечения), делятся на два пула. Первый пул, бесплатный пул, состоит из голосов, которые не закреплены нигде. Второй пул, динамический пул, состоит из голосов, которые предназначены для использования экземплярами синтезатора. Эти голоса могут как использоваться, так и не использоваться экземпляром синтезатора. Динамический пул имеет размер как максимальное количество голосов, запрашиваемых любым экземпляром синтезатора, при условии текущего содержимого свободного пула. Буферы DirectSound удаляются из свободного пула при выделении и возвращаются при размещении сделки.

В следующей таблице содержится пример последовательности голосовых присвоений, который иллюстрирует схему на практике.

Время Просьба Бесплатный пул Динамический пул Действие драйвера минипорта

T0

Активировать

64

0

Инициализировать.

Т1

DSound (4)

шестьдесят

0

Статически выделите четыре голоса для буферов DirectSound.

T2

Synth (32)

28

32

Увеличьте динамический пул до 32 голосов.

T3

Synth (24)

28

32

Никаких действий не выполняется. В динамическом пуле уже более 24 голосов.

T4

DSound (24)

4

32

Статически выделяет 24 голоса для буферов DirectSound.

T5

Synth (48)

0

36

Увеличьте динамический пул до 36 голосов. (Метод, создающий порт, возвращает S_FALSE и задает DMUS_PORTPARAMS. dwVoices = 36.)

T6

DSound (10)

0

36

Провал Нет голосов в бесплатном пуле.

T7

DSound (-5)

5

36

Пять бесплатных голосов. Обратите внимание, что они не возвращаются в динамический пул, хотя последний запрос (на момент T5) был на большее количество, чем было предоставлено.

Обратите внимание, что буферы DirectSound на самом деле выделяются по одному и группируются в таблице в целях удобочитаемости.

Сразу после создания экземпляра пин-кода синтезатора голос не должен быть выделен на его основе. Вскоре после создания получен элемент свойств KSPROPERTY_SYNTH_PORTPARAMETERS. Этот элемент свойства указывает, помимо прочего, количество голосов, связанных с этим экземпляром. Этот элемент также дает минипорт-драйверу возможность сообщать о фактическом новом размере динамического пула, если не удается выделить все запрошенные голоса.