#include #include #include #include #include #define ST_CEKA_ZAVADECI 0 #define ST_LONG 1 #define ST_SHORT40 2 #define ST_SHORT20 3 #define ST_HLAVICKA 4 #define ST_TELO 5 int main(int argc, char *argv[]) { bool turbo=false; int f; long b=0; long ttt[100]; int stav=ST_CEKA_ZAVADECI; unsigned char c[2048],c0=0; unsigned char hlavicka[128+2]; unsigned char telo[65536+2]; unsigned int telolen=0; unsigned char min=128,max=128,center,min1=128,max1=128; int hli=0; unsigned int tei=0; int bit=0; int t=0,ct=0,rd; float t0=0; int cislofajlu=0; for(int i=1;i<100;i++) ttt[i]=0; if (argc>1) { f=open(argv[1],O_RDONLY|O_BINARY); if (f<0) { perror("Nelze otevrit soubor"); exit(1); } while ((rd=read(f,c,sizeof(c)))>0) for(int i=0;imax1) max1=c[i]; if (t>=110) { min=128;max=128;min1=128;max1=128; } center=(((int)min)+((int)max)+1l)>>1l; if (((c[i]>=center)&&(c05)) { min=min1;max=max1;min1=c0;max1=c[i]; switch (stav) { case ST_CEKA_ZAVADECI: if (ct++) { if ((tt0-5)) { t0=t*0.05 + t0*0.95; } else { if ((ct>100)&&(t>(t0*3)/2)) { t0=(t0*3)/2; stav=ST_LONG; ct=1; break; } ct=0; } } else { t0=t; } break; case ST_LONG: if (t>t0) ct++; else { printf("LONG:%d;t0=%.1f;t=%d\n",ct,t0,t); if (ct==40) { stav=ST_SHORT40;ct=1; } else if (ct==20) { stav=ST_SHORT20;ct=1; } else { stav=ST_CEKA_ZAVADECI;ct=0; } } break; case ST_SHORT40: if (t0) hlavicka[hli]=(hlavicka[hli]<<1)+((t>t0)?1:0); bit++; if (bit>8) { bit=0; printf("%02X ",hlavicka[hli]); hli++; if (!(hli&7)) printf("\n"); if (hli>=130) { unsigned short crc=0; for(int i=0;i<128;i++) for(int j=1;j<256;j<<=1) if (hlavicka[i]&j) crc++; printf("\ncrc=%04X\n",crc); if (crc==(hlavicka[128]<<8)+hlavicka[129]) printf("crc OK!\n"); telolen=(hlavicka[19]<<8)+hlavicka[18]; stav=ST_CEKA_ZAVADECI;ct=0; if ((hlavicka[0x12]==0x5A)&& (hlavicka[0x13]==0x00)&& (hlavicka[0x14]==0x00)&& (hlavicka[0x15]==0xD4)&& (hlavicka[0x16]==0x00)&& (hlavicka[0x17]==0xD4)) { turbo=true; } else turbo=false; } } break; case ST_TELO: if ((t<100)&&(t>0)) ttt[t]++; if (!bit) { telo[tei]=0; if (!(t>t0)) { printf("\nchyba synchronizace %.3fs !!!\n",b/48000.0); break; } } if (bit>0) telo[tei]=(telo[tei]<<1)+((t>t0)?1:0); bit++; if (bit>8) { bit=0; /*if (tei=telolen+2) { unsigned short crc=0; for(unsigned int i=0;i='0')&&(x<='9')) {x=x;} else if ((x>='A')&&(x<='Z')) {x=x;} //mala pismena else if (x==0xA1) {x='a';} else if (x==0x9A) {x='b';} else if (x==0x9F) {x='c';} else if (x==0x9C) {x='d';} else if (x==0x92) {x='e';} else if (x==0xAA) {x='f';} else if (x==0x97) {x='g';} else if (x==0x98) {x='h';} else if (x==0xA6) {x='i';} else if (x==0xAF) {x='j';} else if (x==0xA9) {x='k';} else if (x==0xB8) {x='l';} else if (x==0xB3) {x='m';} else if (x==0xB0) {x='n';} else if (x==0xB7) {x='o';} else if (x==0x9E) {x='p';} else if (x==0xA0) {x='q';} else if (x==0x9D) {x='r';} else if (x==0xA4) {x='s';} else if (x==0x96) {x='t';} else if (x==0xA5) {x='u';} else if (x==0xAB) {x='v';} else if (x==0xA3) {x='w';} else if (x==0x9B) {x='x';} else if (x==0xBD) {x='y';} else if (x==0xA2) {x='z';} else continue; jmeno[i]=x; } if (turbo) { memcpy(&hlavicka[0x12],&telo[0x4D],0x0D); telolen=(hlavicka[19]<<8)+hlavicka[18]; turbo=false; } else { cislofajlu++; sprintf(&jmeno[18],"%03d.MZF",cislofajlu); fw=open(jmeno,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,0x777); if (fw) { write(fw,hlavicka,128); write(fw,telo,telolen); close(fw); } } } //hotovo stav=ST_CEKA_ZAVADECI;ct=0; } } break; } t=0; } c0=c[i]; } close(f); } else { printf("\n"); printf("Usage: %s <8bit-mono-*.wav-filename>\n",argv[0]); printf(" - convert wav to *.MZF files\n"); } return 0; }