다음을 통해 공유


웨이브 필터

웨이브 필터는 웨이브 형식 디지털 오디오 데이터를 렌더링 및/또는 캡처하는 디바이스를 나타냅니다. 애플리케이션은 일반적으로 DirectSound API 또는 Microsoft Windows 멀티미디어 웨이브OutXxx 및 waveInXxx 함수를 통해 이러한 디바이스의 기능에 액세스합니다. WDM 오디오 드라이버에서 지원할 수 있는 웨이브 형식에 대한 자세한 내용은 WAVEFORMATEX 및 WAVEFORMATEXTENSIBLE 을 참조 하세요.

웨이브 렌더링 필터는 웨이브 디지털 오디오 스트림을 입력으로 수신하고 아날로그 오디오 신호(스피커 또는 외부 믹서 집합) 또는 디지털 오디오 스트림(예: S/PDIF 커넥터)을 출력합니다.

웨이브 캡처 필터는 아날로그 오디오 신호(마이크 또는 입력 잭에서) 또는 디지털 스트림(예: S/PDIF 커넥터에서)으로 수신됩니다. 동일한 필터는 디지털 오디오 데이터를 포함하는 웨이브 스트림을 출력합니다.

단일 웨이브 필터는 렌더링 및 캡처를 동시에 수행할 수 있습니다. 예를 들어 이러한 유형의 필터는 스피커 집합을 통해 오디오를 재생하고 동시에 마이크를 통해 오디오를 녹음할 수 있는 오디오 장치를 나타낼 수 있습니다. 또는 동적 오디오 하위 서비스에 설명된 대로 웨이브 렌더링 및 웨이브 캡처 하드웨어를 별도의 웨이브 필터로 나타낼 수 있습니다.

오디오 어댑터 드라이버는 하드웨어 공급업체가 어댑터 드라이버의 일부로 구현하는 웨이브 미니포트 드라이버를 시스템에서 구현하는 웨이브 포트 드라이버와 바인딩하여 웨이브 필터를 형성합니다. 미니포트 드라이버는 웨이브 필터에 대한 모든 하드웨어 관련 작업을 처리하고 포트 드라이버는 모든 제네릭 웨이브 필터 함수를 관리합니다.

PortCls 시스템 드라이버(Portcls.sys)는 WaveRT, WavePci 및 WaveCyclic의 세 가지 웨이브 포트 드라이버를 구현합니다.

세 가지 유형의 웨이브 필터는 다음과 같이 작동합니다.

  • WaveRT 필터는 웨이브 데이터에 대한 버퍼를 할당하고 사용자 모드 클라이언트에서 해당 버퍼에 직접 액세스할 수 있도록 합니다. 버퍼는 웨이브 디바이스의 하드웨어 기능에 따라 연속되거나 인접하지 않은 메모리 블록으로 구성됩니다. 클라이언트는 가상 메모리의 연속 블록으로 버퍼에 액세스합니다. 버퍼는 주기적이므로 디바이스의 읽기(렌더링용) 또는 쓰기(캡처용) 포인터가 버퍼의 끝에 도달하면 버퍼의 시작 부분에 자동으로 래핑됩니다.

  • WavePci 필터는 클라이언트의 버퍼에 직접 액세스합니다. 클라이언트가 가상 메모리의 연속된 단일 블록으로 버퍼에 액세스하지만 WavePci 필터는 연속되지 않은 일련의 메모리 블록으로 버퍼에 액세스해야 합니다. 렌더링 또는 캡처 스트림의 연속 부분을 포함하는 블록은 디바이스에서 큐에 대기됩니다. 디바이스의 읽기 또는 쓰기 포인터가 한 블록의 끝에 도달하면 큐에서 다음 블록의 시작 부분으로 이동합니다.

  • WaveCyclic 필터는 출력(렌더링용) 또는 입력(캡처용) 버퍼로 사용할 단일 연속 메모리 블록으로 구성된 버퍼를 할당합니다. 이 버퍼는 순환입니다. 버퍼는 클라이언트에서 직접 액세스할 수 없으므로 드라이버는 드라이버의 순환 버퍼와 클라이언트의 사용자 모드 버퍼 간에 데이터를 복사해야 합니다.

WaveRT는 WavePci 및 WaveCyclic보다 선호됩니다. WavePci 및 WaveCyclic은 이전 버전의 Windows에서 사용되었습니다.

WaveRT 필터는 PCI 또는 PCI Express와 같은 시스템 버스에 있는 오디오 디바이스를 나타낼 수 있습니다. WaveCyclic 또는 WavePci 필터에 대한 WaveRT 필터의 주요 이점은 WaveRT 필터를 사용하면 사용자 모드 클라이언트가 오디오 하드웨어와 직접 오디오 데이터를 교환할 수 있다는 것입니다. 반면 WaveCyclic 및 WavePci 필터는 모두 드라이버의 정기적인 소프트웨어 개입이 필요하므로 오디오 스트림의 대기 시간이 증가합니다. 또한 분산/수집 DMA 기능이 있는 오디오 디바이스를 모두 WaveRT 필터로 나타낼 수 있습니다. 자세한 내용은 Real-Time 오디오 스트리밍용 웨이브 포트 드라이버 백서를 참조하세요.

WaveRT 필터

WaveRT 필터는 포트/미니포트 드라이버 쌍으로 구현됩니다. Windows Vista 이상에서 WaveRT 필터 팩터리는 다음과 같이 WaveRT 필터를 만듭니다.

  • WaveRT 미니포트 드라이버 개체를 인스턴스화합니다.

  • GUID 값이 CLSID_PortWaveRTPcNewPort를 호출하여 WaveRT 포트 드라이버 개체를 인스턴스화합니다.

  • 포트 드라이버의 IPort::Init 메서드를 호출하여 미니포트 드라이버를 포트 드라이버에 바인딩합니다.

하위 서비스 만들기의 코드 예제에서는 이 프로세스를 보여 줍니다. 포트 및 미니포트 드라이버는 IPortWaveRTIMiniportWaveRT 인터페이스를 통해 서로 통신합니다.

자세한 내용은 Real-Time 오디오 스트리밍용 웨이브 포트 드라이버 백서를 참조하세요.

이전 버전의 Windows에 대한 정보

이전 버전의 Windows에 대한 WaveCyclic 정보

WaveCyclic 필터는 ISA, PCI, PCI Express 또는 PCMCIA와 같은 시스템 버스에 연결하는 오디오 디바이스를 나타낼 수 있습니다. "WavePci"라는 이름에서 알 수 있듯이 WavePci 필터는 일반적으로 PCI 버스에 연결하는 디바이스를 나타내지만, 원칙적으로 WavePci 디바이스는 ISA 버스에 대신 연결할 수 있습니다. WaveCyclic에서 지원하는 더 간단한 디바이스와 달리 WavePci에서 지원하는 디바이스에는 분산/수집 DMA 기능이 있어야 합니다. PCI 버스에 상주하지만 분산/수집 DMA가 없는 오디오 디바이스는 WaveCyclic 필터로 나타낼 수 있지만 WavePci 필터로 나타낼 수는 없습니다.

이전 버전의 Windows에 대한 WavePci 정보

WavePci 디바이스는 임의의 메모리 주소에 위치할 수 있고 임의의 바이트 맞춤으로 시작하고 끝나는 버퍼 간 분산/수집 DMA 전송을 수행할 수 있습니다. 반면, WaveCyclic 디바이스의 DMA 하드웨어에는 디바이스의 미니포트 드라이버가 할당하는 단일 버퍼로 데이터를 이동하거나 이동하는 기능만 필요합니다. WaveCyclic 미니포트 드라이버는 DMA 채널의 제한된 기능을 충족하는 순환 버퍼를 자유롭게 할당할 수 있습니다. 예를 들어 일반적인 WaveCyclic 디바이스에 대한 DMA 채널에는 다음 제한을 충족하는 버퍼가 필요할 수 있습니다.

  • 버퍼는 실제 주소 공간의 특정 영역에 있습니다.

  • 버퍼는 물리적 및 가상 주소 공간에서 연속됩니다.

  • 버퍼는 4 바이트 또는 8 바이트 경계에서도 시작되고 끝납니다.

그러나 이러한 단순성에 대한 대가로 WaveCyclic 디바이스는 순환 버퍼 간 데이터 소프트웨어 복사에 의존해야 하는 반면, WavePci 디바이스는 DMA 하드웨어의 분산/수집 기능을 사용하여 이러한 복사를 방지해야 합니다. 웨이브 오디오 데이터를 렌더링 디바이스에 전달하거나 캡처 디바이스에서 데이터를 검색하는 IRP에는 데이터 버퍼가 함께 제공되며 이러한 각 버퍼에는 렌더링 또는 캡처되는 오디오 스트림의 일부가 포함됩니다. WavePci 디바이스는 분산/수집 DMA 엔진을 통해 이러한 버퍼에 직접 액세스할 수 있는 반면, WaveCyclic 디바이스는 데이터를 IRP에서 순환 버퍼로 복사하거나 그 반대로 복사해야 합니다.

WavePci 필터

참고: 이전 버전의 Windows에 대한 WavePci 정보

WavePci 필터는 포트/미니포트 드라이버 쌍으로 구현됩니다. WavePci 필터 팩터리는 다음과 같이 WavePci 필터를 만듭니다.

  • WavePci 미니포트 드라이버 개체를 인스턴스화합니다.

  • GUID 값이 CLSID_PortWavePciPcNewPort를 호출하여 WavePci 포트 드라이버 개체를 인스턴스화합니다.

  • 포트 드라이버의 IPort::Init 메서드를 호출하여 미니포트 드라이버를 포트 드라이버에 바인딩합니다.

하위 서비스 만들기의 코드 예제에서는 이 프로세스를 보여 줍니다. 포트 및 미니포트 드라이버는 IPortWavePciIMiniportWavePci 인터페이스를 통해 서로 통신합니다.

자세한 내용은 WavePci 디바이스에 대한 구현 문제를 참조하세요.

WaveCyclic 필터

참고

Microsoft는 다양하고 포괄적인 환경을 지원합니다. 이 문서에는 바이어스 없는 통신을 위한 Microsoft 스타일 가이드 에서 제외로 인식하는 용어에 대한 참조가 포함되어 있습니다. 단어 또는 구는 현재 소프트웨어에 표시되므로 일관성을 위해 이 문서에서 사용됩니다. 언어를 제거하도록 소프트웨어가 업데이트되면 이 문서는 맞춤으로 업데이트됩니다.

참고: 이전 버전의 Windows에 대한 WaveCyclic 정보

WaveCyclic 필터는 포트/미니포트 드라이버 쌍으로 구현됩니다. WaveCyclic 필터 팩터리는 다음과 같이 WaveCyclic 필터를 만듭니다.

  • WaveCyclic 미니포트 드라이버 개체를 인스턴스화합니다.

  • GUID 값이 CLSID_PortWaveCyclicPcNewPort를 호출하여 WaveCyclic 포트 드라이버 개체를 인스턴스화합니다.

  • 포트 드라이버의 IPort::Init 메서드를 호출하여 미니포트 드라이버를 포트 드라이버에 바인딩합니다.

하위 서비스 만들기의 코드 예제에서는 이 프로세스를 보여 줍니다. 포트 및 미니포트 드라이버는 IPortWaveCyclicIMiniportWaveCyclic 인터페이스를 통해 서로 통신합니다.

WaveCyclic 필터의 순환 버퍼는 항상 가상 메모리의 연속 블록으로 구성됩니다. IDmaChannel::AllocateBuffer 메서드의 포트 드라이버 구현은 항상 실제 및 가상 메모리 주소 공간 모두에서 연속되는 버퍼를 할당합니다. 앞에서 설명한 대로 WaveCyclic 디바이스의 DMA 엔진이 버퍼 메모리에 추가 제약 조건을 적용하는 경우 미니포트 드라이버는 이러한 제약 조건을 충족하기 위해 자체 버퍼 할당 방법을 자유롭게 구현할 수 있습니다.

운영 체제가 원래 요청을 거부하는 경우 큰 버퍼(예: 물리적으로 연속된 메모리 페이지 8개)를 요청하는 WaveCyclic 미니포트 드라이버는 더 작은 버퍼 크기에 맞게 준비해야 합니다. 때때로 오디오 디바이스가 시스템 리소스의 균형을 재조정하기 위해 언로드되고 다시 로드될 수 있습니다(디바이스를 리밸런스 리소스로 중지 참조).

버스 마스터링 DMA 하드웨어가 내장된 WaveCyclic 디바이스를 master 디바이스라고 합니다. 또는 WaveCyclic 디바이스는 기본 제공 DMA 하드웨어 기능이 없는 하위 디바이스 일 수 있습니다. 하위 디바이스는 시스템 DMA 컨트롤러를 사용하여 필요한 데이터 전송을 수행해야 합니다. master 및 하위 디바이스에 대한 자세한 내용은 IDmaChannelIDmaChannelSlave를 참조하세요.

WaveCyclic 미니포트 드라이버는 포트 드라이버의 NewXxxDmaChannel 메서드 중 하나에 의해 만들어진 기본 DMA 채널 개체를 사용하는 대신 자체 DMA 채널 개체를 구현할 수 있습니다.

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

어댑터 드라이버의 사용자 지정 IDmaChannel 구현은 특수 하드웨어 제약 조건을 충족하기 위해 데이터의 사용자 지정 처리를 수행할 수 있습니다. 예를 들어 Windows 멀티미디어 함수는 16비트 샘플이 항상 서명된 값인 웨이브 형식을 사용하지만 오디오 렌더링 하드웨어는 서명되지 않은 16비트 값을 대신 사용하도록 설계될 수 있습니다. 이 경우 드라이버의 사용자 지정 IDmaChannel::CopyTo 메서드를 작성하여 서명된 원본 값을 하드웨어에 필요한 서명되지 않은 대상 값으로 변환할 수 있습니다. 이 기술은 하드웨어 디자인 결함을 해결하는 데 유용할 수 있지만 소프트웨어 오버헤드에 상당한 비용이 발생할 수도 있습니다.

자체 DMA 채널 개체를 구현하는 드라이버의 예는 이전 버전의 WDK에서 Sb16 샘플 오디오 어댑터를 참조하세요. 상수 OVERRIDE_DMA_CHANNEL TRUE로 정의되면 소스 코드의 조건부 컴파일 문을 사용하면 IPortWaveCyclic::NewXxxDmaChannel 호출의 기본 IDmaChannel 개체 대신 드라이버가 사용하는 독점 IDmaChannel 개체를 구현할 수 있습니다.