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

📄 sound2sun.c

📁 linux下录音程序
💻 C
字号:
/************************************************************************//*      Copyright 1989 by Rich Gopstein and Harris Corporation          *//*                                                                      *//*      Permission to use, copy, modify, and distribute this software   *//*      and its documentation for any purpose and without fee is        *//*      hereby granted, provided that the above copyright notice        *//*      appears in all copies and that both that copyright notice and   *//*      this permission notice appear in supporting documentation, and  *//*      that the name of Rich Gopstein and Harris Corporation not be    *//*      used in advertising or publicity pertaining to distribution     *//*      of the software without specific, written prior permission.     *//*      Rich Gopstein and Harris Corporation make no representations    *//*      about the suitability of this software for any purpose.  It     *//*      provided "as is" without express or implied warranty.           *//************************************************************************//************************************************************************//* sound2sun.c - Convert sampled audio files into uLAW format for the   *//*               Sparcstation 1.                                        *//*               Send comments to ..!rutgers!soleil!gopstein            *//************************************************************************//*									*//*  Modified November 27, 1989 to convert to 8000 samples/sec           *//*   (contrary to man page)                                             *//*  Modified December 13, 1992 to write standard Sun .au header with	*//*   unspecified length.  Also made miscellaneous changes for 		*//*   VMS port.  (K. S. Kubo, ken@hmcvax.claremont.edu)			*//*  Fixed Bug with converting slow sample speeds			*//*									*//************************************************************************/#include <stdio.h>#define DEFAULT_FREQUENCY 11000#ifdef VAXC#define	READ_OPEN	"r", "mbf=16", "shr=get"#define WR_OPEN		"w", "mbf=16"#else#define READ_OPEN	"r"#define WR_OPEN		"w"#endifFILE *infile, *outfile;/* convert two's complement ch into uLAW format */unsigned int cvt(ch)int ch;{  int mask;  if (ch < 0) {    ch = -ch;    mask = 0x7f;  } else {    mask = 0xff;  }  if (ch < 32) {    ch = 0xF0 | 15 - (ch / 2);  } else if (ch < 96) {    ch = 0xE0 | 15 - (ch - 32) / 4;  } else if (ch < 224) {    ch = 0xD0 | 15 - (ch - 96) / 8;  } else if (ch < 480) {    ch = 0xC0 | 15 - (ch - 224) / 16;  } else if (ch < 992) {    ch = 0xB0 | 15 - (ch - 480) / 32;  } else if (ch < 2016) {    ch = 0xA0 | 15 - (ch - 992) / 64;  } else if (ch < 4064) {    ch = 0x90 | 15 - (ch - 2016) / 128;  } else if (ch < 8160) {    ch = 0x80 | 15 - (ch - 4064) /  256;  } else {    ch = 0x80;  }return (mask & ch);}/* write a "standard" sun header with an unspecified length */#define wrulong(fp, ul) putc((ul >> 24) & 0xff, fp); \    putc((ul >> 16) & 0xff, fp); putc((ul >> 8) & 0xff, fp); \    putc(ul & 0xff, fp);static voidwr_header(optr)FILE *optr;{    wrulong(optr, 0x2e736e64);	/* Sun magic */    wrulong(optr, 24);		/* header size in bytes */    wrulong(optr, ((unsigned)(~0)));	/* unspecified data size */    wrulong(optr, 1);		/* Sun uLaw format */    wrulong(optr, 8000);	/* sample rate by definition :-) */    wrulong(optr, 1);		/* single channel */}/*******************************************************/*                                                     *//* Usage is "sound2sun [-f frequency] infile outfile"  *//*                                                     *//* "frequency" is the samples per second of the infile *//* the outfile is always 8000 samples per second.      *//*                                                     *//*******************************************************//***********************************************************************//*                                                                     *//* The input file is expected to be a stream of one-byte excess-128    *//* samples.  Each sample is converted to 2's complement by subtracting *//* 128, then converted to uLAW and output.  We calculate the proper    *//* number of input bytes to skip in order to make the sample frequency *//* convert to 8000/sec properly.  Interpolation could be added, but it *//* doesn't appear to be necessary.                                     *//*                                                                     *//***********************************************************************/main(argc, argv)int argc;char *argv[];{  float sum = 0;  float frequency, increment;  unsigned char ch;  unsigned char ulaw;  int chr;  if ((argc != 3) && (argc != 5)) {    fprintf(stderr,"Usage: sound2sun [-f frequency] infile outfile\n");    exit(1);  }  if (argc == 5) {    if (strcmp(argv[1], "-f") != 0) {      fprintf(stderr, "Usage: sound2sun [-f frequency] infile outfile\n");      exit(1);    } else {      frequency = atoi(argv[2]);    }  } else {    frequency = DEFAULT_FREQUENCY;  }  if ((infile = fopen(argv[argc-2], READ_OPEN)) == NULL) {    perror("Error opening infile");    exit(0);  }  if ((outfile = fopen(argv[argc-1], WR_OPEN)) == NULL) {    perror("Error opening outfile");    exit(0);  }  wr_header(outfile);  /* increment is the number of bytes to read each time */  increment = frequency / 8000;  ch = fgetc(infile);  while (!feof(infile)) {    /* convert the excess 128 to two's complement */    chr = 0x80 - ch;    /* increase the volume */    /* convert to uLAW */    ulaw = cvt(chr * 16);    /* output it */    fputc((char) ulaw, outfile);    /* skip enough input bytes to compensate for sampling frequency diff */    sum += increment;    while(sum > 0) {      if (!feof(infile)) ch = fgetc(infile);      sum--;    }  }  fclose(infile);  fclose(outfile);}/*  DEC/CMS REPLACEMENT HISTORY, Element SOUND2SUN.C *//*  *1    14-DEC-1992 17:46:37 CENYDD "main program" *//*  DEC/CMS REPLACEMENT HISTORY, Element SOUND2SUN.C */

⌨️ 快捷键说明

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