AVStream のデバイス ミューテックス

デバイス ミューテックスを使用して、デバイスからフィルターまでの階層内のオブジェクトを同期します。 各 AVStream デバイスには、関連付けられたデバイス ミューテックスが 1 つあります。 フィルター ファクトリとフィルターの両方の作成と破棄は、このミューテックスと同期されます。 特定のプラグ アンド プレイおよび電源管理操作も、このミューテックスと同期されます。 ミニドライバーは、デバイス ミューテックスに関する 2 つの主要な問題に焦点を当てています。

オブジェクト階層は、デバイス ミューテックスが保持されている場合に、デバイスから個々のフィルターまでのみ安定していることが保証されます。 その結果、ミニドライバーは、KsCreateFilterFactoryを呼び出してフィルター ファクトリを手動で作成する前に、デバイス ミューテックスを取得する必要があります。 ミニドライバーは、KsXxxGetFirstChildXxx関数とKsXxxGetNextSiblingXxx関数を呼び出してオブジェクト階層を走査する前に、デバイス ミューテックスも取得する必要があります。

AVStream は、次の要求を受信したときに、ミニドライバーに代わってデバイス ミューテックスを保持します。

デバイス ミューテックスを再帰的に取得できないことに注意してください。 以下の例を考慮してください。 AVStream はスリープ通知を受信します。 前述のように、ミニドライバーに代わってデバイスのミューテックスを取ります。 AVStream がスレッド A のコンテキストでミニドライバーが提供するコールバック ルーチンを呼び出す場合、ミニドライバーはその後、スレッド A でデバイス ミューテックスを取得しようとしてはなりません。そうすると、スレッド A 自体がデッドロックしてしまうためです。

AVStream は、デバイス ミューテックスをすでに保持されている間に、フィルター制御ミューテックスを取得することがよくあります。 したがって、原則として、フィルター 制御ミューテックスを取得したスレッドはその後、デバイス ミューテックスを受け取るべきではありません。

デバイス ミュテックスを操作するには、次の関数を使用します。

KsAcquireDeviceKsReleaseDevice