Data Flow dans le NAVIGATEUR DE DVD
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
Le NAVIGATEUR DE DVD a des méthodes pour arrêter et suspendre la lecture. Ces méthodes sont similaires, mais pas identiques, aux méthodes Stop et Pause dans IMediaControl. Voici la différence entre eux :
- Les méthodes IDvdControl2 modifient ce que le navigateur DVD lit à partir du disque. Ils ne modifient pas l’état du graphe.
- Les méthodes IMediaControl modifient l’état du graphique. Ils ne modifient pas ce que le NAVIGATEUR DVD lit à partir du disque. (Il existe une exception importante, expliquée dans la section suivante, liée à la méthode Stop .)
Par exemple, la méthode IDvdControl2::P ause émet la commande Annexe J « Pause_On », mais ne suspend pas le graphe de filtre. La méthode IMediaControl::P ause , en revanche, interrompt le graphique, mais n’émet aucune commande DVD.
En général, utilisez les méthodes IMediaControl::P ause et Stop au lieu des méthodes IDvdControl2 correspondantes. Les méthodes IMediaControl ont des latences très faibles, tandis que les méthodes IDvdControl2 peuvent avoir jusqu’à deux secondes de latence.
Arrêt de la lecture
Le comportement de IMediaControl::Stop dépend d’un indicateur que vous pouvez définir avec la méthode IDvdControl2::SetOption .
- Si l’indicateur DVD_ResetOnStop a la valeur FALSE, IMediaControl::Stop arrête le graphe, mais ne modifie pas le domaine du NAVIGATEUR DE DVD. Lorsque vous appelez à nouveau exécuté, la lecture reprend à partir de la position actuelle.
- Si DVD_ResetOnStop a la valeur TRUE, IMediaControl::Stop entraîne la réinitialisation du NAVIGATEUR DVD. Lorsque vous appelez à nouveau IMediaControl::Run , le NAVIGATEUR DVD est lu à partir du domaine Première lecture, comme si vous insériez le DVD pour la première fois.
L’indicateur DVD_ResetOnStop est TRUE par défaut, pour la compatibilité avec les applications plus anciennes. En règle générale, toutefois, vous devez remplacer la valeur par défaut et définir l’indicateur sur FALSE. La raison en est que certains événements peuvent entraîner l’arrêt du graphique pendant la lecture. Par exemple, si la résolution d’affichage change, le graphique de filtre s’arrête, reconnecte le convertisseur vidéo et redémarre. Si DVD_ResetOnStop a la valeur TRUE, la lecture redémarre à partir du début du disque. Ce n’est probablement pas ce que l’utilisateur attend.
Par conséquent, au début de votre application, appelez SetOption avec DVD_ResetOnStop défini sur FALSE. Si vous souhaitez arrêter la lecture et la reprendre à partir du même emplacement, appelez IMediaControl::Stop ou IMediaControl::P ause. Si vous souhaitez arrêter la lecture et réinitialiser le disque, appelez SetOption avec DVD_ResetOnStop égal à TRUE ; puis appelez IMediaControl::Stop; enfin, appelez à nouveau SetOption et réinitialisez DVD_ResetOnStop sur FALSE.
Suspension de la lecture
Si vous attribuez une commande au Navigateur de DVD pendant que le graphique est suspendu, la commande peut ne pas se terminer tant que le graphique ne s’exécute pas à nouveau. Dans certaines situations, cela peut entraîner un blocage dans votre application. Vous devez suivre deux règles pour éviter les blocages :
- En pause, n’émettez pas plusieurs commandes DE DVD asynchrones.
- Pendant la pause, ne bloquez pas le thread d’interface utilisateur de l’application ou le thread qui modifie l’état du graphique.
La deuxième règle mérite d’être examinée plus en détail. Voici quelques scénarios spécifiques qui peuvent provoquer un blocage :
Scénario : en pause, l’application émet une commande DVD avec l’indicateur de blocage. Cela peut entraîner un blocage si le thread qui émet la commande DVD est le même thread que celui qui émet la commande d’exécution. La commande DVD se bloque jusqu’à ce que le graphique s’exécute, mais le graphe ne peut pas s’exécuter tant que la commande n’est pas terminée.
Recommandation : Émettez la commande DVD sur un thread de travail distinct ou n’utilisez pas l’indicateur de blocage.
Scénario : en pause, l’application émet une commande DVD, puis appelle IDvdCmd::WaitForEnd sur l’objet de commande. Cette situation est équivalente à l’exemple précédent. Si vous appelez Wait à partir du thread d’interface utilisateur, le thread d’interface utilisateur ne peut pas exécuter le graphique tant que la méthode Wait ne se débloque pas, mais la méthode Wait ne se débloquera pas tant que le graphe n’est pas exécuté.
Recommandation : Appelez Wait sur un thread worker.
Scénario : pendant l’exécution du graphe, l’application émet une commande DVD avec l’indicateur de blocage, puis appelle la pause à partir d’un autre thread. Il s’agit d’une condition de course possible, car le graphe peut s’interrompre avant l’émission de la commande. Si l’un des deux threads est le thread d’interface utilisateur, vous pouvez provoquer un blocage similaire aux deux exemples précédents. Cet exemple illustre l’importance d’écrire du code thread-safe si votre application utilise plusieurs threads.
Recommandation : Si vous utilisez des threads de travail, vérifiez que votre code est thread-safe.
Scénario : pendant la pause, l’application désactive la commande run de l’interface utilisateur, puis émet une commande DVD asynchrone. Ce cas n’est pas strictement un interblocage, car le thread d’application est toujours en cours d’exécution. Toutefois, l’utilisateur n’est désormais pas autorisé à exécuter le graphe et, par conséquent, la commande ne sera jamais terminée.
Recommandation : Lors de la suspension, laissez toujours la commande d’exécution activée.
Recherche d’un DVD à une heure spécifiée
Pour rechercher avec précision une heure spécifiée sur un disque, appelez IMediaControl::Run. Appelez ensuite IDvdControl2::P layAtTime, en spécifiant l’heure et en définissant dwFlags sur DVD_CMD_FLAG_Flush.
Rubriques connexes