PCM 以外のピン ファクトリの要件
Windows XP 以降および Microsoft Windows Me では、非 PCM WAVEFORMATEX 形式を再生するドライバーは、次のガイドラインに従って非 PCM ピンを公開する必要があります。
まず、PCM ピン ファクトリとは別に、非 PCM データ形式のピン ファクトリを定義します。 唯一のピン インスタンスが自動的に KMixer に割り当てられるため、PCM と非 PCM は同じ単一インスタンスのピン ファクトリを共有できません。 ピン ファクトリが複数のインスタンスをサポートしている場合、PCM と非 PCM が同じピン ファクトリ上に共存できます。 ただし、この場合、これらのピン インスタンスが実行時に非 PCM クライアントで使用できるかどうかは保証できなく、PCM クライアントがすでにピン インスタンスを割り当てている可能性があります。 最も安全なオプションは、非 PCM 形式に別のピン ファクトリを提供することです。
DirectSound 8 でピンが検出されて使用されるようにするには、すでに PCM をサポートしているフィルター上でこの非 PCM ピン ファクトリを定義します。 そうしないと、DirectSound は非 PCM ピンを検出しません。 これは、PCM をまったくサポートしないデバイスは非 PCM フォーマットをサポートできないことも意味します。
次に、非 PCM ピンにデータ交差ハンドラーを実装します。 PortCls は組み込みハンドラーを提供しますが、このデフォルトのハンドラーは常に PCM を選択するため、非 PCM 形式用の独自のハンドラーを追加する必要があります。 非 PCM ピンの交差ハンドラーでは WAVE_FORMAT_PCM をサポートしないでください。 このハンドラーは、OutputBufferLength を 0 にして呼び出すことができます。この場合、呼び出し元はデータ自体ではなく、優先データ範囲のサイズのみを要求することに注意してください。 この場合、ハンドラーは、非 PCM データ範囲のサイズを ResultantFormatLength パラメーターにコピーし、STATUS_BUFFER_OVERFLOW を返すことで応答する必要があります。 Windows ドライバー キット (WDK) の Msvad サンプルには、サンプル ハンドラーとして使用できる DataRangeIntersection ルーチンのコードが含まれています。 DataRangeIntersection ルーチンをテストするには、KsStudio ユーティリティを使用してピンをインスタンス化します。最初に交差ハンドラーを呼び出して、許容可能なデフォルト形式を決定します。 非 PCM 形式をサポートするには、ドライバーが次の場所で非 PCM 形式を適切に処理する必要があります:
ミニポート ドライバー 方式 Init および NewStream (たとえば、IMiniportWavePci::Init および IMiniportWavePci::NewStream を参照。)
ミニポート ストリーム 方式 SetFormat (たとえば、IMiniportWavePciStream::SetFormatを参照。)