디바이스 및 데이터 형식
[이 페이지와 연결된 기능인 Waveform Audio는 레거시 기능입니다. WASAPI 및 오디오 그래프로 대체되었습니다. WASAPI 및 오디오 그래프는 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 파형 오디오 대신 WASAPI 및 오디오 그래프를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 섹션에서는 파형 오디오 디바이스 작업에 대해 설명하고 해당 기능에 대해 열고, 닫고, 쿼리하는 방법에 대한 정보를 포함합니다. 또한 디바이스 핸들 및 디바이스 식별자를 사용하여 시스템의 디바이스를 추적하는 방법도 설명합니다.
Waveform-Audio 출력 디바이스 열기
waveOutOpen 함수를 사용하여 재생을 위해 파형 오디오 출력 디바이스를 엽니다. 이 함수는 지정된 디바이스 식별자와 연결된 디바이스를 열고 지정된 메모리 위치의 핸들을 작성하여 열린 디바이스의 핸들을 반환합니다.
일부 멀티미디어 컴퓨터에는 여러 파형 오디오 출력 디바이스가 있습니다. 시스템에서 특정 파형 오디오 출력 디바이스를 열려고 하지 않는 한 디바이스를 열 때 디바이스 식별자에 대한 WAVE_MAPPER 플래그를 사용해야 합니다. waveOutOpen 함수는 지정된 데이터 형식을 가장 잘 재생할 수 있는 시스템에서 디바이스를 선택합니다.
오디오 디바이스 쿼리
Windows는 시스템에서 사용할 수 있는 특정 유형의 디바이스 수를 결정하는 다음 함수를 제공합니다.
함수 | 설명 |
---|---|
auxGetNumDevs | 시스템에 있는 보조 출력 디바이스의 수를 검색합니다. |
waveInGetNumDevs | 시스템에 있는 파형 오디오 입력 디바이스의 수를 검색합니다. |
waveOutGetNumDevs | 시스템에 있는 파형 오디오 출력 디바이스의 수를 검색합니다. |
오디오 디바이스는 디바이스 식별자를 통해 식별됩니다. 디바이스 식별자는 시스템에 있는 디바이스 수에서 암시적으로 결정됩니다. 디바이스 식별자는 0에서 1까지의 범위가 존재하는 디바이스 수보다 적습니다. 예를 들어 시스템에 두 개의 파형 오디오 출력 디바이스가 있는 경우 유효한 디바이스 식별자는 0과 1입니다.
시스템에 있는 특정 유형의 디바이스 수를 확인한 후 다음 함수 중 하나를 사용하여 각 디바이스의 기능을 쿼리할 수 있습니다.
함수 | 설명 |
---|---|
auxGetDevCaps | 지정된 보조 출력 디바이스의 기능을 검색합니다. |
waveInGetDevCaps | 지정된 파형 오디오 입력 디바이스의 기능을 검색합니다. |
waveOutGetDevCaps | 지정된 파형 오디오 출력 디바이스의 기능을 검색합니다. |
이러한 각 함수는 지정된 디바이스의 기능에 대한 정보로 구조를 채웁니다. 다음 표에서는 이러한 각 함수에 해당하는 구조를 나열합니다.
함수 | 구조체 |
---|---|
auxGetDevCaps | AUXCAPS |
waveInGetDevCaps | WAVEINCAPS |
waveOutGetDevCaps | WAVEOUTCAPS |
표준 형식은 WAVEOUTCAPS 구조체의 dwFormats 멤버에 나열됩니다. 파형 오디오 디바이스는 비표준 형식을 지원할 수 있습니다. 특정 형식(표준 또는 비표준)이 디바이스에서 지원되는지 여부를 확인하려면 WAVE_FORMAT_QUERY 플래그를 사용하여 waveOutOpen 함수를 호출할 수 있습니다. 이 플래그는 디바이스를 열지 않습니다. waveOutOpen에 전달된 pwfx 매개 변수가 가리키는 WAVEFORMATEX 구조체에서 해당 형식을 지정합니다.
파형 오디오 출력 디바이스는 지원하는 기능에 따라 다릅니다. WAVEOUTCAPS 구조의 dwSupport 멤버는 디바이스가 볼륨 및 피치 변경과 같은 기능을 지원하는지 여부를 나타냅니다.
디바이스 핸들 및 디바이스 식별자
오디오 디바이스를 여는 각 함수는 디바이스 식별자, 메모리 위치에 대한 포인터 및 각 디바이스 유형에 고유한 일부 매개 변수를 지정합니다. 메모리 위치는 디바이스 핸들로 채워집니다. 이 디바이스 핸들을 사용하여 다른 오디오 함수를 호출할 때 열려 있는 오디오 디바이스를 식별합니다.
오디오 디바이스의 식별자와 핸들 간의 차이는 미묘하지만 중요합니다.
- 디바이스 식별자는 시스템에 있는 디바이스 수에서 암시적으로 결정됩니다. 이 숫자는 auxGetNumDevs, waveInGetNumDevs 또는 waveOutGetNumDevs 함수를 사용하여 가져옵니다.
- 디바이스 핸들은 waveInOpen 또는 waveOutOpen 함수를 사용하여 디바이스 드라이버를 열 때 반환됩니다.
보조 오디오 디바이스를 열거나 닫는 함수는 없습니다. 연결된 연속 데이터 전송이 없으므로 보조 오디오 디바이스를 파형 오디오 디바이스처럼 열고 닫을 필요가 없습니다. 모든 보조 오디오 함수는 디바이스 식별자를 사용하여 디바이스를 식별합니다.
출력 데이터 형식 Waveform-Audio
파형 오디오 출력 함수에 대해 정의된 데이터 형식은 다음과 같습니다.
형식 | 설명 |
---|---|
HWAVEOUT | 열린 파형 오디오 출력 디바이스에 대한 핸들입니다. |
WAVEFORMATEX | 특정 파형 오디오 입력 디바이스에서 지원하는 데이터 형식을 지정하는 구조체입니다. 이 구조는 파형 오디오 입력 디바이스에도 사용됩니다. |
WAVEHDR | 파형 오디오 입력 데이터 블록의 헤더로 사용되는 구조체입니다. 이 구조체는 파형 오디오 입력 디바이스에도 사용됩니다. |
WAVEOUTCAPS | 특정 파형 오디오 출력 디바이스의 기능을 쿼리하는 데 사용되는 구조체입니다. |
Waveform-Audio 데이터 형식 지정
waveOutOpen 함수를 호출하여 재생을 위해 디바이스 드라이버를 열거나 드라이버가 특정 데이터 형식을 지원하는지 여부를 쿼리하는 경우 pwfx 매개 변수를 사용하여 요청된 파형 오디오 데이터 형식을 포함하는 WAVEFORMATEX 구조체에 대한 포인터를 지정합니다. WAVEFORMATEX 는 WAVEFORMAT 및 PCMWAVEFORMAT 구조를 대체합니다.
두 개 이상의 채널로 구분되거나 8의 배수가 아닌 샘플 크기가 있는 오디오 데이터의 경우 WAVEFORMATEXTENSIBLE을 사용해야 합니다. 이 구조체는 WAVEFORMATEX의 cbSize 멤버가 가리키는 추가 바이트를 구성하여 형식에 대한 추가 정보를 제공합니다. WAVEFORMATEXTENSIBLE 은 WAVEFORMATEX로 캐스팅할 수 있습니다.
오디오 데이터를 나타내는 데 사용할 수 있는 두 가지 클립보드 형식인 CF_WAVE 및 CF_RIFF. CF_WAVE 형식을 사용하여 11kHz 또는 22kHz PCM과 같은 표준 형식 중 하나로 데이터를 나타냅니다. 표준 파형 오디오 파일로 나타낼 수 없는 더 복잡한 데이터 형식을 나타내려면 CF_RIFF 형식을 사용합니다.
Waveform-Audio 데이터 쓰기
파형 오디오 출력 디바이스 드라이버를 성공적으로 연 후 소리 재생을 시작할 수 있습니다. Windows는 파형 오디오 출력 디바이스에 데이터 블록을 보내기 위한 waveOutWrite 함수를 제공합니다.
WAVEHDR 구조를 사용하여 waveOutWrite를 사용하여 보내는 파형 오디오 데이터 블록을 지정합니다. 이 구조체에는 잠긴 데이터 블록에 대한 포인터, 데이터 블록의 길이 및 일부 플래그가 포함됩니다. 이 데이터 블록은 사용하기 전에 준비해야 합니다. 데이터 블록을 준비하는 방법에 대한 자세한 내용은 오디오 데이터 블록을 참조하세요.
waveOutWrite를 사용하여 출력 디바이스에 데이터 블록을 보낸 후에는 데이터 블록을 해제하기 전에 디바이스 드라이버가 데이터 블록으로 완료될 때까지 기다려야 합니다. 여러 데이터 블록을 보내는 경우 데이터 블록의 완료를 모니터링하여 추가 블록을 보낼 시기를 알아야 합니다. 데이터 블록에 대한 자세한 내용은 오디오 데이터 블록을 참조하세요.
PCM Waveform-Audio 데이터 형식
WAVEHDR 구조체의 lpData 멤버는 파형 오디오 데이터 샘플을 가리킵니다. 8비트 PCM 데이터의 경우 각 샘플은 서명되지 않은 단일 데이터 바이트로 표시됩니다. 16비트 PCM 데이터의 경우 각 샘플은 16비트 서명된 값으로 표시됩니다. 다음 표에는 PCM 파형 오디오 데이터의 최대값, 최소값 및 중간점 값이 요약되어 있습니다.
데이터 형식 | 최대값 | 최소값 | 중간점 값 |
---|---|---|---|
8비트 PCM | 255(0Xff) | 0 | 128(0x80) |
16비트 PCM | 32,767(0x7FFF) | –32,768(0x8000) | 0 |
PCM 데이터 압축
데이터 바이트의 순서는 8비트 및 16비트 형식과 모노 및 스테레오 형식 간에 다릅니다. 다음 목록에서는 다양한 PCM 파형 오디오 데이터 형식에 대한 데이터 압축을 설명합니다.
PCM 파형 오디오 형식 | 설명 |
---|---|
8비트 모노 | 각 샘플은 단일 오디오 채널에 해당하는 1 바이트입니다. 샘플 1 뒤에 샘플 2, 3, 4 등이 옵니다. |
8비트 스테레오 | 각 샘플은 2바이트입니다. 샘플 1 뒤에 샘플 2, 3, 4 등이 옵니다. 각 샘플에 대해 첫 번째 바이트는 채널 0(왼쪽 채널)이고 두 번째 바이트는 채널 1(오른쪽 채널)입니다. |
16비트 모노 | 각 샘플은 2바이트입니다. 샘플 1 뒤에 샘플 2, 3, 4 등이 옵니다. 각 샘플에 대해 첫 번째 바이트는 채널 0의 하위 바이트이고 두 번째 바이트는 채널 0의 상위 바이트입니다. |
16비트 스테레오 | 각 샘플은 4바이트입니다. 샘플 1 뒤에 샘플 2, 3, 4 등이 옵니다. 각 샘플에 대해 첫 번째 바이트는 채널 0(왼쪽 채널)의 하위 바이트입니다. 두 번째 바이트는 채널 0의 상위 바이트입니다. 세 번째 바이트는 채널 1(오른쪽 채널)의 하위 바이트입니다. 네 번째 바이트는 채널 1의 상위 바이트입니다. |
기타 | 각 샘플은 4바이트의 배수인 블록에 포함되어 있지만 샘플은 비바이트 정렬일 수 있습니다. 채널 배열은 마스크로 지정됩니다. 자세한 내용은 WAVEFORMATEXTENSIBLE을 참조하세요. |
Waveform-Audio 출력 디바이스 닫기
파형 오디오 재생이 완료되면 waveOutClose 를 호출하여 출력 디바이스를 닫습니다. 파형 오디오 파일이 재생되는 동안 waveOutClose 가 호출되면 닫기 작업이 실패하고 함수는 디바이스가 닫혀 있지 않음을 나타내는 오류 코드를 반환합니다. 디바이스를 닫기 전에 재생이 끝날 때까지 기다리지 않으려면 닫기 전에 waveOutReset 함수를 호출합니다. 이렇게 하면 재생이 종료되고 디바이스를 닫을 수 있습니다. waveOutUnprepareHeader 함수를 사용하여 디바이스를 닫기 전에 모든 데이터 블록에 대한 준비를 클린 합니다.