DVD 탐색기에서 Data Flow

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

DVD 탐색기는 재생을 중지하고 일시 중지하는 메서드를 가지고 있습니다. 이러한 메서드는 IMediaControlStopPause 메서드와 비슷하지만 동일하지는 않습니다. 그 차이는 다음과 같습니다.

  • IDvdControl2 메서드는 DVD 탐색기가 디스크에서 읽는 내용을 변경합니다. 그래프의 상태는 변경되지 않습니다.
  • IMediaControl 메서드는 그래프의 상태를 변경합니다. 디스크에서 DVD 탐색기가 읽는 내용을 변경하지 않습니다. ( Stop 메서드와 관련된 다음 섹션에 설명된 한 가지 중요한 예외가 있습니다.)

예를 들어 IDvdControl2::P use 메서드는 부록 J "Pause_On" 명령을 실행하지만 필터 그래프를 일시 중지하지는 않습니다. 반면 IMediaControl::P ause 메서드는 그래프를 일시 중지하지만 DVD 명령을 실행하지는 않습니다.

일반적으로 해당 IDvdControl2 메서드 대신 IMediaControl::P auseStop 메서드를 사용합니다. IMediaControl 메서드는 대기 시간이 매우 적은 반면 IDvdControl2 메서드는 최대 2초의 대기 시간을 가질 수 있습니다.

재생 중지

IMediaControl::Stop의 동작은 IDvdControl2::SetOption 메서드를 사용하여 설정할 수 있는 플래그에 따라 달라집니다.

  • DVD_ResetOnStop 플래그가 FALSE이면 IMediaControl::Stop 은 그래프를 중지하지만 DVD 탐색기 도메인은 변경하지 않습니다. 실행을 다시 호출하면 현재 위치에서 재생이 다시 시작됩니다.
  • DVD_ResetOnStop TRUE이면 IMediaControl::Stop 으로 인해 DVD 탐색기가 다시 설정됩니다. IMediaControl::Run을 다시 호출하면 DVD 탐색기가 처음 DVD를 삽입하는 것처럼 첫 번째 플레이 도메인에서 재생됩니다.

DVD_ResetOnStop 플래그는 이전 애플리케이션과의 호환성을 위해 기본적으로 TRUE 입니다. 그러나 일반적으로 기본값을 재정의하고 플래그를 FALSE로 설정해야 합니다. 그 이유는 특정 이벤트로 인해 재생 중에 그래프가 중지될 수 있기 때문입니다. 예를 들어 디스플레이 해상도가 변경되면 필터 그래프가 중지되고 비디오 렌더러가 다시 연결되고 다시 시작됩니다. DVD_ResetOnStop TRUE이면 디스크의 시작 부분에서 재생이 다시 시작됩니다. 이는 사용자가 기대하는 것과는 다른 것입니다.

따라서 애플리케이션의 시작 부분에서 DVD_ResetOnStop FALSE로 설정된 SetOption을 호출합니다. 재생을 중지하고 동일한 위치에서 다시 시작하려면 IMediaControl::Stop 또는 IMediaControl::P ause를 호출합니다. 재생을 중지하고 디스크를 다시 설정하려면 DVD_ResetOnStop TRUESetOption을 호출합니다. IMediaControl::Stop을 호출합니다. 마지막으로 SetOption을 다시 호출하고 DVD_ResetOnStop FALSE로 다시 설정합니다.

재생 일시 중지

그래프가 일시 중지되는 동안 DVD 탐색기에서 명령을 지정하면 그래프가 다시 실행될 때까지 명령이 완료되지 않을 수 있습니다. 경우에 따라 애플리케이션에서 교착 상태가 발생할 수 있습니다. 교착 상태를 방지하기 위해 따라야 하는 두 가지 규칙이 있습니다.

  • 일시 중지된 동안에는 둘 이상의 비동기 DVD 명령을 실행하지 마세요.
  • 일시 중지된 동안에는 애플리케이션의 UI 스레드 또는 그래프 상태를 변경하는 스레드를 차단하지 마세요.

두 번째 규칙은 좀 더 자세히 살펴볼 가치가 있습니다. 교착 상태를 일으킬 수 있는 몇 가지 특정 시나리오는 다음과 같습니다.

  • 시나리오: 일시 중지된 동안 애플리케이션은 차단 플래그가 있는 DVD 명령을 실행합니다. DVD 명령을 실행하는 스레드가 실행 명령을 실행하는 스레드와 동일한 경우 교착 상태가 발생할 수 있습니다. DVD 명령은 그래프가 실행될 때까지 차단하지만 명령이 완료될 때까지 그래프를 실행할 수 없습니다.

    권장 사항: 별도의 작업자 스레드에서 DVD 명령을 실행하거나 차단 플래그를 사용하지 마세요.

  • 시나리오: 일시 중지된 동안 애플리케이션은 DVD 명령을 실행한 다음 명령 개체에서 IDvdCmd::WaitForEnd 를 호출합니다. 이 상황은 이전 예제와 동일합니다. UI 스레드에서 Wait 를 호출하면 Wait 메서드가 차단 해제될 때까지 UI 스레드에서 그래프를 실행할 수 없지만, 그래프가 실행될 때까지 Wait 메서드는 차단을 해제하지 않습니다.

    권장 사항: 작업자 스레드에서 대기 를 호출합니다.

  • 시나리오: 그래프가 실행되는 동안 애플리케이션은 차단 플래그가 있는 DVD 명령을 실행한 다음 다른 스레드에서 일시 중지를 호출합니다. 이는 명령이 실행되기 전에 그래프가 일시 중지할 수 있기 때문에 가능한 경합 상태입니다. 두 스레드 중 하나가 UI 스레드인 경우 이전 두 예제와 유사한 교착 상태가 발생할 수 있습니다. 이 예제에서는 애플리케이션이 여러 스레드를 사용하는 경우 스레드로부터 안전한 코드를 작성하는 것의 중요성을 보여 줍니다.

    권장 사항: 작업자 스레드를 사용하는 경우 코드가 스레드로부터 안전한지 확인합니다.

  • 시나리오: 일시 중지된 동안 애플리케이션은 UI에서 실행 명령을 사용하지 않도록 설정한 다음 비동기 DVD 명령을 실행합니다. 애플리케이션 스레드가 여전히 실행 중이므로 이 경우는 엄격하게 교착 상태가 아닙니다. 그러나 이제 사용자는 그래프를 실행할 수 없으므로 명령이 완료되지 않습니다.

    권장 사항: 일시 중지할 때 항상 실행 명령을 사용하도록 설정합니다.

지정된 시간에 DVD 검색

디스크에서 지정된 시간을 정확하게 찾으려면 IMediaControl::Run을 호출합니다. 그런 다음 , IDvdControl2::P layAtTime을 호출하여 시간을 지정하고 dwFlags 를 DVD_CMD_FLAG_Flush 설정합니다.

DVD 응용 프로그램