Daten Flow im DVD-Navigator

Der DVD-Navigator verfügt über Methoden zum Beenden und Anhalten der Wiedergabe. Diese Methoden sind ähnlich – aber nicht identisch – mit den Stop- und Pause-Methoden in IMediaControl. Hier ist der Unterschied zwischen ihnen:

  • Die IDvdControl2-Methoden ändern, was der DVD-Navigator vom Datenträger liest. Sie ändern nicht den Zustand des Diagramms.
  • Die IMediaControl-Methoden ändern den Zustand des Diagramms. Sie ändern nicht, was der DVD-Navigator vom Datenträger liest. (Es gibt eine wichtige Ausnahme, die im nächsten Abschnitt im Zusammenhang mit der Stop-Methode erläutert wird.)

Beispielsweise gibt die IDvdControl2::P ause-Methode den Befehl Anhang J "Pause _ On" aus, hält den Filtergraphen jedoch nicht an. Die IMediaControl::P ause-Methode hält den Graphen an, gibt jedoch keinen DVD-Befehl aus.

Verwenden Sie im Allgemeinen die Methoden IMediaControl::P ause und Stop anstelle der entsprechenden IDvdControl2-Methoden. Die IMediaControl-Methoden weisen sehr geringe Latenzen auf, während die IDvdControl2-Methoden bis zu zwei Sekunden Wartezeit aufweisen können.

Beenden der Wiedergabe

Das Verhalten von IMediaControl::Stop hängt von einem Flag ab, das Sie mit der IDvdControl2::SetOption-Methode festlegen können.

  • Wenn das _ ResetOnStop-Flag der DVD FALSE lautet, beendet IMediaControl::Stop das Diagramm, ändert jedoch nicht die Domäne des DVD-Navigators. Wenn Sie run erneut aufrufen, wird die Wiedergabe von der aktuellen Position aus fortgesetzt.
  • Wenn DVD _ ResetOnStop true ist, bewirkt IMediaControl::Stop, dass der DVD-Navigator zurückgesetzt wird. Wenn Sie IMediaControl::Run erneut aufrufen, wird der DVD-Navigator aus der First Play-Domäne wiedergegeben, als würden Sie die DVD zum ersten Mal einfügen.

Das _ ResetOnStop-Flag der DVD ist aus Gründen der Kompatibilität mit älteren Anwendungen standardmäßig TRUE. Im Allgemeinen sollten Sie jedoch den Standardwert überschreiben und das Flag auf FALSE festlegen. Der Grund dafür ist, dass bestimmte Ereignisse dazu führen können, dass das Diagramm während der Wiedergabe beendet wird. Wenn sich beispielsweise die Anzeigeauflösung ändert, wird das Filterdiagramm beendet, der Videorenderer wird erneut verbunden und neu gestartet. Wenn DVD _ ResetOnStop true ist, wird die Wiedergabe vom Anfang des Datenträgers neu gestartet. Dies ist wahrscheinlich nicht das, was der Benutzer erwartet.

Rufen Sie daher am Anfang der Anwendung SetOption auf, wobei DVD _ ResetOnStop auf FALSE festgelegt ist. Wenn Sie die Wiedergabe beenden und von derselben Position fortsetzen möchten, rufen Sie IMediaControl::Stop oder IMediaControl::P ause auf. Wenn Sie die Wiedergabe beenden und den Datenträger zurücksetzen möchten, rufen Sie SetOption mit DVD _ ResetOnStop gleich TRUE auf. Rufen Sie dann IMediaControl::Stop auf. Rufen Sie abschließend Erneut SetOption auf, und setzen Sie DVD _ ResetOnStop auf FALSE zurück.

Anhalten der Wiedergabe

Wenn Sie dem DVD-Navigator einen Befehl geben, während das Diagramm angehalten wird, wird der Befehl möglicherweise erst abgeschlossen, wenn der Graph erneut ausgeführt wird. In einigen Situationen kann dies zu einem Deadlock in Ihrer Anwendung führen. Es gibt zwei Regeln, die Sie befolgen sollten, um Deadlocks zu vermeiden:

  • Geben Sie während der Pause nicht mehr als einen asynchronen DVD-Befehl aus.
  • Blockieren Sie beim Anhalten nicht den UI-Thread der Anwendung oder den Thread, der den Zustand des Diagramms ändert.

Die zweite Regel sollte ausführlicher untersucht werden. Im Folgenden finden Sie einige spezifische Szenarien, die einen Deadlock verursachen können:

  • Szenario: Während der Pause gibt die Anwendung einen DVD-Befehl mit dem Blockierungsflag aus. Dies kann zu einem Deadlock führen, wenn der Thread, der den DVD-Befehl ausgibt, derselbe Thread ist, der den Ausführungsbefehl ausgibt. Der DVD-Befehl wird blockiert, bis das Diagramm ausgeführt wird, aber das Diagramm kann erst ausgeführt werden, wenn der Befehl abgeschlossen ist.

    Empfehlung: Geben Sie den DVD-Befehl für einen separaten Arbeitsthread aus, oder verwenden Sie nicht das Blockierungsflag.

  • Szenario: Während die Anwendung angehalten ist, gibt sie einen DVD-Befehl aus und ruft dann IDvdCmd::WaitForEnd für das Befehlsobjekt auf. Diese Situation entspricht dem vorherigen Beispiel. Wenn Sie Wait über den UI-Thread aufrufen, kann der UI-Thread das Diagramm erst ausführen, nachdem die Blockierung der Wait-Methode aufgehoben wurde, aber die Wait-Methode wird die Blockierung nicht aufheben, bis das Diagramm ausgeführt wird.

    Empfehlung: Rufen Sie Wait für einen Arbeitsthread auf.

  • Szenario: Während das Diagramm ausgeführt wird, gibt die Anwendung einen DVD-Befehl mit dem Blockierungsflag aus und ruft dann pause von einem anderen Thread auf. Dies ist eine mögliche Racebedingung, da das Diagramm möglicherweise angehalten wird, bevor der Befehl ausgegeben wird. Wenn einer der beiden Threads der UI-Thread ist, können Sie einen Deadlock verursachen, der den beiden vorherigen Beispielen ähnelt. In diesem Beispiel wird veranschaulicht, wie wichtig das Schreiben von threadsicherem Code ist, wenn Ihre Anwendung mehrere Threads verwendet.

    Empfehlung: Wenn Sie Arbeitsthreads verwenden, stellen Sie sicher, dass Ihr Code threadsicher ist.

  • Szenario: Während die Anwendung angehalten wurde, deaktiviert sie den Ausführungsbefehl über die Benutzeroberfläche und gibt dann einen asynchronen DVD-Befehl aus. Dieser Fall ist kein Deadlock, da der Anwendungsthread noch ausgeführt wird. Allerdings wird der Benutzer jetzt daran gehindert, den Graphen auszuführen, und daher wird der Befehl nie abgeschlossen.

    Empfehlung: Lassen Sie beim Anhalten immer den Ausführungsbefehl aktiviert.

Suchen einer DVD zu einer angegebenen Zeit

Um genau nach einer angegebenen Zeit auf einem Datenträger zu suchen, rufen Sie IMediaControl::Runauf. Rufen Sie dann IDvdControl2::P layAtTimeauf, und geben Sie die Uhrzeit an, und legen Sie dwFlags auf DVD _ CMD _ FLAG Flush _ fest.

DVD-Anwendungen