앨리스의 토끼

javahawk.egloos.com

포토로그 방명록


최근 포토로그


waveOutPrepareHeader by Kircheis

MMRESULT waveOutPrepareHeader(
 HWAVEOUT hwo,
 LPWAVEHDR pwh,
 UINT  cbwh
);

hwo
 : waveOutOpen으로 열어둔 출력 디바이스의 핸들
pwh
 : 출력할 데이터블럭에 대한 정보를 채운 WAVEHDR 구조체의 포인터
cbwh
 : pwh가 가리키는 구조체의 사이즈

이 함수는 성공하면 MMSYSERR_NOERROR를 반환하고, 실패하면 다음 중 하나를 반환한다.

MMSYSERR_INVALHANDLE
 - 해당 디바이스의 핸들이 유효하지 않은 경우. 이 경우는 대개 waveOutClose 등으로 핸들을 닫아버린 경우에 해당한다.
MMSYSERR_NODRIVER
 - 가용한 디바이스 드라이버가 없는 경우에 해당한다.
MMSYSERR_NOMEM
 - 메모리를 할당할 수 없거나 메모리가 닫힌 경우에 해당한다.

이 함수를 호출하기 전에 반드시 출력할 데이터블럭에 해당하는 WAVEHDR 구조체를 준비해야 하는데, 그 중에서도 lpData, dwBufferLength, dwFlags 멤버를 설정해야 한다.

 m_lpWaveHdr = static_cast<LPWAVEHDR>(malloc(static_cast<DWORD>(sizeof(WAVEHDR) + nSize)));
 m_lpWaveHdr->lpData = reinterpret_cast<char *>(m_lpWaveHdr) + sizeof(WAVEHDR);
 m_lpWaveHdr->dwBufferLength = nSize;
 m_lpWaveHdr->dwFlags = WHDR_DONE;

 mmioRead(hmmio, static_cast<char *>(m_lpWaveHdr->lpData), nSize);
 waveOutPrepareHeader(m_hWaveOut, m_lpWaveHdr, sizeof(WAVEHDR));

이 함수의 호출 후에 waveOutWrite가 호출되면 WAVEHDR에서 지정한 데이터 블럭의 내용이 출력됩니다. 만약 오디오 파일의 포맷 변환이나 손실 압축 등의 주제를 다룬다면, waveOutWrite가 호출되기 전에 WAVEHDR 구조체의 크기가 변경되어야 할 수 있습니다. 만약 그렇다면, dwBufferLength의 사이즈는 이전에 설정한 nSize보다는 작은 크기여야 합니다. 만약 nSize보다 크다면, 준비된 이상의 출력을 요구하는 것이기 때문에 문제가 발생할 수 있습니다.

dwFlags의 경우 waveOutPrepareHeader를 호출하기 전에 WHDR_DONE으로 설정했습니다만, 호출 후에는 WHDR_PREPARED로 변경됩니다.

dwFlags가 가질 수 있는 상태는 다음의 5가지입니다.

#define WHDR_DONE       0x00000001  /* 완료비트 */
#define WHDR_PREPARED   0x00000002  /* 준비완료 : waveOutPrepareHeader가 성공했음 */
#define WHDR_BEGINLOOP  0x00000004  /* 루프 시작 블럭 */
#define WHDR_ENDLOOP    0x00000008  /* 루프 종료 블럭 */
#define WHDR_INQUEUE    0x00000010  /* 드라이버에서 사용 */







메모장