📄 cvsd.c
字号:
p->com.phase &= 3; } return done;}/* ---------------------------------------------------------------------- */voidcvsdwrite(ft, buf, nsamp) ft_t ft;LONG *buf, nsamp;{ struct cvsdpriv *p = (struct cvsdpriv *) ft->priv; int done = 0; float inval;#ifdef DEBUG if (!dbg.f1) { if (!(dbg.f1 = fopen("dbg1", "w"))) fail("debugging"); fprintf(dbg.f1, "\"input\"\n"); } if (!dbg.f2) { if (!(dbg.f2 = fopen("dbg2", "w"))) fail("debugging"); fprintf(dbg.f2, "\"recon\"\n"); }#endif for(;;) { /* * check if the next input is due */ if (p->com.phase >= 4) { if (done >= nsamp) return; memmove(p->c.enc.input_filter+1, p->c.enc.input_filter, sizeof(p->c.enc.input_filter)-sizeof(float)); p->c.enc.input_filter[0] = (*buf++) / ((float)LONG_MAX); done++; } p->com.phase &= 3; /* insert input filter here! */ inval = float_conv(p->c.enc.input_filter, (p->cvsd_rate < 24000) ? (enc_filter_16[(p->com.phase >= 2)]) : (enc_filter_32[p->com.phase]), ENC_FILTERLEN); /* * encode one bit */ p->com.overload = (((p->com.overload << 1) | (inval > p->c.enc.recon_int)) & 7); p->com.mla_int *= p->com.mla_tc0; if ((p->com.overload == 0) || (p->com.overload == 7)) p->com.mla_int += p->com.mla_tc1; if (p->com.mla_int > p->com.v_max) p->com.v_max = p->com.mla_int; if (p->com.mla_int < p->com.v_min) p->com.v_min = p->com.mla_int; if (p->com.overload & 1) { p->c.enc.recon_int += p->com.mla_int; p->bit.shreg |= p->bit.mask; } else p->c.enc.recon_int -= p->com.mla_int; if ((++(p->bit.cnt)) >= 8) { putc(p->bit.shreg, ft->fp); p->bytes_written++; p->bit.shreg = p->bit.cnt = 0; p->bit.mask = p->swapbits ? 0x80 : 1; } else { if (p->swapbits) p->bit.mask >>= 1; else p->bit.mask <<= 1; } p->com.phase += p->com.phase_inc;#ifdef DEBUG fprintf(dbg.f1, "%f %f\n", (double)dbg.cnt, (double)inval); fprintf(dbg.f2, "%f %f\n", (double)dbg.cnt, (double)p->c.enc.recon_int); dbg.cnt++;#endif }}/* ---------------------------------------------------------------------- *//* * DVMS file header */struct dvms_header { char Filename[14]; unsigned Id; unsigned State; time_t Unixtime; unsigned Usender; unsigned Ureceiver; ULONG Length; unsigned Srate; unsigned Days; unsigned Custom1; unsigned Custom2; char Info[16]; char extend[64]; unsigned Crc;};#define DVMS_HEADER_LEN 120/* ---------------------------------------------------------------------- */static ULONG get32(p)unsigned char **p;{ ULONG val = (((*p)[3]) << 24) | (((*p)[2]) << 16) | (((*p)[1]) << 8) | (**p); (*p) += 4; return val;}static unsigned get16(p)unsigned char **p;{ unsigned val = (((*p)[1]) << 8) | (**p); (*p) += 2; return val;}static void put32(p, val)unsigned char **p;ULONG val;{ *(*p)++ = val & 0xff; *(*p)++ = (val >> 8) & 0xff; *(*p)++ = (val >> 16) & 0xff; *(*p)++ = (val >> 24) & 0xff;}static void put16(p, val)unsigned char **p;unsigned val;{ *(*p)++ = val & 0xff; *(*p)++ = (val >> 8) & 0xff;}/* ---------------------------------------------------------------------- */static void dvms_read_header(f, hdr)FILE *f;struct dvms_header *hdr;{ unsigned char hdrbuf[DVMS_HEADER_LEN]; unsigned char *pch = hdrbuf; int i; unsigned sum; if (fread(hdrbuf, sizeof(hdrbuf), 1, f) != 1) fail("unable to read DVMS header\n"); for(i = sizeof(hdrbuf), sum = 0; i > /*2*/3; i--) /* Deti bug */ sum += *pch++; pch = hdrbuf; memcpy(hdr->Filename, pch, sizeof(hdr->Filename)); pch += sizeof(hdr->Filename); hdr->Id = get16(&pch); hdr->State = get16(&pch); hdr->Unixtime = get32(&pch); hdr->Usender = get16(&pch); hdr->Ureceiver = get16(&pch); hdr->Length = get32(&pch); hdr->Srate = get16(&pch); hdr->Days = get16(&pch); hdr->Custom1 = get16(&pch); hdr->Custom2 = get16(&pch); memcpy(hdr->Info, pch, sizeof(hdr->Info)); pch += sizeof(hdr->Info); memcpy(hdr->extend, pch, sizeof(hdr->extend)); pch += sizeof(hdr->extend); hdr->Crc = get16(&pch); if (sum != hdr->Crc) fail("DVMS header checksum error, read %u, calculated %u\n", hdr->Crc, sum);}/* ---------------------------------------------------------------------- *//* * note! file must be seekable */static void dvms_write_header(f, hdr)FILE *f;struct dvms_header *hdr;{ unsigned char hdrbuf[DVMS_HEADER_LEN]; unsigned char *pch = hdrbuf; unsigned char *pchs = hdrbuf; int i; unsigned sum; memcpy(pch, hdr->Filename, sizeof(hdr->Filename)); pch += sizeof(hdr->Filename); put16(&pch, hdr->Id); put16(&pch, hdr->State); put32(&pch, hdr->Unixtime); put16(&pch, hdr->Usender); put16(&pch, hdr->Ureceiver); put32(&pch, hdr->Length); put16(&pch, hdr->Srate); put16(&pch, hdr->Days); put16(&pch, hdr->Custom1); put16(&pch, hdr->Custom2); memcpy(pch, hdr->Info, sizeof(hdr->Info)); pch += sizeof(hdr->Info); memcpy(pch, hdr->extend, sizeof(hdr->extend)); pch += sizeof(hdr->extend); for(i = sizeof(hdrbuf), sum = 0; i > /*2*/3; i--) /* Deti bug */ sum += *pchs++; hdr->Crc = sum; put16(&pch, hdr->Crc); if (fseek(f, 0, SEEK_SET) < 0) fail("cannot write DVMS header, seek failed\n"); if (fwrite(hdrbuf, sizeof(hdrbuf), 1, f) != 1) fail("cannot write DVMS header\n");}/* ---------------------------------------------------------------------- */static void make_dvms_hdr(ft, hdr)ft_t ft;struct dvms_header *hdr;{ struct cvsdpriv *p = (struct cvsdpriv *) ft->priv; int len; memset(hdr->Filename, 0, sizeof(hdr->Filename)); len = strlen(ft->filename); if (len >= sizeof(hdr->Filename)) len = sizeof(hdr->Filename)-1; memcpy(hdr->Filename, ft->filename, len); hdr->Id = hdr->State = 0; hdr->Unixtime = time(NULL); hdr->Usender = hdr->Ureceiver = 0; hdr->Length = p->bytes_written; hdr->Srate = p->cvsd_rate/100; hdr->Days = hdr->Custom1 = hdr->Custom2 = 0; memset(hdr->Info, 0, sizeof(hdr->Info)); len = strlen(ft->comment); if (len >= sizeof(hdr->Info)) len = sizeof(hdr->Info)-1; memcpy(hdr->Info, ft->comment, len); memset(hdr->extend, 0, sizeof(hdr->extend));}/* ---------------------------------------------------------------------- */void dvmsstartread(ft) ft_t ft;{ struct cvsdpriv *p = (struct cvsdpriv *) ft->priv; struct dvms_header hdr; dvms_read_header(ft->fp, &hdr); report("DVMS header of source file \"%s\":"); report(" filename \"%.14s\"",ft->filename); report(" id 0x%x", hdr.Filename); report(" state 0x%x", hdr.Id, hdr.State); report(" time %s",ctime(&hdr.Unixtime)); /* ctime generates lf */ report(" usender %u", hdr.Usender); report(" ureceiver %u", hdr.Ureceiver); report(" length %u", hdr.Length); report(" srate %u", hdr.Srate); report(" days %u", hdr.Days); report(" custom1 %u", hdr.Custom1); report(" custom2 %u", hdr.Custom2); report(" info \"%.16s\"\n", hdr.Info); ft->info.rate = (hdr.Srate < 240) ? 16000 : 32000; report("DVMS rate %dbit/s using %dbit/s deviation %d%%\n", hdr.Srate*100, ft->info.rate, ((ft->info.rate - hdr.Srate*100) * 100) / ft->info.rate); cvsdstartread(ft); p->swapbits = 0;}/* ---------------------------------------------------------------------- */void dvmsstartwrite(ft) ft_t ft;{ struct cvsdpriv *p = (struct cvsdpriv *) ft->priv; struct dvms_header hdr; cvsdstartwrite(ft); make_dvms_hdr(ft, &hdr); dvms_write_header(ft->fp, &hdr); if (!ft->seekable) warn("Length in output .DVMS header will wrong since can't seek to fix it"); p->swapbits = 0;}/* ---------------------------------------------------------------------- */voiddvmsstopwrite(ft)ft_t ft;{ struct dvms_header hdr; cvsdstopwrite(ft); if (!ft->seekable) return; if (fseek(ft->fp, 0L, 0) != 0) fail("Can't rewind output file to rewrite DVMS header."); make_dvms_hdr(ft, &hdr); dvms_write_header(ft->fp, &hdr);}/* ---------------------------------------------------------------------- */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -