Поддержка сочетания двух- и 3D-контактов
Если ваш аудиодрайв WDM поддерживает сочетание двухмерных и трехмерных контактов, 3D-контакт может удвоить для использования в качестве двухмерного контакта, но не наоборот. Если для DirectSound требуется двухразовый контакт, он может заменить для этой цели неиспользуемый трехмерный контакт, если он доступен в драйвере. Однако, если DirectSound требует наличия трехмерного закрепления, он продолжает поиск в списке экземпляров контактов драйвера, пока не найдет трехмерный контакт, игнорируя все двухразовые контакты, встречающиеся во время поиска. DirectSound проверяет список фабрик контактов драйвера в том порядке, в котором они перечислены, пока не найдет экземпляр булавки, удовлетворяющий его требованиям.
При создании отчетов о количестве двухмерных контактов драйвер должен указать количество двухмерных экземпляров, а также количество экземпляров 3D-контактов. При создании отчетов о количестве 3D-контактов драйвер должен игнорировать двухмерные контакты и указывать только количество экземпляров 3D-контактов.
Версии DirectSound, которые были распространены с Microsoft Windows 2000 и Windows 98, имеют известные проблемы при работе с фабрикой контактов, которая предоставляет сочетание двухмерных и 3D-контактов. DirectSound неправильно сообщает количество 3D-контактов число экземпляров 2D-контактов плюс количество экземпляров 3D-контактов. Решение этой проблемы заключается в том, чтобы написать драйвер, чтобы разделить 2D и 3D-контакты на две отдельные фабрики контактов. Одна фабрика предоставляет только 2D-контакты, а другая фабрика предоставляет только трехмерные контакты.
При использовании драйверов WDM DirectSound правильно сообщает счетчик двухмерных контактов как сумму счетчиков двухмерных и трехмерных контактов с двух фабрик, а также правильно сообщает число 3D-контактов как количество 3D-контактов из одной фабрики 3D-контактов. При предоставлении отдельных фабрик для двух- и трехмерных контактов драйвер должен перечислить фабрику 2D-контактов перед фабрикой 3D-контактов. Это необходимо, так как, когда DirectSound ищет двухразрядный контакт, он использует первый двух- или трехмерный контакт, который он находит, а DirectSound проверяет фабрики контактов в том порядке, в котором драйвер перечисляет их. Если драйвер сначала перечисляет 3D-фабрику, он рискует, что DirectSound истощит поставки трехмерных контактов, неоправданно используя их вместо двухD-контактов.
Таким образом, если драйвер предоставляет сочетание двух- и трехмерных контактов, он должен следовать следующим правилам для правильной работы в более ранних версиях DirectSound:
Укажите две отдельные фабрики контактов для двух- и 3D-контактов соответственно.
Перечислить фабрику 2D-контактов перед фабрикой 3D-контактов.
Эти обходные пути не нужны в более поздних версиях DirectSound. Описанная выше проблема устранена в Windows Me, Windows XP и более поздних версиях. Он также исправлен в DirectSound 8, который распространяется для использования с более ранними версиями Windows. Благодаря этому исправлению драйвер может безопасно объединять двух- и трехмерные контакты в одной фабрике контактов, а DirectSound будет правильно сообщать о количестве двух- и 3D-контактов. Кроме того, когда DirectSound требует двухD-контактов, он использует трехмерный контакт вместо двухD-контактов только в том случае, если он исчерпал поставки двухD-контактов со всех контактных фабрик.