Wave Format 1) RIFF chunk
2) FMT sub-chunk
3) Data sub-chunk
SoundInfo 클래스는 RIFF Chunk(ParentChunk 클래스)와 FMT Sub-Chunk(SubChunk 클래스)와 Data Sub-Chunk(DataChunk)를 관리해주는 클래스이다.
SoundInfo.cpp 생성자에서 각각의 Chunk별로 데이터들을 얻는다.
SoundInfo::SoundInfo(HANDLE hFile) { parent_chunk=new ParentChunk(hFile); sub_chunk=new SubChunk(hFile); data_chunk=new DataChunk(hFile); }
ParentChunk의 데이터를 얻어온다.
각 Chunk별로 Wave파일의 속성이 맞는지 확인한다.
SubChunk의 데이터를 얻어온다.
DataChunk의 데이터를 얻어온다.
char *SoundInfo::GetDataMagic() { return data_chunk->GetDataMagicC(); } int SoundInfo::GetDataSize() { return data_chunk->GetDataSizeC(); } short* SoundInfo::GetData() { return data_chunk->GetDataC(); }
ParentChunk.cpp Filetype,filesize,mediatype을 읽어온다.
bool ParentChunk::IsAvailChunk() { return (strcmp(MAGIC_FILE_TYPE,filetype)==0)&&(strcmp(MAGIC_WAVE_TYPE,mediatype)==0); }
char *ParentChunk::GetFiletypeC() { return filetype; } int ParentChunk::GetFilesizeC() { return filesize; } char *ParentChunk::GetMediatypeC() { return mediatype; }
SubChunk.cpp
ChunkID,ChunkSize, PCMWAVEFORMAT의 값,채널수,샘필링수,초당 샘플 바이트,샘플당 바이트, 샘플당 비트수를 얻어온다. *단, pt(ChunkSize)가 18일 경우에는 SubChunk의 2바이트 이후 DataChunk사이와 SubChunk 사이에 ChunkData가 한 개 더 있다. 그래서 ChunkID와 ChunkSize와 Chunk데이터를 얻어왔다.
ChunkID(magic)이 “fmt”이 아니거나 format(PCMWAVEFORMAT)값이 1(Wave Format이 PCM 방식) 이 아닐 때 0을 리턴한다.
char *SubChunk::GetMagicC()//ChunkID { return magic; } int SubChunk::GetPtC()//ChunkSize { return pt; } short SubChunk::GetFormatC()//포맷 { return format; } short SubChunk::GetChannelcntC()//채널수 { return channelcnt; } int SubChunk::GetSamples_persecC()//초당샘플수 { return samples_persec; } int SubChunk::GetBytes_persecC() //초당바이트수- 평균값임 { return bytes_persec; } short SubChunk::GetSize_sampleC() //샘플1개의사이즈 { return size_sample; } short SubChunk::GetBits_persampleC()//샘플한개의비트수 { return bits_persample; } short *SubChunk::GetSize_extendC() { return size_extend; }
DataChunk.cpp
DataChunk::DataChunk(HANDLE hFile) { DWORD dwRead; ReadFile(hFile,magic,4,&dwRead,0); magic[4]=0; ReadFile(hFile,&datasize,4,&dwRead,0); data=(short *)malloc(datasize); ReadFile(hFile,data,datasize,&dwRead,0); }
ChunkID가 “DATA”가 아니면 0을 리턴한다.
bool DataChunk::IsAvailChunk() { return (strcmp(MAGIC_DATA_TYPE,magic)==0); } char *DataChunk::GetDataMagicC() { return magic; } int DataChunk::GetDataSizeC() { return datasize; } short* DataChunk::GetDataC() { return data; }
입력받은 Chunk들을 Edit박스에 나타내었고, 데이터들을 Lineto함수로 출력해주었다.
|
'기타 > 메신저' 카테고리의 다른 글
Wave분석 최종 (0) | 2011.03.04 |
---|---|
Wave 버젼 (0) | 2011.02.06 |
워크샵 가기전 파일 백업 (0) | 2011.01.26 |
개인 주간 계획서 1주차 (0) | 2011.01.20 |
개인 일일 보고서 1일차 (0) | 2011.01.20 |