2010년 2월 25일 목요일

Wave file 만들기

winCE에서 winmm.lib를 쓸 수 없는 관계로,, mmio 함수들을 하나도 쓰지 못하고.ㅠㅜ
결국엔 wave file을 손수 만들어 주어야 하는 귀찮음에 봉착하였다.

wave file header 구조에 따라 다음과 같은 구조체를 선언한다.

typedef struct
{
           FOURCC ckID; // 'RIFF'인지 'LIST'인지 넣어준다.
           DWORD dwFileSize; // 전체 file크기 저장 (data크기 + 40)
           FOURCC fccType; // 'WAVE'
           FOURCC subckID; // 'fmr '
           DWORD dwSubChunkSize; // 16
           WORD wFormatTag; // WAVE_FORMAT_PCM
           WORD nChannels; // 1 = mono, 2 = stereo
           DWORD nSamplesPerSec; // 11025, 22050 등등등
           DWORD wBitsPerSample; // 8, 16, 등등등
           WORD nBlockAlign; // nChannels * wBitsPerSample/8
           WORD nAvgBytesPerSec; // nChannels * wBitsPerSample/8 * nSamplesPerSec
           FOURCC datackID; // 'data'
           DWORD dwDataSize; // data크기
} WaveFormChunk;


그리고 이 구조체에 대한 변수를 하나 선언하여 알맞은 값을 넣어주고,
파일의 맨 앞부분에 write한다.

WaveFormChunk WaveHeader;
WaveHeader.ckID = FOURCC_RIFF;
WaveHeader.dwFileSize = m_dwDataLen + 40;
WaveHeader. fccType = MAKEFOURCC('W', 'A', 'V', 'E');
WaveHeader.subckID = MAKEFOURCC('f', 'm', 't', ' ');
WaveHeader.dwSubChunkSize = 16;
WaveHeader. wFormatTag = WAVE_FORMAT_PCM;
WaveHeader. nChannels = 2;//pWaveFormat->nChannels;
WaveHeader. nSamplesPerSec = 11025;//pWaveFormat->nSamplesPerSec;
WaveHeader. wBitsPerSample = 8;//pWaveFormat->wBitsPerSample;
WaveHeader. nBlockAlign = WaveHeader. nChannels * WaveHeader. wBitsPerSample /8;
WaveHeader. nAvgBytesPerSec = WaveHeader. nSamplesPerSec * WaveHeader. nBlockAlign;          
WaveHeader.datackID = MAKEFOURCC('d','a','t','a');
WaveHeader.dwDataSize = m_dwDataLen;

WriteFile(hFile, & WaveHeader, sizeof(WaveFormChunk), &dwSize, NULL);
//파일 입출력 참고 (포스팅보러가기)

그리고 나머지  data를 write하면 wave 파일이 생성된다-_-)/

댓글 없음:

댓글 쓰기