다음을 통해 공유


WaveCyclic 대기 시간

WaveCyclic 미니포트 드라이버가 오디오 재생 스트림의 하드웨어 혼합을 제공하는 경우 DirectSound는 단일 순환 버퍼에 전체 DirectSound 웨이브 스트림이 포함된 WaveCyclic 포트 드라이버에 IRP를 제출합니다. WaveCyclic 포트 드라이버는 IRP를 수신하고 웨이브 데이터를 드라이버가 노출하는 DMA 버퍼에 하나씩 공급합니다. WaveCyclic은 DMA 버퍼의 쓰기 포인터를 읽기 포인터보다 약 40밀리초 앞서 유지하려고 시도합니다. 드라이버가 DirectSound와 하드웨어 혼합을 수행하는 경우에도 DMA 버퍼에 약 40밀리초의 추가 데이터를 예상할 수 있습니다.

WaveCyclic 포트 드라이버가 순환 버퍼에 최대 40밀리초의 데이터를 누적하려고 한다는 사실이 WaveCyclic 포트 드라이버가 스트림의 대기 시간에 40밀리초를 추가한다는 것을 의미하지는 않습니다. 실제로 포트 드라이버는 대기 시간을 거의 추가하지 않습니다. 새 스트림이 재생되기 직전에 포트 드라이버가 여전히 초기 데이터를 순환 버퍼의 시작 부분에 쓰는 동안 포트 드라이버는 더 이상 데이터를 사용할 수 없거나 버퍼에 전체 40밀리초의 데이터가 포함될 때까지 계속 작성합니다. 그러나 이 데이터 양을 즉시 사용할 수 있는 경우 포트 드라이버는 미니포트 드라이버가 강제로 대기하지 않습니다. 대신 미니포트 드라이버가 이미 버퍼링된 데이터를 즉시 재생하기 시작할 수 있습니다. 나중에 더 많은 데이터를 사용할 수 있게 되면 포트 드라이버는 더 이상 데이터를 사용할 수 없거나 읽기 및 쓰기 포인터 간에 버퍼링된 데이터의 양이 40밀리초에 도달할 때까지 버퍼에 데이터를 계속 기록합니다.

거의 기아의 기간 후, KMixer 스트림은 침묵의 간격을 포함 할 수 있습니다. WaveCyclic이 DMA 버퍼에서 40밀리초가 아닌 30밀리초의 추가 데이터를 유지하기 위해 KMixer에서 충분한 웨이브 데이터만 수신한 경우 WaveCyclic은 KMixer에서 유효한 데이터가 종료된 후 DMA 버퍼에 무음 쓰기를 시작합니다. 이 정책은 고갈이 발생하고 디바이스가 유효한 데이터의 끝을 지나 읽는 경우 오디오 디바이스가 부실하거나 초기화되지 않은 데이터 대신 침묵을 렌더링하도록 합니다.

DMA 버퍼에 기록된 무음의 양은 상당히 작게 유지되며, KMixer가 무음이 재생되기 전에 WaveCyclic 포트 드라이버에 추가 데이터를 제공하는 데 성공하면 해당 데이터는 버퍼의 침묵을 덮어씁니다. 고갈이 없는 경우 오디오 장치는 강제 침묵 간격 없이 혼합 데이터의 연속 스트림을 수신합니다. 그러나 드라이버를 디버깅할 때 오디오 렌더러가 부족하지 않더라도 미니포트 드라이버의 IMiniportWaveCyclicStream::Silence 메서드가 호출되는 것을 볼 수 있습니다.