プラグイン ディストリビュータ (PID)
プラグイン ディストリビュータ (PID) は、フィルタ グラフ マネージャの機能を拡張するための方法である。PID は、フィルタ グラフ マネージャが実行時に集成する COM オブジェクトである。アプリケーションは、フィルタ グラフ マネージャを通じて PID へのアクセスを取得する。
フィルタ グラフ マネージャに対して、サポートしないインターフェイスについて照会されると、次のフォーマットを使ってレジストリのキーが検索される。
HKEY_CLASSES_ROOT\Interface\IID\Distributor
IID は、インターフェイス識別子が含まれた文字列である。レジストリにエントリが存在する場合、そのエントリの値によって、インターフェイスをサポートする PID のクラス識別子 (CLSID) が定義される。フィルタ グラフ マネージャは PID を集成し、インターフェイス ポインタを返す。これによって、PID の外部 IUnknown として機能する。アプリケーションがインターフェイス上でメソッドを呼び出すときは、実際には PID 上で呼び出している。しかし、PID の存在はアプリケーションに対しては透過的である。
"ディストリビュータ" という用語は、PID がフィルタ グラフ マネージャのインターフェイスについて、外部 IUnknown ポインタに照会が可能なことに由来している。PID は IFilterGraph::EnumFilters メソッドを呼び出すことで、グラフのフィルタを列挙し、それらのフィルタにメソッドの呼び出しを配布できる。このようにして、PID はアプリケーションがフィルタ上でメソッドを呼び出すための、1 つのコントロール ポイントとしての役割を果たすことができる。
フィルタ グラフ マネージャが PID を集成するときは、IDistributorNotify インターフェイスについて PID に照会する。PID がこのインターフェイスをサポートしている場合、フィルタ グラフ マネージャはこのインターフェイスを使って、グラフでの変更について PID に通知する。
- フィルタ グラフが実行・ポーズ・停止の各状態を切り替える場合には、IDistributorNotify::Run、IDistributorNotify::Pause、または IDistributorNotify::Stop を呼び出す。
- 基準クロックが設定されると、フィルタ グラフ マネージャは IDistributorNotify::SetSyncSource を呼び出す。
- フィルタが追加または削除されたり、ピン接続が変更されると、フィルタ グラフ マネージャは IDistributorNotify::NotifyGraphChange を呼び出す。
カスタム PID を実装するためには、集成をサポートする COM オブジェクトを作成する。このオブジェクトは、フィルタ グラフ マネージャが既にサポートしていないインターフェイスをサポートしなければならない。また、オプションで IDistributorNotify インターフェイスをサポートすることもできる。
PID がフィルタ グラフ マネージャからインターフェイス ポインタを取得する場合は、それらをすぐに解放する必要がある。解放しないと、循環参照カウントが作成され、フィルタ グラフ マネージャの破棄を妨げる可能性がある。いずれの場合も、フィルタ グラフ マネージャが PID の継続時間を制御するため、フィルタ グラフ マネージャでの参照カウントの保持は不要である。
PID はフィルタ グラフ マネージャによる集成化のために設計されているので、PID のコンストラクタ メソッドでこれを設定することもできる。外部 IUnknown ポインタが NULL であるかどうかを確認し、NULL である場合は、エラー コード VFW_E_NEED_OWNER を返す。「エラー コードと成功コード」を参照すること。また、他のオブジェクトが PID を集成化しないようにするため、IGraphBuilder インターフェイスについて 外部 IUnknown ポインタに照会できる。そのオブジェクトが IGraphBuilder を公開していない場合は、エラーコードを返す。