DVD Komutlarını Eşitleme
[Bu sayfayla ilişkilendirilmiş özellik, DirectShow, eski bir özelliktir. Yerine MediaPlayer, IMFMediaEngineve Media Foundation 'de Ses/Video Yakalamaalmıştır. Bu özellikler Windows 10 ve Windows 11 için iyileştirilmiştir. Microsoft, mümkün olduğunda, yeni kodun MediaPlayer, IMFMediaEngine ve Media Foundation içindeki Audio/Video Capture yerine DirectShowkullanmasını kesinlikle önerir. Microsoft, mümkünse yeni API'leri kullanmak için eski API'leri kullanan mevcut kodun yeniden yazılmasını önerir.]
DVD komutları her zaman anında tamamlanmaz. Bu nedenle, IDvdControl2 içindeki bazı yöntemler eş zamansızdır. Bunlar, PlayTitlegibi oynatma yöntemlerini ve ShowMenu ve ReturnFromSubmenugibi menü gezinti yöntemlerini içerir. Zaman uyumsuz bir yöntem, komutun tamamlanmasını beklemeden hemen döndürür. Yöntem döndürdüğünde, yöntem başarılı olsa bile diğer olaylar komutun tamamlanmasını engelleyebilir. DirectShow, filtre grafiği olaylarını kullanarak tam eşitleme sağlanmasının yanı sıra hiç eşitleme yapmamaktan başlayarak komutları eşitlemek için çeşitli seçenekler sunar.
Tüm zaman uyumsuz yöntemlerin dwFlags parametresi ve ppCmd parametresi vardır. dwFlags parametresi eşitleme davranışını belirtir ve ppCmd parametresi isteğe bağlı eşitleme nesnesine bir işaretçi döndürür. Farklı davranışlar, bu parametreler için hangi değerleri verdiğinize bağlı olarak sonuçlanır.
senkronizasyon yok
Temel bir DVD oynatma uygulaması için en iyi seçenek, eşitleme sorunlarını görmezden gelmek olabilir. Bazen bir komut başarısız olabilir veya kullanıcı arabirimi güncellenirken hafif gecikebilir, ancak bu hatalar saniyenin kesirleri kadar bir sürede gerçekleşir.
Eşitleme olmadan bir komut vermek için dwFlags parametresinde DVD_CMD_FLAG_None bayrağını ayarlayın ve ppCmd parametresini NULLolarak ayarlayın:
hr = pDVDControl2->PlayTitle(uTitle, DVD_CMD_FLAG_None, NULL);
Engelleme
dwFlags parametresinde EC_DVD_CMD_FLAG_Block bayrağını belirlediğinizde, yöntem komut tamamlanana kadar bekler:
hr = pDVDControl2->PlayTitle(uTitle, EC_DVD_CMD_FLAG_Block, NULL);
Bu bayrak, zaman uyumsuz bir yöntemi zaman uyumlu bir yönteme dönüştürür. Bunun dezavantajı, uygulama iş parçacığı üzerinden yöntemi çağırırsanız kullanıcı arabiriminizin engellenmesidir.
Eşitleme Nesnesi
Zaman uyumsuz yöntemlerin tümü, komutun başlatılmasını veya bitmesini beklemek için kullanabileceğiniz bir eşitleme nesnesi döndürebilir. Bu nesneyi almak için bir IDvdCmd işaretçisinin adresini ppCmd parametresine geçirin:
IDvdCmd *pCmdObj = NULL;
hr = pDVDControl2->PlayTitle(uTitle, DVD_CMD_FLAG_None, &pCmdObj);
Yöntem başarılı olursa, yeni bir IDvdCmd nesnesi döndürür. IDvdCmd::WaitForStart yöntemi komut başlayana kadar engeller ve IDvdCmd::WaitForEnd yöntemi komut bitene kadar engeller. Dönüş değeri komutun durumunu gösterir.
Aşağıdaki kod, daha önce gösterilen EC_DVD_CMD_FLAG_Block bayrağını ayarlamaya işlevsel olarak eşdeğerdir.
IDvdCmd *pCmdObj = NULL;
hr = pDVDControl2->PlayTitle(uTitle, DVD_CMD_FLAG_None, &pCmdObj);
if (SUCCEEDED(hr))
{
// Use pCmdObj to wait for the command to complete.
hr = pCmdObj->WaitToEnd();
pCmdObj->Release();
}
Bu durumda, PlayTitle yöntemi engellemez, ancak uygulama, WaitForEndçağrıldığında engeller.
Komut Durumu Olayları
dwFlags parametresinde DVD_CMD_FLAG_SendEvents bayrağını ayarlarsanız, DVD Gezgini komut başladığında bir EC_DVD_CMD_START olayı ve komut sona erdiğinde bir EC_DVD_CMD_END olayı gönderir.
Olayın lParam2 parametresi, komutun HRESULT dönüş değeridir. Olayın lParam1 parametresi, komutu için eşitleme nesnesini almak için bir yol sağlar. IDvdInfo2::GetCmdFromEvent yöntemine lParam1 geçirirseniz, yöntem eşitleme nesnesinin IDvdCmd arabirimine bir işaretçi döndürür. Daha önce açıklandığı gibi komutun tamamlanmasını beklemek için bu arabirimi kullanabilirsiniz. Ancak özgün IDvdControl2 yönteminde ppCmd parametresi için NULL geçirdiyseniz, DVD Gezgini bir eşitleme nesnesi oluşturmaz ve GetCmdFromEvent E_FAIL döndürür.
Aşağıdaki kod, eşitleme nesnesi olmadan komut durumu olaylarının nasıl kullanılacağını gösterir.
hr = pDVDControl2->PlayTitle(uTitle, DVD_CMD_FLAG_SendEvents, NULL);
// In your event handling code:
switch (lEvent)
{
case EC_DVD_CMD_END:
HRESULT hr2 = (HRESULT)lParam2;
/* ... */
break;
}
Eşitleme nesnesi olmadan, hangi komutun olayla ilişkili olduğunu anlayamayacağınızı unutmayın. Aşağıdaki kodda eşitleme nesnesiyle olayların nasıl kullanılacağı gösterilmektedir. Fikir, eşitleme nesnelerini bir listede depolamak ve EC_DVD_CMD_START veya EC_DVD_CMD_END olayı aldığınızda nesne işaretçilerini karşılaştırmaktır.
IDvdCmd *pCmdObj = NULL;
hr = pDVDControl2->PlayTitle(uTitle, DVD_CMD_FLAG_SendEvents, &pCmdObj);
if (SUCCEEDED(hr))
{
// Store pCmdObj in a list of pending commands.
}
// In your event handling code:
switch (lEvent)
{
case EC_DVD_CMD_END:
{
IDvdCmd *pObj = NULL;
hr = pDvdInfo2->GetCmdFromEvent(lParam, &pObj);
if (SUCCEEDED(hr))
{
// Find this object in your list by comparing IUnknown
// pointers. Assume the following function is defined in
// your application:
IDvdCmd *pPendingObj = GetPendingCommandFromList(pObj);
if (pPendingObj)
{
// Update UI accordingly (not shown).
pPendingObj->Release();
}
pObj->Release();
}
}
break;
}
DVD Gezgini Arabelleklerini Temizleme
Oynatma sırasında DVD Navigator video verilerini arabelleğe alır. Arabelleğe alınan veri miktarı değişir. DVD Gezgini yeni bir video parçasına geçtiğinde, işlem hattında bulunan veriler kaybolmaz, bu nedenle geçiş sorunsuz olur. Varsayılan olarak, DVD Gezgini bir komut yayınladığında, işlem hattındaki verileri temizlemez. Sonuç olarak, arabelleğe alınan veri miktarına bağlı olarak komutun etkisini görebilmeniz için biraz gecikme olabilir. Yanıt hızını artırmak için, DVD_CMD_FLAG_Flush bayrağını ayarlayarak DVD Gezgini'ni temizlemeye zorlayabilirsiniz.
hr = pDVDControl2->PlayTitle(uTitle, DVD_CMD_FLAG_Flush, NULL);
Bu bayrak, bit düzeyinde VEYA kullanılarak daha önce açıklanan herhangi bir bayrakla birleştirilebilir. Temizlemenin bir yan etkisi, bazı videoların kaybolabilmesidir, bu nedenle videoda boşluk olmadığını garanti etmeniz gerekiyorsa bu bayrağı kullanmayın.
İlgili konular