Требования к фабрике штифтов, не относящейся к PCM

В Windows XP и более поздних версиях и Microsoft Windows Me драйверы, которые играют форматы, отличные от PCM WAVEFORMATEX , должны предоставлять свои контакты, отличные от PCM, в соответствии со следующими рекомендациями.

Во-первых, определите фабрику пинов для неформата PCM данных, отличного от любых фабрик пинов PCM. PCM и не-PCM не могут совместно использовать одну и ту же фабрику пинов с единственным экземпляром, так как единственный экземпляр пина автоматически предоставляется KMixer. Если фабрика контактов поддерживает несколько экземпляров, PCM и не-PCM могут сосуществовать на одной и той же фабрике контактов. Однако в этом случае вы не можете гарантировать, что эти экземпляры пинов доступны клиенту, отличному от PCM, во время выполнения — клиенты PCM, возможно, уже выделили их. Самый безопасный вариант — предоставить отдельный производитель пинов для формата, отличного от PCM.

Чтобы обнаружить и использовать пин-код DirectSound 8, определите эту фабрику контактов, отличных от PCM, в фильтре, который уже поддерживает PCM. В противном случае DirectSound не обнаружит пин-код, отличный от PCM. Это также означает, что устройство, которое вообще не поддерживает PCM, не поддерживает формат, отличный от PCM.

Во-вторых, реализуйте обработчик пересечения данных на пин-коде, отличном от PCM. PortCls предоставляет встроенный обработчик, но этот обработчик по умолчанию всегда выбирает PCM, поэтому следует добавить собственный обработчик для форматов, отличных от PCM. Не следует поддерживать WAVE_FORMAT_PCM в обработчике пересечения для пин-кода, отличного от PCM. Обратите внимание, что этот обработчик можно вызвать с OutputBufferLength 0, в этом случае вызывающая сторона запрашивает только размер предпочтительного диапазона данных, а не сами данные. В этом случае обработчик должен реагировать путем копирования размера диапазона данных, отличного от PCM, в параметр ResultantFormatLength и возвращая STATUS_BUFFER_OVERFLOW. Пример Msvad в комплекте драйверов Windows (WDK) содержит код для подпрограммы DataRangeIntersection , которую можно использовать в качестве примера обработчика. Чтобы протестировать подпрограмму DataRangeIntersection , используйте служебную программу KsStudio для создания экземпляра пин-кода, который сначала вызывает обработчик пересечения, чтобы определить допустимый формат по умолчанию. Чтобы поддерживать формат, отличный от PCM, драйвер должен правильно обрабатывать его в следующих расположениях: