레이블이 mmio function인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mmio function인 게시물을 표시합니다. 모든 게시물 표시

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를 포함시켜 주어야 한다.