Datenfluss im DVD-Navigator
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]
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 den Zustand des Diagramms nicht.
- Die IMediaControl-Methoden ändern den Zustand des Graphen. Sie ändern nicht, was der DVD-Navigator vom Datenträger liest. (Es gibt eine wichtige Ausnahme, die im nächsten Abschnitt erläutert wird, die sich auf die Stop-Methode bezieht.)
Die IDvdControl2::P ause-Methode gibt beispielsweise den Befehl "Pause_On" in Anhang J aus, hält das Filterdiagramm jedoch nicht an. Die IMediaControl::P ause-Methode hält dagegen das Diagramm 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 kleine Latenzen auf, während die IDvdControl2-Methoden eine Latenz von bis zu zwei Sekunden 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 DVD_ResetOnStop-Flag FALSE ist, beendet IMediaControl::Stop das Diagramm, ändert jedoch nicht die Domäne des DVD-Navigators. Wenn Sie erneut ausführen aufrufen, wird die Wiedergabe von der aktuellen Position 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 von der First Play-Domäne wiedergegeben, als ob Sie die DVD zum ersten Mal einlegen würden.
Das DVD_ResetOnStop-Flag 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 ist, dass bestimmte Ereignisse dazu führen können, dass das Diagramm während der Wiedergabe angehalten wird. Wenn sich beispielsweise die Anzeigeauflösung ändert, wird das Filterdiagramm beendet, der Videorenderer erneut verbunden und neu gestartet. Wenn DVD_ResetOnStop TRUE ist, wird die Wiedergabe vom Anfang des Datenträgers neu gestartet. Das erwartet der Benutzer wahrscheinlich nicht.
Rufen Sie daher am Anfang Ihrer Anwendung SetOption auf, und DVD_ResetOnStop auf FALSE festgelegt. Wenn Sie die Wiedergabe beenden und am gleichen Speicherort 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; Rufen Sie schließlich SetOption erneut auf, und setzen Sie DVD_ResetOnStop auf FALSE zurück.
Anhalten der Wiedergabe
Wenn Sie dem DVD Navigator einen Befehl erteilen, während das Diagramm angehalten wird, wird der Befehl möglicherweise erst abgeschlossen, wenn das Diagramm 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 nicht den UI-Thread der Anwendung oder den Thread, der den Zustand des Diagramms ändert, während sie angehalten sind.
Die zweite Regel sollte genauer untersucht werden. Hier sind einige spezifische Szenarien aufgeführt, die zu einem Deadlock führen können:
Szenario: Während sie angehalten wird, 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 blockiert, bis das Diagramm ausgeführt wird, aber das Diagramm kann nicht ausgeführt werden, bis der Befehl abgeschlossen ist.
Empfehlung: Geben Sie den DVD-Befehl für einen separaten Workerthread aus, oder verwenden Sie nicht das Blockierflag.
Szenario: Während sie angehalten wird, gibt die Anwendung einen DVD-Befehl aus und ruft dann IDvdCmd::WaitForEnd für das Befehlsobjekt auf. Diese Situation entspricht dem vorherigen Beispiel. Wenn Sie Wait aus dem UI-Thread aufrufen, kann der UI-Thread das Diagramm nicht ausführen, bis die Wait-Methode die Blockierung aufgehoben hat. Die Wait-Methode hebt die Blockierung jedoch erst auf, wenn das Diagramm ausgeführt wird.
Empfehlung: Rufen Sie Wait für einen Workerthread auf.
Szenario: Während das Diagramm ausgeführt wird, gibt die Anwendung einen DVD-Befehl mit dem Blockierflag aus und ruft dann die Pause von einem anderen Thread aus. 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 ähnlich den beiden vorherigen Beispielen verursachen. In diesem Beispiel wird veranschaulicht, wie wichtig es ist, threadsicheren Code zu schreiben, wenn Ihre Anwendung mehrere Threads verwendet.
Empfehlung: Wenn Sie Workerthreads verwenden, stellen Sie sicher, dass Ihr Code threadsicher ist.
Szenario: Während sie angehalten wird, deaktiviert die Anwendung den Ausführungsbefehl auf der Benutzeroberfläche und gibt dann einen asynchronen DVD-Befehl aus. Dieser Fall ist kein Deadlock, da der Anwendungsthread weiterhin ausgeführt wird. Allerdings wird der Benutzer jetzt daran gehindert, das Diagramm auszuführen, sodass der Befehl nie abgeschlossen wird.
Empfehlung: Lassen Sie beim Anhalten immer den Ausführungsbefehl aktiviert.
Suchen einer DVD zu einer bestimmten Zeit
Rufen Sie IMediaControl::Run auf, um eine bestimmte Zeit auf einem Datenträger genau zu suchen. Rufen Sie dann IDvdControl2::P layAtTime auf, geben Sie die Uhrzeit an und legen Sie dwFlags auf DVD_CMD_FLAG_Flush fest.
Zugehörige Themen