001: //-----------------------------------------------------------------
002: // wave_read.cpp:
003: //      WAVE ファイルのヘッダ情報の読み取り/表示
004: //               Last Update: <2005/01/28 03:49:56 A.Murakami>
005: //-----------------------------------------------------------------
006: #include <stdio.h>
007: #include <windows.h>
008: #include <mmsystem.h>
009: //-----------------------------------------------------------------
010: struct WAVE_HEADER {
011:     DWORD fileID,fileSize;
012:     DWORD fmtID,fmt_type,fmtSize;
013:     WAVEFORMATEX wfx;
014:     DWORD dataID,dataSize;
015: };
016: static char chunk_id[12][5] = { // chunk types
017:     "data","fact","cue ","plst","list","adtl",
018:     "labl","note","ltxt","smpl","inst",NULL};
019: //-----------------------------------------------------------------
020: void err_exit(char* str);
021: void read_waveheader(FILE** fp,WAVE_HEADER* whdr);
022: void disp_waveheader(char* ifile,WAVE_HEADER whdr);
023: //-----------------------------------------------------------------
024: int main(int argc,char* argv[])
025: {
026:     FILE* fp;
027:     char *ifile,buf[256];
028:     WAVE_HEADER whdr;
029:     // ファイル名
030:     if(argc >= 2) ifile = argv[1];
031:     else err_exit("Insufficient argument.\n");
032:     // 読込み
033:     fp = fopen(ifile,"rb");
034:     if(fp==NULL) err_exit("input file cannot open.\n");
035:     read_waveheader(&fp,&whdr);
036:     // ヘッダ情報の表示
037:     disp_waveheader(ifile,whdr);
038:     // 後片付け
039:     fclose(fp);
040:     return 0;
041: }
042: 
043: void err_exit(char* str)
044: {
045:     fprintf(stderr,str);
046:     exit(0);
047: }
048: 
049: void read_waveheader(FILE** fp,WAVE_HEADER* whdr)
050: {
051:     int i,find,idck=TRUE,fpos;
052:     DWORD drTmp; WORD cbsize;
053:     // file head
054:     fread(&whdr->fileID  ,sizeof(DWORD),1,*fp);
055:     fread(&whdr->fileSize,sizeof(DWORD),1,*fp);
056:     // fmt head
057:     fread(&whdr->fmtID   ,sizeof(DWORD),1,*fp);
058:     fread(&whdr->fmt_type,sizeof(DWORD),1,*fp);
059:     fread(&whdr->fmtSize ,sizeof(DWORD),1,*fp);
060:     fread(&whdr->wfx     ,sizeof(WAVEFORMATEX)-sizeof(WORD),1,*fp);
061:     // check chunk info.
062:     whdr->dataID   = 0;
063:     whdr->dataSize = 0;
064:     whdr->wfx.cbSize = 0;
065:     while(idck){
066:         if(ftell(*fp) > whdr->fileSize) break;
067:         fread(&drTmp,sizeof(DWORD),1,*fp);
068:         find = FALSE;
069:         for(i=0;;i++){
070:             if(chunk_id[i][0] == NULL) break;
071:             if(drTmp == mmioFOURCC('d','a','t','a')){
072:                 whdr->dataID = drTmp;
073:                 fread(&whdr->dataSize,sizeof(DWORD),1,*fp);
074:                 find = TRUE;
075:                 idck = FALSE;
076:                 break;
077:             } else {
078:                 if(drTmp == mmioFOURCC(chunk_id[i][0],chunk_id[i][1],
079:                                        chunk_id[i][2],chunk_id[i][3])){
080:                     find = TRUE;
081:                     fread(&drTmp,sizeof(DWORD),1,*fp);
082:                     fseek(*fp,ftell(*fp)+drTmp,SEEK_SET);
083:                     break;
084:                 }
085:             }
086:         }
087:         if(!find) fseek(*fp,ftell(*fp)-(sizeof(DWORD)-1),SEEK_SET);
088:     }
089: }
090: 
091: void disp_waveheader(char* ifile,WAVE_HEADER whdr)
092: {
093:     char tag[5]; tag[4] = 0;
094:     printf("FILE: %s\n",ifile);
095:     printf("**FILE HEAD\n");
096:     memcpy(tag,&whdr.fileID,sizeof(DWORD));
097:     printf("    FILE ID: %s\n",tag);
098:     if(whdr.fileSize > 1000)
099:         printf("  FILE SIZE: %d[kByte]\n",whdr.fileSize/1000);
100:     else
101:         printf("  FILE SIZE: %d[Byte]\n",whdr.fileSize);
102:     printf("**WAVE FORMAT\n");
103:     memcpy(tag,&whdr.fmtID,sizeof(DWORD));
104:     printf("  FORMAT ID: %s\n",tag);
105:     memcpy(tag,&whdr.fmt_type,sizeof(DWORD));
106:     printf("FORMAT TYPE: %s\n",tag);
107:     printf("FORMAT SIZE: %d\n",whdr.fmtSize);
108:     printf("**WAVE INFO.\n");
109:     printf("   WAVE TAG: %d\n",whdr.wfx.wFormatTag);
110:     printf("    CHANNEL: %d\n",whdr.wfx.nChannels);
111:     printf(" SAMPLE/SEC: %d\n",whdr.wfx.nSamplesPerSec);
112:     printf("BYTE/SAMPLE*CHANNEL: %d\n",whdr.wfx.nBlockAlign);
113:     printf(" BIT/SAMPLE: %d\n",whdr.wfx.wBitsPerSample);
114:     if(whdr.wfx.cbSize){
115:         printf("EXTRA FORMAT SIZE: %d\n",whdr.wfx.cbSize);
116:     }
117:     printf("**WAVE DATA INFO.\n");
118:     if(whdr.dataID){
119:         memcpy(tag,&whdr.dataID,sizeof(DWORD));
120:         printf("    DATA ID: %s\n",tag);
121:     } else {
122:         printf("    DATA ID: null\n");
123:     }
124:     if(whdr.dataSize > 1000)
125:         printf("  DATA SIZE: %d[kByte]\n",whdr.dataSize/1000);
126:     else
127:         printf("  DATA SIZE: %d[Byte]\n",whdr.dataSize);
128: }
inserted by FC2 system