다음을 통해 공유


WavePci 대기 시간

WavePci 포트 드라이버는 WaveCyclic 드라이버와 다르게 오디오 스트림의 버퍼링을 처리합니다.

WavePci 미니포트 드라이버가 하드웨어 혼합을 제공하는 경우 DirectSound는 단일 순환 버퍼에 전체 DirectSound 웨이브 스트림이 포함된 WavePci 포트 드라이버에 IRP를 제출합니다. DirectSound는 버퍼를 가상 메모리의 연속 블록으로 할당합니다. DirectSound 버퍼를 복사하지 않도록 커널 스트리밍 계층은 버퍼를 커널 모드 가상 메모리에 매핑하고 순환 버퍼에서 메모리 페이지의 가상 주소와 실제 주소를 모두 지정하는 MDL(메모리 설명자 목록)을 생성합니다. WavePci 포트 드라이버는 순환 버퍼를 할당자 프레임 시퀀스로 분할합니다(KS 할당자 참조). 미니포트 드라이버는 스트림 초기화 중에 포트 드라이버에서 IMiniportWavePciStream::GetAllocatorFraming 메서드를 호출할 때 기본 할당자 프레임 크기를 지정합니다. 그러나 시스템 그래프 작성기인 SysAudio는 오디오 필터 그래프에서 다른 구성 요소의 요구 사항을 수용하기 위해 미니포트 드라이버의 기본 설정을 재정의할 수 있습니다.

WavePci 포트 드라이버는 미니포트 드라이버에 주기적 버퍼를 매핑 시퀀스로 노출합니다. 매핑은 전체 할당 프레임 또는 프레임의 일부입니다. 특정 할당 프레임이 페이지 내에 완전히 있는 경우 포트 드라이버는 해당 프레임을 미니포트 드라이버에 단일 매핑으로 표시합니다. 할당 프레임이 하나 이상의 페이지 경계에 걸쳐 있는 경우 포트 드라이버는 각 페이지 경계에서 프레임을 분할하고 둘 이상의 매핑으로 표시합니다. IPortWavePciStream::GetMapping에 대한 각 호출은 시퀀스에서 다음 연속 매핑을 생성합니다.

미니포트 드라이버가 하드웨어에서 버퍼링되는 데이터 수(밀리초)를 거의 제어하지 않는 WaveCyclic 사례와 달리 WavePci 미니포트 드라이버는 언제든지 열려 있는 매핑 수를 상당히 제어합니다. 열려 있는 매핑 수는 GetMapping 호출마다 하나씩 증가하고 ReleaseMapping 호출마다 하나씩 감소합니다. (A GetMapping 호출은 물론 실패할 수 있으므로 드라이버는 매핑 수를 완전히 제어할 수 없습니다.) 미해결 매핑 수를 제어하고 매핑의 누적 크기를 추적하여 미니포트 드라이버는 하드웨어에서 사용할 수 있는 버퍼링의 밀리초 수를 (매핑 크기에 따라 허용 오차 내에서) 결정할 수 있습니다. WavePci 미니포트 드라이버는 기아의 가능성을 허용 가능한 수준으로 줄이기 위해 충분한 페이지 매핑을 요청해야 합니다.

미니포트 드라이버의 정책이 읽기 및 쓰기 포인터 간에 최대 50밀리초의 데이터를 버퍼링하는 경우 이 제한은 드라이버가 누적할 최대 데이터 양을 나타내지만 스트림 대기 시간에 대한 드라이버의 기여를 나타내지 않으며 나타내서는 안 됩니다. 드라이버는 대기 시간을 최대한 작게 유지하도록 설계해야 합니다. 미니포트 드라이버가 새 스트림 재생을 시작하기 전에 초기 매핑 집합을 가져오는 경우 미니포트 드라이버는 버퍼 제한(이 예제에서는 50밀리초)에 도달하거나 더 이상 매핑을 즉시 사용할 수 없을 때까지 매핑을 계속 요청할 수 있습니다. 그러나 후자의 경우 미니포트 드라이버는 스트림 재생을 시작하기 전에 더 많은 매핑을 사용할 수 있게 될 때까지 기다리지 않아야 합니다. 대신, 드라이버는 이미 얻은 매핑을 즉시 재생하기 시작해야 합니다. 나중에 더 많은 매핑을 사용할 수 있게 되면 드라이버는 버퍼 크기 제한에 도달하거나 더 이상 매핑을 즉시 사용할 수 없을 때까지 추가 매핑을 계속 획득할 수 있습니다.

일반적으로 WavePci 디바이스의 DMA 하드웨어는 임의의 바이트 맞춤에 저장되고 물리적 메모리의 인접하지 않은 페이지 사이의 경계를 가로지르는 오디오 프레임에 직접 액세스하도록 설계되어야 합니다. 매핑이 정수의 오디오 프레임이어야 하는 디바이스가 있는 경우 해당 디바이스는 지원하는 오디오 형식의 종류로 제한됩니다. 물론 이 제한이 있는 디바이스는 여전히 2의 강력한 오디오 프레임 크기를 처리할 수 있어야 합니다.

예를 들어 채널이 4개이고 샘플 크기가 16비트인 디바이스에는 8바이트의 오디오 프레임 크기가 필요합니다. 정수의 오디오 프레임은 페이지(또는 8바이트의 배수인 다른 할당 프레임 크기) 내에 깔끔하게 맞습니다. 그러나 16비트 샘플이 있는 5.1 채널 스트림의 경우 오디오 프레임 크기는 12바이트이고 단일 페이지의 크기를 초과하는 스트림에는 페이지 경계를 가로지르는 오디오 프레임이 포함되어야 합니다. (의 그림 웨이브 필터는 이 문제를 보여 줍니다 .) 임의의 바이트 맞춤 및 임의의 바이트 길이 매핑을 처리할 수 없는 하드웨어는 중간 복사를 수행하려면 드라이버에 따라 성능이 저하됩니다.

Microsoft WDK(Windows 드라이버 키트)의 Ac97 샘플 어댑터 드라이버는 GetAllocatorFraming 메서드를 구현합니다. 미니포트 드라이버는 이 메서드를 사용하여 기본 프레임 할당 크기를 전달합니다. Windows 2000 및 Windows Me에서 포트 드라이버는 스플리터 시스템 드라이버(Splitter.sys)가 출력 핀 위로 인스턴스화된 경우에만 이 메서드를 호출합니다. Windows XP 이상에서 포트 드라이버는 입력 스트림에 대해서도 이 메서드를 호출합니다. SysAudio는 프레임 할당 크기를 결정할 때 미니포트 드라이버의 기본 설정을 무시하도록 선택할 수 있습니다.