Aliran Data di Navigator DVD

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Navigator DVD memiliki metode untuk menghentikan dan menjeda pemutaran. Metode ini serupa — tetapi tidak identik - dengan metode Berhenti dan Jeda di IMediaControl. Berikut adalah perbedaannya:

  • Metode IDvdControl2 mengubah apa yang dibaca Navigator DVD dari disk. Mereka tidak mengubah status grafik.
  • Metode IMediaControl mengubah status grafik. Mereka tidak mengubah apa yang dibaca DVD Navigator dari disk. (Ada satu pengecualian penting, dijelaskan di bagian berikutnya, terkait dengan metode Stop .)

Misalnya, metode IDvdControl2::P ause mengeluarkan perintah Annex J "Pause_On", tetapi tidak menjeda grafik filter. Metode IMediaControl::P ause , di sisi lain, menjeda grafik tetapi tidak mengeluarkan perintah DVD apa pun.

Secara umum, gunakan metode IMediaControl::P ause dan Stop alih-alih metode IDvdControl2 yang sesuai. Metode IMediaControl memiliki latensi yang sangat kecil, sedangkan metode IDvdControl2 dapat memiliki latensi hingga dua detik.

Menghentikan Pemutaran

Perilaku IMediaControl::Stop tergantung pada bendera yang dapat Anda atur dengan metode IDvdControl2::SetOption .

  • Jika bendera DVD_ResetOnStop FALSE, IMediaControl::Stop menghentikan grafik, tetapi tidak mengubah domain DVD Navigator. Ketika Anda memanggil jalankan lagi, pemutaran dilanjutkan dari posisi saat ini.
  • Jika DVD_ResetOnStop TRUE, IMediaControl::Stop menyebabkan Navigator DVD direset. Saat Anda memanggil IMediaControl::Run lagi, DVD Navigator diputar dari domain First Play, seolah-olah Anda memasukkan DVD untuk pertama kalinya.

Bendera DVD_ResetOnStop TRUE secara default, untuk kompatibilitas dengan aplikasi yang lebih lama. Namun, umumnya, Anda harus mengambil alih default dan mengatur bendera ke FALSE. Alasannya adalah bahwa peristiwa tertentu dapat menyebabkan grafik berhenti selama pemutaran. Misalnya, jika resolusi tampilan berubah, grafik filter berhenti, menyambungkan kembali perender video, dan memulai ulang. Jika DVD_ResetOnStop TRUE, pemutaran akan dimulai ulang dari awal disk. Itu mungkin bukan yang diharapkan pengguna.

Oleh karena itu, di awal aplikasi Anda, panggil SetOption dengan DVD_ResetOnStop diatur ke FALSE. Jika Anda ingin menghentikan pemutaran dan melanjutkan dari lokasi yang sama, panggil IMediaControl::Stop atau IMediaControl::P ause. Jika Anda ingin menghentikan pemutaran dan mengatur ulang disk, panggil SetOption dengan DVD_ResetOnStop sama dengan TRUE; lalu panggil IMediaControl::Stop; terakhir, panggil SetOption lagi dan atur ulang DVD_ResetOnStop ke FALSE.

Menjeda Pemutaran

Jika Anda memberikan perintah kepada Navigator DVD saat grafik dijeda, perintah mungkin tidak selesai sampai grafik berjalan lagi. Dalam beberapa situasi, ini dapat menyebabkan kebuntuan di aplikasi Anda. Ada dua aturan yang harus Anda ikuti untuk menghindari kebuntuan:

  • Saat dijeda, jangan terbitkan lebih dari satu perintah DVD asinkron.
  • Saat dijeda, jangan blokir utas UI aplikasi atau utas yang mengubah status grafik.

Aturan kedua layak diperiksa secara lebih rinci. Berikut adalah beberapa skenario tertentu yang dapat menyebabkan kebuntuan:

  • Skenario: Saat dijeda, aplikasi mengeluarkan perintah DVD dengan bendera pemblokiran. Ini dapat menyebabkan kebuntuan jika utas yang mengeluarkan perintah DVD adalah utas yang sama yang mengeluarkan perintah jalankan. Perintah DVD memblokir hingga grafik berjalan, tetapi grafik tidak dapat berjalan hingga perintah selesai.

    Rekomendasi: Terbitkan perintah DVD pada utas pekerja terpisah, atau jangan gunakan bendera pemblokiran.

  • Skenario: Saat dijeda, aplikasi mengeluarkan perintah DVD, lalu memanggil IDvdCmd::WaitForEnd pada objek perintah. Situasi ini setara dengan contoh sebelumnya. Jika Anda memanggil Tunggu dari utas UI, utas UI tidak dapat menjalankan grafik hingga metode Tunggu membuka blokir, tetapi metode Tunggu tidak akan membuka blokir hingga grafik berjalan.

    Rekomendasi: Panggil Tunggu di utas pekerja.

  • Skenario: Saat grafik berjalan, aplikasi mengeluarkan perintah DVD dengan bendera pemblokiran, lalu memanggil jeda dari utas lain. Ini adalah kemungkinan kondisi balapan karena grafik dapat dijeda sebelum perintah dikeluarkan. Jika salah satu dari dua utas adalah utas UI, Anda dapat menyebabkan kebuntuan yang mirip dengan dua contoh sebelumnya. Contoh ini menggambarkan pentingnya menulis kode thread-safe jika aplikasi Anda menggunakan beberapa utas.

    Rekomendasi: Jika Anda menggunakan utas pekerja, pastikan kode Anda aman untuk utas.

  • Skenario: Saat dijeda, aplikasi menonaktifkan perintah jalankan dari UI, lalu mengeluarkan perintah DVD asinkron. Kasus ini bukan kebuntuan yang ketat, karena utas aplikasi masih berjalan. Namun, pengguna sekarang dicegah menjalankan grafik, dan oleh karena itu perintah tidak akan pernah selesai.

    Rekomendasi: Saat menjeda, selalu biarkan perintah jalankan diaktifkan.

Mencari DVD ke Waktu yang Ditentukan

Untuk mencari waktu tertentu secara akurat pada disk, panggil IMediaControl::Run. Kemudian panggil IDvdControl2::P layAtTime, menentukan waktu dan mengatur dwFlags ke DVD_CMD_FLAG_Flush.

Aplikasi DVD