⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvsd.c

📁 linux下录音程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -