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

📄 cdda2au.c

📁 读取音乐光盘磁道为磁盘文件的程序
💻 C
字号:
/* * $Id: cdda2au.c,v 1.1 1997/10/14 07:39:51 jim Exp $ * Convert .cdr to .au * * $Log: cdda2au.c,v $ * Revision 1.1  1997/10/14 07:39:51  jim * Initial revision * * Revision 1.1  1997/10/14 06:47:47  jim * Initial revision * */#include <sys/fcntl.h>#include <stdio.h>#define CDDABLKSIZE 2352unsigned char *ulawmap;unsigned char linear_to_ulaw();int convert(unsigned char *);/* * Audio file header format. */typedef unsigned long	u_32;struct auheader {	u_32	magic;	u_32	hdr_size;	u_32	data_size;	u_32	encoding;	u_32	sample_rate;	u_32	channels;};intmain(int argc, char **argv){  unsigned char *in_buf, *out_buf, tmp, *ptr, *ptr2;  int in_fd, out_fd, val, ctr;  int num_read = 1, out_len;  struct auheader hdr;/*    ulawmap = (unsigned char *) malloc(65536);  for(val = 0; val < 65536; val++)    ulawmap[val] = linear_to_ulaw(val - 32768);  ulawmap += 32768;  */  if(argc < 2)    {      fprintf(stderr, "Convert from CDDA format to 16bit Sun .au format\n");      fprintf(stderr, "usage:\n");      fprintf(stderr, "%s <infile> <outfile>\n", argv[0]);      exit(1);    }    in_fd = open(argv[1], O_RDONLY);  if(in_fd < 0)    {      fprintf(stderr, "can't open input file %s\n", argv[1]);      exit(1);    }  out_fd = open(argv[2], O_WRONLY | O_CREAT, 0666);  if(out_fd < 0)    {      fprintf(stderr, "can't create output file %s\n", argv[2]);      exit(1);    }    hdr.magic = 0x2e736e64;  hdr.hdr_size = sizeof(hdr) + 28;  hdr.data_size = 16;  hdr.encoding = 3;  hdr.sample_rate = 44100;  hdr.channels = 2;    write(out_fd, hdr, sizeof(hdr));  write(out_fd, "Recorded from CD by WorkMan", 28);    in_buf = (unsigned char *) malloc(CDDABLKSIZE * 2);  out_buf = (unsigned char *) malloc(CDDABLKSIZE * 2);    while(num_read)    {      num_read = read(in_fd, in_buf, CDDABLKSIZE);      if(num_read < 0)	{	  fprintf(stderr, "Error reading from file\n");	  exit (1);	}            if(num_read > 0)	{/*	  	  ptr = in_buf;	  ptr2 = out_buf;	  for(ctr = 0; ctr < num_read / 2; ctr++)	    {	      tmp = *ptr++;	      *ptr2++ = *ptr++;	      *ptr2++ = tmp;	    }*//*	  out_len = convert(out_buf);*/	  write(out_fd, in_buf, num_read);	}    }    close(in_fd);  close(out_fd);}intconvert(unsigned char *buf){  short *buf16 = (short *) buf;  int ctr, ctr2, samples;  int mono_value;  unsigned char *bufend = buf + CDDABLKSIZE;    for(ctr = 0; buf16 < (short *)(bufend); ctr++)    {      samples = (ctr & 1) ? ((ctr % 20) ? 10 : 12) : 12;            if(buf16 + samples > (short *)(bufend))	samples = ((short *)bufend) - buf16;           mono_value = 0;      for(ctr2 = 0; ctr2 < samples; ctr2++)	mono_value += *buf16++;      mono_value /= samples;      buf[ctr] = ulawmap[mono_value];    }    return ctr;}		  /*** This routine converts from linear to ulaw.**** Craig Reese: IDA/Supercomputing Research Center** Joe Campbell: Department of Defense** 29 September 1989**** References:** 1) CCITT Recommendation G.711  (very difficult to follow)** 2) "A New Digital Technique for Implementation of Any**     Continuous PCM Companding Law," Villeret, Michel,**     et al. 1973 IEEE Int. Conf. on Communications, Vol 1,**     1973, pg. 11.12-11.17** 3) MIL-STD-188-113,"Interoperability and Performance Standards**     for Analog-to_Digital Conversion Techniques,"**     17 February 1987**** Input: Signed 16 bit linear sample** Output: 8 bit ulaw sample*/#define ZEROTRAP    /* turn on the trap as per the MIL-STD */#define BIAS 0x84               /* define the add-in bias for 16 bit samples */#define CLIP 32635 unsigned charlinear_to_ulaw( sample )int sample;{	static int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,				   4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,				   5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,				   5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,				   6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,				   6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,				   6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,				   6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,				   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};	int sign, exponent, mantissa;	unsigned char ulawbyte; 	/* Get the sample into sign-magnitude. */	sign = (sample >> 8) & 0x80;            /* set aside the sign */	if ( sign != 0 ) sample = -sample;              /* get magnitude */	if ( sample > CLIP ) sample = CLIP;             /* clip the magnitude */ 	/* Convert from 16 bit linear to ulaw. */	sample = sample + BIAS;	exponent = exp_lut[( sample >> 7 ) & 0xFF];	mantissa = ( sample >> ( exponent + 3 ) ) & 0x0F;	ulawbyte = ~ ( sign | ( exponent << 4 ) | mantissa );#ifdef ZEROTRAP	if ( ulawbyte == 0 ) ulawbyte = 0x02;   /* optional CCITT trap */#endif 	return ulawbyte;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -