DVD ナビゲーターのData Flow

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

DVD ナビゲーターには、再生を停止および一時停止する方法があります。 これらのメソッドは、IMediaControlStop メソッドと Pause メソッドと似ていますが、同じではありません。 それらの違いを次に示します。

  • IDvdControl2 メソッドは、DVD ナビゲーターがディスクから読み取る内容を変更します。 グラフの状態は変更されません。
  • IMediaControl メソッドはグラフの状態を変更します。 DVD ナビゲーターがディスクから読み取る内容は変更されません。 ( Stop メソッドに関連して、次のセクションで説明する 1 つの重要な例外があります)。

たとえば、 IDvdControl2::P ause メソッドは Annex J "Pause_On" コマンドを発行しますが、フィルター グラフは一時停止しません。 一方、 IMediaControl::P ause メソッドはグラフを一時停止しますが、DVD コマンドは発行しません。

一般に、対応する IDvdControl2 メソッドではなく、IMediaControl::P ause メソッドと Stop メソッドを使用します。 IMediaControl メソッドの待機時間は非常に小さいのに対し、IDvdControl2 メソッドの待機時間は最大 2 秒です。

再生の停止

IMediaControl::Stop の動作は、IDvdControl2::SetOption メソッドで設定できるフラグによって異なります。

  • DVD_ResetOnStop フラグが FALSE の場合、 IMediaControl::Stop はグラフを停止しますが、DVD ナビゲーターのドメインは変更しません。 run を再度呼び出すと、現在の位置から再生が再開されます。
  • DVD_ResetOnStopが TRUE の場合、 IMediaControl::Stop によって DVD ナビゲーターがリセットされます。 IMediaControl::Run をもう一度呼び出すと、DVD ナビゲーターは初めて DVD を挿入したときと同様に、最初の再生ドメインから再生されます。

DVD_ResetOnStop フラグは、古いアプリケーションとの互換性を確保するために、既定で TRUE です。 ただし、通常は既定値をオーバーライドし、フラグを FALSE に設定する必要があります。 これは、特定のイベントによって、再生中にグラフが停止する可能性があるためです。 たとえば、ディスプレイの解像度が変化した場合、フィルター グラフは停止し、ビデオ レンダラーを再接続して再起動します。 DVD_ResetOnStopが TRUE の場合、ディスクの先頭から再生が再開されます。これはおそらく、ユーザーが期待しているものではありません。

そのため、アプリケーションの開始時に、DVD_ResetOnStop FALSE に設定された SetOption を呼び出 します。 再生を停止し、同じ場所から再開する場合は、 IMediaControl::Stop または IMediaControl::P ause を呼び出します。 再生を停止してディスクをリセットする場合は、 setOptionTRUE DVD_ResetOnStopと同じにして呼び出します。次に 、IMediaControl::Stop を呼び出します。最後に、 SetOption をもう一度呼び出し、DVD_ResetOnStop を FALSE にリセットします。

再生の一時停止

グラフの一時停止中に DVD ナビゲーターにコマンドを指定すると、グラフが再度実行されるまでコマンドが完了しない可能性があります。 状況によっては、アプリケーションでデッドロックが発生する可能性があります。 デッドロックを回避するには、次の 2 つのルールに従う必要があります。

  • 一時停止中は、複数の非同期 DVD コマンドを発行しないでください。
  • 一時停止中は、アプリケーションの UI スレッドまたはグラフの状態を変更するスレッドをブロックしないでください。

2 番目のルールは、詳しく調べる価値があります。 デッドロックを引き起こす可能性がある特定のシナリオを次に示します。

  • シナリオ: 一時停止中に、アプリケーションはブロッキング フラグを使用して DVD コマンドを発行します。 DVD コマンドを発行するスレッドが run コマンドを発行するスレッドと同じ場合、デッドロックが発生する可能性があります。 DVD コマンドはグラフが実行されるまでブロックしますが、コマンドが完了するまでグラフを実行することはできません。

    推奨事項: 別のワーカー スレッドで DVD コマンドを発行するか、ブロック フラグを使用しないでください。

  • シナリオ: 一時停止中に、アプリケーションは DVD コマンドを発行してから、コマンド オブジェクトで IDvdCmd::WaitForEnd を呼び出します。 この状況は、前の例と同じです。 UI スレッドから Wait を 呼び出した場合、 WAIT メソッドがブロック解除されるまで UI スレッドはグラフを実行できませんが、グラフが実行されるまで Wait メソッドはブロックを解除しません。

    推奨事項: ワーカー スレッドで Wait を呼び出します。

  • シナリオ: グラフの実行中に、アプリケーションはブロッキング フラグを使用して DVD コマンドを発行し、別のスレッドから一時停止を呼び出します。 これは、コマンドが発行される前にグラフが一時停止する可能性があるため、競合状態になる可能性があります。 2 つのスレッドのいずれかが UI スレッドの場合は、前の 2 つの例と同様のデッドロックが発生する可能性があります。 この例では、アプリケーションで複数のスレッドを使用する場合に、スレッド セーフなコードを記述することの重要性を示します。

    推奨事項: ワーカー スレッドを使用する場合は、コードがスレッド セーフであることを確認してください。

  • シナリオ: 一時停止中に、アプリケーションは UI から run コマンドを無効にし、非同期 DVD コマンドを発行します。 アプリケーション スレッドがまだ実行されているため、このケースは厳密にはデッドロックではありません。 ただし、ユーザーはグラフの実行を妨げるようになったため、コマンドは完了しません。

    推奨事項: 一時停止するときは、常に run コマンドを有効のままにします。

指定した時刻に DVD をシークする

ディスク上の指定した時刻を正確にシークするには、 IMediaControl::Run を呼び出します。 次に IDvdControl2::P layAtTime を呼び出し、時刻を指定し、 dwFlags を DVD_CMD_FLAG_Flush に設定します。

DVD アプリケーション