다음을 통해 공유


WaveRT 미니포트 드라이버 개발

이 항목에서는 고유한 WaveRT 미니포트 드라이버를 개발하기로 결정할 때 고려해야 하는 소프트웨어 및 하드웨어 관련 사항을 설명합니다.

Microsoft는 UAA(유니버설 오디오 아키텍처) 에 대한 일련의 하드웨어 디자인 지침을 개발했으며, 지침에는 WaveRT 오디오 디바이스에 권장되는 기능이 통합되어 있습니다. UAA 지침은 Intel에서 개발한 HD(고화질) 오디오 사양을 기반으로 합니다.

Windows Vista 이상 Windows 운영 체제는 UAA 규격 오디오 디바이스용 HD 오디오 드라이버를 제공합니다. 따라서 오디오 디바이스가 UAA 규격인 경우 고유한 WaveRT 미니포트 드라이버를 개발할 필요가 없습니다. 그러나 일부 독점적인 비 UAA 하드웨어 기능이 있는 오디오 디바이스의 경우 독점 기능을 지원하도록 자체 WaveRT 미니포트 드라이버를 개발해야 합니다.

고유한 WaveRT 미니포트 드라이버를 개발하는 데 도움이 되도록 먼저 샘플 어댑터 드라이버를 검토한 다음 WaveRT 친화적인 UAA 기능을 검토하는 것이 좋습니다.

샘플 어댑터 드라이버

샘플 드라이버에 대한 자세한 내용은 샘플 오디오 드라이버를 참조하세요.

WaveRT 친화적인 기능

샘플 어댑터 드라이버를 검토하고 WaveRT 미니포트 드라이버 디자인을 시작한 후 다음 소프트웨어 및 하드웨어 기능을 지원하는지 확인해야 합니다. 따라서 빌드하는 미니포트 드라이버는 시스템에서 제공하는 WaveRT 포트 드라이버 및 Windows Vista 오디오 엔진의 작동 모드와 호환됩니다.

  • 하드웨어 대기 시간이 짧습니다. WaveRT 미니포트 드라이버는 IMiniportWaveRTStream::GetHWLatency 메서드의 완벽하게 작동하는 구현을 제공해야 합니다. 이 메서드는 KSPROPERTY_RTAUDIO_HWLATENCY 속성을 지원하는 데 필요합니다.

  • FIFO 인터럽트. FIFO 오버런 및 언더런이 발생할 때 WaveRT 미니포트 드라이버는 인터럽트를 자동으로 생성해야 합니다. 이 기능을 사용하면 오디오 장치 및 드라이버 소프트웨어에서 테스트를 실행할 때 오디오 스트림의 결함을 감지할 수 있습니다. 하드웨어 지원(즉, FIFO 인터럽트)이 없으면 결함 정보를 가져오기 위한 편리하고 신뢰할 수 있는 방법이 없습니다.

  • DMA 및 버퍼 루핑을 Scatter-Gather. 미니포트 드라이버가 분산형 수집 기능이 있는 DMA 컨트롤러를 지원하는 경우 미니포트 드라이버의 개입 없이 데이터를 주기적 버퍼로 이동 및 외부로 이동할 수 있습니다.

    미니포트 드라이버가 버퍼 루프를 수행할 수 있는 DMA 컨트롤러를 지원하는 경우 DMA 컨트롤러는 읽기 또는 쓰기 작업으로 버퍼의 끝에 도달한 후 버퍼의 시작 부분에 자동으로 래핑할 수 있습니다. 미니포트 드라이버의 개입 없이 랩을 수행할 수 있습니다.

    WaveRT 포트 드라이버는 분산 수집 전송 또는 자동 버퍼 루프를 수행할 수 없는 기존 하드웨어 디자인을 지원합니다.

    오디오 디바이스에 분산형 수집 기능이 없는 경우 WaveRT 미니포트 드라이버는 먼저 메모리에서 물리적으로 인접한 페이지로 구성된 순환 버퍼를 할당해야 합니다. 그런 다음 미니포트 드라이버는 WaveRT 포트 드라이버의 도우미 함수를 사용하여 데이터 전송 및 자동 버퍼 루핑을 수행합니다. 단점은 시스템의 비페이지 메모리 풀이 점점 조각화됨에 따라 연속된 물리적 메모리의 큰 블록을 할당하라는 요청이 실패할 가능성이 높다는 것입니다. 분산 수집 기능이 있는 디바이스는 메모리 조각화의 영향을 받지 않습니다.

    DMA 채널이 순환 버퍼의 끝에 도달할 때 오디오 디바이스가 버퍼 루프를 자동으로 수행할 수 없는 경우 WaveRT 미니포트 드라이버가 개입하여 버퍼 시작 시 데이터 전송을 시작하도록 채널을 구성해야 합니다.

  • 위치 레지스터입니다. 새 디자인의 경우 하드웨어 구현자는 각 DMA 채널에 대한 위치 레지스터를 포함해야 합니다. 위치 레지스터는 현재 버퍼 위치를 순환 버퍼의 시작 부분에서 바이트 오프셋으로 나타냅니다. 위치 레지스터 읽기는 버퍼의 시작 부분에 0입니다. 위치 레지스터가 순환 버퍼의 끝에 도달하면 버퍼의 시작 부분으로 자동으로 래핑되고(0으로 다시 설정) 버퍼 위치가 진행되면 계속 증가합니다.

    위치 레지스터는 클라이언트가 레지스터를 직접 읽을 수 있도록 가상 메모리에 매핑할 수 있습니다.

    이상적으로 위치 레지스터는 현재 오디오 디바이스의 디지털-아날로그 및 아날로그-디지털 변환기(DAC 및 ADC)를 통해 이동하는 샘플의 버퍼 위치를 나타내야 합니다.

    그러나 디지털 및 아날로그 함수를 별도의 버스 컨트롤러 및 인코더/디코더(코덱) 칩으로 나누는 오디오 칩셋에서는 이 정보를 직접 사용할 수 없습니다. 일반적으로 위치 레지스터는 버스 컨트롤러 칩에 있으며 각 레지스터는 컨트롤러가 코덱에 쓰거나 읽는 오디오 데이터의 위치를 나타냅니다.

    이 유형의 위치 레지스터에서 읽기를 얻은 후 클라이언트는 코덱을 통해 지연을 추가하거나 빼서 DAC 또는 ADC를 통해 이동하는 샘플의 현재 위치를 예측할 수 있습니다. 클라이언트는 KSPROPERTY_RTAUDIO_HWLATENCY 속성 요청에서 코덱 지연을 가져옵니다. 이러한 이유로 WaveRT 미니포트 드라이버는 포트 드라이버가 이러한 유형의 속성 요청에 대한 응답으로 IMiniportWaveRTStream::GetHardwareLatency 메서드를 호출할 때 코덱 지연을 정확하게 보고해야 합니다.

    WaveRT 포트 드라이버는 위치 레지스터가 없는 기존 하드웨어 디자인을 지원합니다. 이 제한이 있는 디바이스의 경우 WaveRT 미니포트 드라이버는 STATUS_NOT_SUPPORTED 오류 코드를 반환하여 IMiniportWaveRTStream::GetPositionRegister 메서드에 대한 호출을 실패해야 하며, 이로 인해 포트 드라이버가 속성 요청을 KSPROPERTY_RTAUDIO_POSITIONREGISTER 실패합니다. 이 경우 클라이언트는 KSPROPERTY_AUDIO_POSITION 속성을 통해 현재 위치를 가져와야 합니다. 그러면 각 위치 읽기에 대한 사용자 모드와 커널 모드 간의 전환 오버헤드가 발생합니다.

  • 클록 레지스터. 클록 레지스터는 WaveRT 호환 오디오 디바이스에 대한 선택적이지만 유용한 하드웨어 기능입니다. 오디오 애플리케이션 프로그램은 클록 레지스터를 사용하여 별도의 비동기 하드웨어 시계가 있는 두 개 이상의 독립 오디오 디바이스에서 오디오 스트림을 동기화할 수 있습니다. 클록 레지스터가 없으면 애플리케이션에서 하드웨어 클록 간의 드리프트를 감지하고 보정할 수 없습니다.

    오디오 하드웨어가 디지털-아날로그 또는 아날로그-디지털 변환기를 통해 오디오 데이터를 클록하는 데 사용하는 샘플 클록은 클록 레지스터를 증가시키는 내부 클록에서 파생되어야 합니다. 샘플 클록과 관련하여 비동기 속도로 증가되는 클록 레지스터는 동기화에 사용되지 않으며 노출되어서는 안 됩니다.

    위치 레지스터와 마찬가지로 클록 레지스터를 가상 메모리에 매핑하여 클라이언트가 레지스터를 직접 읽을 수 있습니다.

  • 오디오 처리 개체입니다. 잘 디자인된 WaveRT 미니포트 드라이버는 오디오 디바이스의 순환 버퍼에서 오디오 데이터를 건드려서는 안됩니다. 오디오 데이터가 오디오 드라이버 소프트웨어의 개입 없이 클라이언트와 오디오 하드웨어 간에 직접 흐르도록 하드웨어를 설계해야 합니다.

API는 공유 모드 오디오 스트림에서만 사용할 수 있습니다. 전용 모드 스트림의 경우 애플리케이션은 순환 버퍼를 통해 WaveRT 하드웨어 디바이스와 직접 데이터를 교환하며 다른 구성 요소는 버퍼의 데이터를 터치할 수 없습니다.

자세한 내용은 Windows 오디오 처리 개체를 참조하세요.