/* * stripsil.c (c) 2001 Petr Tomasek * (See http://www.etf.cuni.cz/~tomasek/) * * Strips silence from .wav stream (I use it for digitialize some old * tapes into mp3).. * * usage: stripsil < in.wav > out.wav * * compile: gcc stripsil.c -o stripsil -lm * */ #include #include #include const int fr=10; /* 1/fr s ->> rsm */ const int tt=20; /* in frames */ const int trh=750; /* treshhold */ const int trhd=150; /* diference treshhold */ void print_time (FILE *f,long x,long rate) { long a,b,c; a=x/rate; b=a/60;a=a%60; c=b/60;c=c%60; fprintf(f,"%02d:%02d:%02d.%d",c,b,a,(int)(10*(x%rate)/rate)); } int main () { #define HEADRLEN 46 unsigned char head[HEADRLEN]; signed char buff[655360]; char h1[5],type[5],ID[5],h2[5]; unsigned long lena,lenh,lend; unsigned int ftag,ch,samp,bps,balign,spec,bytes,bits; int byts; signed long a1,a2,m1,m2,mm1,mm2,md1,md2; double sum1,sum2,sumd1,sumd2; int i,n=0; int nn,ii,nx; signed long b1,b2,d1,d2; size_t rd; int silent=1,sc=0; fprintf(stderr,"Stripsil: (c) 2001 Petr Tomasek \n"); #define _GI(q) head[q]+256*head[q+1] #define _GL(q) head[q]+256*(head[q+1]+256*(head[q+2]+256*head[q+3])) #define _SS(s,n) \ s[0]=head[n]; \ s[1]=head[n+1]; \ s[2]=head[n+2]; \ s[3]=head[n+3]; \ s[4]='\0'; fread(head,1,HEADRLEN,stdin); _SS(h1,0) _SS(type,8) _SS(ID,12) _SS(h2,36) lena=_GL(4); lenh=_GL(16); lend=_GL(40); ftag=_GI(20); ch=_GI(22); samp=_GI(24); bps=_GI(26); balign=_GI(28); spec=_GI(30); bytes=_GI(32); bits=_GI(34); byts=bits/8; if ( (strcmp((char *)h1,"RIFF")) || (strcmp((char *)type,"WAVE")) || (strcmp((char *)ID,"fmt ")) || (strcmp((char *)h2,"data")) || (lenh!=16) || (!byts) || (byts>2) || (!ch) || (ch>2) || (byts*ch!=bytes) || (ftag!=1) || (samp>48000) ) { fprintf(stderr,"Error: unsupported audio format!!\n"); exit(-1); } nn=samp/fr; fprintf(stderr,"# %u / %d bits / %s /",samp,bits,(ch==1)?"mono":"stereo"); fprintf(stderr,"/ chunk=%u / tt=%u / diff-treshh=%u / treshh=%u \n" ,nn,tt,trhd,trh); /*FIXME: set lenght to endless... */ fwrite(head,1,HEADRLEN,stdout); nx=0;mm1=0;mm2=0;b1=0;b2=0; rd=1; while(rd) { rd=fread(buff,1,samp*bytes/fr,stdin); //fprintf(stderr,"\n",rd); nx+=n;n=0; sum1=0;sum2=0;sumd1=0;sumd2=0; for (ii=0;ii>%ld %ld <-> %ld %ld\n",m1,m2,md1,md2); if (silent) { if ((m1>=trh) || (m2>=trh) || (md1>=trhd) || (md2>=trhd)) { fprintf(stderr,"Silence END at "); print_time(stderr,nx,samp*bytes); fprintf(stderr," (%08lx)\n",nx); silent=0;sc=0; } } else if ((md1