rs41: read wav-samples

dump
Zilog80 2015-11-15 22:00:30 +01:00
rodzic f51e608172
commit 5523d557ae
1 zmienionych plików z 26 dodań i 38 usunięć

Wyświetl plik

@ -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);