'기타 > 메신저' 카테고리의 다른 글

Wave분석 최종  (0) 2011.03.04
Wave 버젼  (0) 2011.02.06
Wave파형분석및데이터출력(예광탄)  (1) 2011.01.25
개인 주간 계획서 1주차  (0) 2011.01.20
개인 일일 보고서 1일차  (0) 2011.01.20

예광탄 프로그램

: 2

작성자 : 김동영

작성일 : 2011. 1. 24

제목 : Wave 포맷 분석 및 데이터 출력

 

 

Wave Format

1) RIFF chunk

type

byte

내용

의미

char

4

“RIFF”

파일의 종류가 RIFF 파일을 의미

DWORD

4

FILE SIZE

현재부터 끝까지의 파일 크기

char

4

“WAVE”

Wave 파일을 의미

2) FMT sub-chunk

type

byte

내용

의미

char

4

“fmt”

Chunk ID

DWORD

4

16 | 18

Chunk Size

short

2

wFormatTag

PCMWAVEFORMAT의 값(1:PCM )

short

2

nChannels

채널수(1:모노, 2:스테레오)

DWORD

4

nSamplesPerSec

샘플링 수

DWORD

4

nAvgBytesperSec

초당 샘플 바이트

short

2

BlockAlign

샘플당 바이트

short

2

wBitsPerSample

샘플당 비트수

3) Data sub-chunk

type

byte

내용

의미

char

4

“data”

데이터 청크의 시작

DWORD

4

DATA SIZE

데이터의 크기

 

 

DATA

데이터

 

 

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 데이터를 얻어온다.

 

 

 

char *SoundInfo::GetFiletype()

{

             return parent_chunk->GetFiletypeC();

}

int SoundInfo::GetFilesize()

{

             return parent_chunk->GetFilesizeC();

}

char *SoundInfo::GetMediatype()

{

             return parent_chunk->GetMediatypeC();

}

 

 

 

Chunk별로 Wave파일의 속성이 맞는지 확인한다.

 

bool SoundInfo::CheckParentChunk()

{

             return parent_chunk->IsAvailChunk();

}

bool SoundInfo::CheckSubChunk()

{

             return sub_chunk->IsAvailChunk();

}

bool SoundInfo::CheckDataChunk()

{

             return data_chunk->IsAvailChunk();

}

 

 

 

SubChunk 데이터를 얻어온다.

 

  

char *SoundInfo::GetMagic()//매직

{

             return sub_chunk->GetMagicC();

}

int SoundInfo::GetPt()

{

             return sub_chunk->GetPtC();

}

short SoundInfo::GetFormat()//포맷

{

             return sub_chunk->GetFormatC();

}

short SoundInfo::GetChannelcnt()//채널수

{

             return sub_chunk->GetChannelcntC();

}

int  SoundInfo::GetSamples_persec()//초당샘플수

{

             return sub_chunk->GetSamples_persecC();

}

int  SoundInfo::GetBytes_persec() //초당바이트수- 평균값임

{

             return sub_chunk->GetBytes_persecC();

}

short  SoundInfo::GetSize_sample() //샘플1개의사이즈

{

             return sub_chunk->GetSize_sampleC();

}

short  SoundInfo::GetBits_persample()//샘플한개의비트수

{

             return sub_chunk->GetBits_persampleC();

}

short *SoundInfo::GetSize_extend()//옵션의사이즈

{

             return sub_chunk->GetSize_extendC();

}

 

 

 

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 읽어온다.

 

  

ParentChunk::ParentChunk(HANDLE hFile)

{

             DWORD dwRead;

             ReadFile(hFile,filetype,4,&dwRead,0);

             filetype[4]=0;

             ReadFile(hFile,&filesize,4,&dwRead,0);

             ReadFile(hFile,mediatype,4,&dwRead,0);

             mediatype[4]=0;

}

 

 

 

만약 filetype “RIFF” 아니거나 mediatype “WAVE” 아닌 경우 0 리턴한다

 

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가 한 개 더 있다. 그래서 ChunkIDChunkSizeChunk데이터를 얻어왔다.

 

 

SubChunk::SubChunk(HANDLE hFile)

{

             DWORD dwRead;

             ReadFile(hFile,magic,4,&dwRead,0);

             magic[4]=0;

             ReadFile(hFile,&pt,4,&dwRead,0);

             ReadFile(hFile,&format,2,&dwRead,0);

             ReadFile(hFile,&channelcnt,2,&dwRead,0);

             ReadFile(hFile,&samples_persec,4,&dwRead,0);

             ReadFile(hFile,&bytes_persec,4,&dwRead,0);

             ReadFile(hFile,&size_sample,2,&dwRead,0);

             ReadFile(hFile,&bits_persample,2,&dwRead,0);

            

             //pt1618이아닌경우는배제

             if(pt==18 )

             {

                           size_extend = (short *)malloc(2);

                           ReadFile(hFile,size_extend,2,&dwRead,0);

                           char fmagics[5]={0,};

                           ReadFile(hFile,fmagics,4,&dwRead,0);

                           int next;

                           ReadFile(hFile,&next,4,&dwRead,0);

                           char foo[4096];

                           ReadFile(hFile,foo,next,&dwRead,0);

             }         

}

 

 

 

 

ChunkID(magic)“fmt”이 아니거나 format(PCMWAVEFORMAT)값이 1(Wave Format PCM 방식) 이 아닐 때 0을 리턴한다.

 

 

bool SubChunk::IsAvailChunk()

{

             return (strcmp(MAGIC_SUB_TYPE,magic)==0)&&(format==PCMWAVE_FORMAT);

}

 

 

 

 

 

 

 

 

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

 

ChunkID,DataSize,Data 얻어온다.

 

 

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

'기타 > 소켓통신' 카테고리의 다른 글

WSAAsyncSelect  (0) 2011.02.21
예비과정 발표점수  (0) 2011.02.14
메신저(동시 메시지,파일 전송)  (0) 2011.01.17
다중파일전송  (0) 2011.01.17
파일입출력(쓰레드구현)  (0) 2011.01.10

'기타 > C++' 카테고리의 다른 글

Native C++에서 C++/CLR 클래스 사용하기(CLR 옵션)  (0) 2015.03.06
Native C++에서 C++/CLR 클래스 사용하기  (0) 2015.03.06
비트학생관리  (0) 2011.01.20

'기타 > C++' 카테고리의 다른 글

Native C++에서 C++/CLR 클래스 사용하기(CLR 옵션)  (0) 2015.03.06
Native C++에서 C++/CLR 클래스 사용하기  (0) 2015.03.06
콘솔싸이월드  (0) 2011.01.20

개인 주간 계획서  작성자 :  김동영
 작성일 :  2011년 1월 20일
               
할일   한일  
 이번주 할 일
할 일       1/20
1/21
강사님 미팅         1
         
제안서 작성       3 2
         
조별스터디       1             2
         
wav 파일 분석       2             4
         
미니 프로젝트가 시작되었다. 제안서 작성에 중점을 두고 틈틈이 wav 파일 분석 공부를 해야겠다.

'기타 > 메신저' 카테고리의 다른 글

Wave분석 최종  (0) 2011.03.04
Wave 버젼  (0) 2011.02.06
워크샵 가기전 파일 백업  (0) 2011.01.26
Wave파형분석및데이터출력(예광탄)  (1) 2011.01.25
개인 일일 보고서 1일차  (0) 2011.01.20

개인 일일 보고서  작성자 :  김동영
 작성일 :  2011년 1월 20일
               
할일   한일  
 이번주 한 일
한 일       1/20
1/21
강사님 미팅         1
         
제안서 작성       3   2
      3  
조별스터디       1             2
      1  
wav 파일 분석       2             4
      2  
강사님께서 wav파일 포맷을 분석하여 파일 부분 진폭,주파수에 해당하는 곳에 점을 찍어 선으로 출력하라고 하셨다. 오늘은 wav파일의 정의 및 사용 용도를 확인하였다.

'기타 > 메신저' 카테고리의 다른 글

Wave분석 최종  (0) 2011.03.04
Wave 버젼  (0) 2011.02.06
워크샵 가기전 파일 백업  (0) 2011.01.26
Wave파형분석및데이터출력(예광탄)  (1) 2011.01.25
개인 주간 계획서 1주차  (0) 2011.01.20

'기타 > 소켓통신' 카테고리의 다른 글

예비과정 발표점수  (0) 2011.02.14
서버와 클라이언트 tcp,udp사용  (0) 2011.01.20
다중파일전송  (0) 2011.01.17
파일입출력(쓰레드구현)  (0) 2011.01.10
파일입출력(비동기화 미구현)  (0) 2011.01.10

'기타 > 소켓통신' 카테고리의 다른 글

예비과정 발표점수  (0) 2011.02.14
서버와 클라이언트 tcp,udp사용  (0) 2011.01.20
메신저(동시 메시지,파일 전송)  (0) 2011.01.17
다중파일전송  (0) 2011.01.17
파일입출력(비동기화 미구현)  (0) 2011.01.10

+ Recent posts