001:
002:
003:
004:
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] = {
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:
054: fread(&whdr->fileID ,sizeof(DWORD),1,*fp);
055: fread(&whdr->fileSize,sizeof(DWORD),1,*fp);
056:
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:
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: }