2010년 3월 4일 목요일

Wave file 만들기 (2)


mmio 함수들을 이용하여 만들기 귀찮다면, 이전 포스팅을 참고 하시길.

HMMIO hMmio = NULL;
MMCKINFO wavChunk;
MMCKINFO wavSubChunk;
//mm chunk 정보를 저장하기 위한 구조체 변수

MMRESULT mmResult;

WAVEFORMATEX WaveFormat;
WaveFormat.wFormatTag=WAVE_FORMAT_PCM;
WaveFormat.nChannels = 2;
WaveFormat.nSamplesPerSec = 11025;
WaveFormat.wBitsPerSample = 8;
WaveFormat.nBlockAlign = WaveFormat.nChannels*(WaveFormat.wBitsPerSample/8);
WaveFormat.nAvgBytesPerSec = WaveFormat.nSamplesPerSec*WaveFormat.nBlockAlign;
WaveFormat.cbSize = 0;
//Wave file format을 저장하는 구조체를 선언하고 알맞은 값으로 초기화.
//이 구조체에 대해서는 wave file header를 참고

hMmio = mmioOpen(L"test.wav", NULL,
MMIO_CREATE | MMIO_WRITE | MMIO_EXCLUSIVE |
MMIO_ALLOCBUF | MMIO_EXIST);
//MMIO handle을 받아온다.

if(hMmio == NULL) // 에러 처리 { RETAILMSG(1, (TEXT("fail create wave file\r\n"))); return false; }

ZeroMemory(&wavChunk, sizeof(wavChunk)); //메모리 초기화 wavChunk.fccType = mmioFOURCC('W','A','V','E'); //chunk 정보 입력 mmResult = mmioCreateChunk(hMmio, &wavChunk, MMIO_CREATERIFF); //chunk 생성

if(mmResult != MMSYSERR_NOERROR) // 에러 처리
{ RETAILMSG(1, (TEXT("error mmioCreateChunk (WAVE)\r\n"))); return false; }

//sub chunk 생성
ZeroMemory(&wavSubChunk, sizeof(wavSubChunk)); wavSubChunk.ckid = mmioFOURCC('f','m','t',' '); wavSubChunk.cksize = sizeof(WAVEFORMATEX) + WaveFormat.cbSize; mmResult = mmioCreateChunk(hMmio, &wavSubChunk, 0);
if(mmResult != MMSYSERR_NOERROR) // 에러 처리
{ RETAILMSG(1, (TEXT("error mmioCreateChunk (FMT)\r\n"))); return false; } mmResult = mmioWrite(hMmio, (char*)&WaveFormat, sizeof(WAVEFORMATEX)
+ WaveFormat.cbSize); if(mmResult != MMSYSERR_NOERROR) // 에러 처리
{ RETAILMSG(1, (TEXT("error mmioWrite\r\n"))); return false; } mmResult = mmioAscend(hMmio, &wavSubChunk, 0); if(mmResult != MMSYSERR_NOERROR) // 에러 처리
{ RETAILMSG(1, (TEXT("error mmioAscend\r\n"))); return false; } wavSubChunk.ckid = mmioFOURCC('d','a','t','a'); mmResult = mmioCreateChunk(hMmio, &wavSubChunk, 0); if(mmResult != MMSYSERR_NOERROR) // 에러 처리
{ RETAILMSG(1, (TEXT("error mmioCreateChunk (DATA)\r\n"))); return false; }

DWORD len = 0; len = mmipWrite(hMmio, pBuffer, BUFFERSIZE);  //data를 쓴다.
if(len <= 0) { RETAILMSG(1, (TEXT("error WRITE \r\n"))); return false; }

mmioClose(hMmio,0); //handle close



mmio 함수는 winCE에서는 지원하지 않으며, winmm.dll과 winmm.lib를 포함시켜 주어야 한다.

댓글 없음:

댓글 쓰기