다음을 통해 공유


프리페치 오프셋

WavePci 미니포트 드라이버는 IPreFetchOffset::SetPreFetchOffset 메서드를 호출하여 하드웨어 가속 DirectSound 출력 스트림의 프리페치 오프셋을 지정합니다. 이 오프셋은 오디오 디바이스의 하드웨어 버퍼에 있는 재생 커서에서 쓰기 커서를 분리하는 데이터 바이트 수입니다. 쓰기 커서는 DirectSound 애플리케이션이 다음 사운드 샘플을 안전하게 작성할 수 있는 버퍼 위치를 지정합니다. 재생 커서는 오디오 디바이스에서 현재 재생 중인 소리 샘플의 버퍼 위치를 지정합니다.

DirectSound는 KSPROPERTY_AUDIO_POSITION 속성 요청을 전송하여 WavePci 포트 드라이버에서 재생 및 쓰기 커서의 현재 위치를 쿼리합니다. 이 요청에 대한 응답으로 포트 드라이버는 IMiniportWavePciStream::GetPosition을 호출하여 미니포트 드라이버에서 현재 재생 위치를 가져옵니다. 포트 드라이버에서 쓰기 위치를 결정하는 방법은 SetPreFetchOffset 이 호출되었는지 여부에 따라 달라집니다.

기본적으로 포트 드라이버는 미니포트 드라이버에서 요청한 마지막 매핑에 쓰기 커서를 배치합니다. IPortWavePciStream::GetMapping을 호출할 때마다 기본 프리페치 오프셋이 더 커지게 됩니다. WavePci 미니포트 드라이버가 많은 수의 매핑을 획득하면 기본 오프셋이 매우 커질 수 있습니다.

SetPreFetchOffset을 호출하면 기본값이 재정의됩니다. 이 호출 후 포트 드라이버는 지정된 프리페치 오프셋을 재생 위치에 추가하여 쓰기 위치를 계산합니다(DirectSound 버퍼 끝에 있는 랩어라운드 고려).

미니포트 드라이버는 몇 가지 이유로 많은 수의 매핑을 할당할 수 있습니다. 하나는 시스템 프로세서에서 오디오 작업의 오버헤드를 줄이는 것입니다. 매핑이 많을수록 드라이버는 오디오 디바이스를 데이터와 함께 지속적으로 제공하는 데 필요한 인터럽트 수가 줄어듭니다. 또 다른 이유는 더 많은 매핑을 할당하면 심하게 동작한 디바이스 드라이버가 짧은 기간 동안 시스템을 묶을 때 오디오 재생에 결함이 발생할 가능성이 감소하기 때문입니다.

큰 프리페치 오프셋의 한 가지 문제는 일부 DirectSound 애플리케이션이 재생 및 쓰기 커서의 상대 위치에 대해 혼동될 수 있다는 것입니다. Windows 95/98에서 오디오 VxD는 비교적 작은 프리페치 오프셋을 유지하며, 오프셋이 예상보다 크면 이러한 운영 체제용으로 작성된 DirectSound 애플리케이션이 제대로 실행되지 않을 수 있습니다.

예를 들어 애플리케이션은 DirectSound 버퍼를 상반부와 하반부로 나눈 다음 애플리케이션과 디바이스 간에 두 개의 절반을 "ping pong"할 수 있습니다. 쓰기 커서가 버퍼의 상반부 또는 하반부에 처음 들어가면 버퍼의 절반에 해당하는 데이터 반을 씁니다. 이 체계에서는 재생 커서가 항상 버퍼의 나머지 절반(기록되지 않는 절반)에 배치된다고 가정합니다. 프리페치 오프셋이 버퍼 크기의 절반을 초과하는 경우 이 가정은 올바르지 않습니다. 이 경우 쓰기 커서가 DirectSound 버퍼의 끝에 도달하고 버퍼의 시작 부분으로 래핑되면 재생 커서와 동일한 버퍼의 절반에 있습니다. 애플리케이션이 새 쓰기 커서 위치에 반 버퍼의 데이터를 쓰면 재생 커서 위치를 덮어쓰고 아직 재생되지 않은 데이터가 삭제됩니다.

애플리케이션 자체는 이러한 유형의 오류에 대해 확실히 비난받을 수 있지만 WavePci 미니포트 드라이버는 SetPreFetchOffset 을 호출하여 프리페치 오프셋을 더 작은 값으로 설정하기만 하면 오류 모드를 제거할 수 있습니다.

프리페치 오프셋을 더 작은 값으로 설정하면 결과 쓰기 커서가 재생 커서에 더 가깝게 이동합니다. 프리페치 오프셋을 하드웨어의 FIFO 크기로 설정해야 합니다. 일반적인 프리페치 오프셋은 DMA 엔진의 하드웨어 디자인에 따라 약 64개의 샘플입니다.

특정 이전 DirectSound 애플리케이션과 호환되는 상태를 유지하기 위해 DirectSound는 현재 하드웨어 가속 핀의 쓰기 커서를 10밀리초 단위로 패딩합니다. 안쪽 여백의 양은 나중에 변경될 수 있습니다.

드라이버 수준에서 쓰기 커서 및 재생 커서를 관리하는 방법에 대한 자세한 내용은 오디오 위치 속성을 참조하세요.