From 5523d557aefe49cffd898a4ac3c85b2c98f6811f Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Sun, 15 Nov 2015 22:00:30 +0100 Subject: [PATCH] rs41: read wav-samples --- rs41/rs41stdin.c | 64 ++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 38 deletions(-) diff --git a/rs41/rs41stdin.c b/rs41/rs41stdin.c index 5b73d46..98943ba 100644 --- a/rs41/rs41stdin.c +++ b/rs41/rs41stdin.c @@ -93,59 +93,47 @@ int findstr(char *buff, char *str, int pos) { } int read_wav_header(FILE *fp) { - char txt[5] = "\0\0\0\0"; - char buff[4]; + char txt[4+1] = "\0\0\0\0"; + unsigned char dat[4]; int byte, p=0; - // long pos_fmt, pos_dat; - char fmt_[5] = "fmt "; - char data[5] = "data"; - //if (fseek(fp, 0L, SEEK_SET)) return -1; if (fread(txt, 1, 4, fp) < 4) return -1; if (strncmp(txt, "RIFF", 4)) return -1; - + if (fread(txt, 1, 4, fp) < 4) return -1; // pos_WAVE = 8L if (fread(txt, 1, 4, fp) < 4) return -1; - if (fread(txt, 1, 4, fp) < 4) return -1; if (strncmp(txt, "WAVE", 4)) return -1; - // pos_fmt = 12L for ( ; ; ) { if ( (byte=fgetc(fp)) == EOF ) return -1; - buff[p % 4] = byte; + txt[p % 4] = byte; p++; if (p==4) p=0; - if (findstr(buff, fmt_, p) == 4) break; + if (findstr(txt, "fmt ", p) == 4) break; } - - if (fread(buff, 1, 4, fp) < 4) return -1; - //memcpy(&byte, buff, 4); fprintf(stderr, "fmt_length : %04x\n", byte); - if (fread(buff, 1, 2, fp) < 2) return -1; - //byte = buff[0] + (buff[1] << 8); fprintf(stderr, "fmt_tag : %04x\n", byte & 0xFFFF); - if (fread(buff, 1, 2, fp) < 2) return -1; - channels = buff[0] + (buff[1] << 8); - //fprintf(stderr, "channels : %d\n", channels & 0xFFFF); - if (fread(buff, 1, 4, fp) < 4) return -1; - memcpy(&sample_rate, buff, 4); - //fprintf(stderr, "samplerate : %d\n", sample_rate); - if (fread(buff, 1, 4, fp) < 4) return -1; - //memcpy(&byte, buff, 4); fprintf(stderr, "bytes/sec : %d\n", byte); - if (fread(buff, 1, 2, fp) < 2) return -1; - byte = buff[0] + (buff[1] << 8); - //fprintf(stderr, "block_align: %04x\n", byte & 0xFFFF); - if (fread(buff, 1, 2, fp) < 2) return -1; - bits_sample = buff[0] + (buff[1] << 8); - //fprintf(stderr, "bits/sample: %d\n", bits_sample & 0xFFFF); + if (fread(dat, 1, 4, fp) < 4) return -1; + if (fread(dat, 1, 2, fp) < 2) return -1; + + if (fread(dat, 1, 2, fp) < 2) return -1; + channels = dat[0] + (dat[1] << 8); + + if (fread(dat, 1, 4, fp) < 4) return -1; + memcpy(&sample_rate, dat, 4); //sample_rate = dat[0]|(dat[1]<<8)|(dat[2]<<16)|(dat[3]<<24); + + if (fread(dat, 1, 4, fp) < 4) return -1; + if (fread(dat, 1, 2, fp) < 2) return -1; + //byte = dat[0] + (dat[1] << 8); + + if (fread(dat, 1, 2, fp) < 2) return -1; + bits_sample = dat[0] + (dat[1] << 8); // pos_dat = 36L + info - //if (fread(txt, 1, 4, fp) < 4) return -1; - //fprintf(stderr, "data: %s\n", txt); for ( ; ; ) { if ( (byte=fgetc(fp)) == EOF ) return -1; - buff[p % 4] = byte; + txt[p % 4] = byte; p++; if (p==4) p=0; - if (findstr(buff, data, p) == 4) break; + if (findstr(txt, "data", p) == 4) break; } - if (fread(buff, 1, 4, fp) < 4) return -1; + if (fread(dat, 1, 4, fp) < 4) return -1; fprintf(stderr, "sample_rate: %d\n", sample_rate); @@ -181,7 +169,7 @@ int read_signed_sample(FILE *fp) { // int = i32_t } - if (bits_sample == 8) return ret-128; + if (bits_sample == 8) return ret-128; // 8bit: 00..FF, centerpoint 0x80=128 if (bits_sample == 16) return (short)ret; return ret; @@ -191,7 +179,7 @@ int par=1, par_alt=1; unsigned long sample_count = 0; int read_bits_fsk(FILE *fp, int *bit, int *len) { - int n, sample, y0; + int n, sample=0, y0; float l, x1; static float x0; @@ -202,7 +190,7 @@ int read_bits_fsk(FILE *fp, int *bit, int *len) { if (sample == EOF_INT) return EOF; sample_count++; par_alt = par; - par = (sample > 0) ? 1 : -1; + par = (sample >= 0) ? 1 : -1; // 8bit: 0..127,128..255 (-128..-1,0..127) n++; } while (par*par_alt > 0);