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

📄 vplay.c

📁 fix point版本的Ogg Vorbis decoder
💻 C
📖 第 1 页 / 共 2 页
字号:
              dsp_stereo = MODE_MONO;            else if (dsp_stereo) {	/* want Stereo */              /* shit, my MACRO dosn't work here */#ifdef SOUND_VERSION              if (ioctl(audio, SNDCTL_DSP_STEREO, &dsp_stereo) < 0) {#else              if (dsp_stereo != ioctl(audio, SNDCTL_DSP_STEREO, dsp_stereo)) { #endif                dsp_stereo = MODE_MONO;                 fprintf (stderr, "%s: can't play in Stereo; playing only one channel\n",                         command);                one_chn = 1;              }            }            was_extended = 0;          }          set_dsp_speed (dsp_speed);          break;        case 2:			/* nothing to do, pure data */#ifdef __STDC__          d_printf ((stderr, "Voice continuation\n"));#else /* __STDC__ */          d_printf ("Voice continuation\n");#endif /* __STDC__ */          break;        case 3:			/* a silence block, no data, only a count */          sp = (u_short *)data; COUNT(sizeof(u_short));          dsp_speed = (int)(*data); COUNT(1);          dsp_speed = 1000000 / (256 - dsp_speed);          sync_dsp();          set_dsp_speed (dsp_speed);          silence = ( ((u_long)*sp) * 1000) / dsp_speed; #ifdef __STDC__          d_printf ((stderr, "Silence for %d ms\n", silence));#else /* __STDC__ */          d_printf ("Silence for %d ms\n", silence);#endif /* __STDC__ */          write_zeros (*sp);          break;        case 4:			/* a marker for syncronisation, no effect */          sp = (u_short *)data; COUNT(sizeof(u_short));#ifdef __STDC__          d_printf ((stderr, "Marker %d\n", *sp)); #else /* __STDC__ */          d_printf ("Marker %d\n", *sp); #endif /* __STDC__ */          break;        case 5:			/* ASCII text, we copy to stderr */          output = 1;#ifdef __STDC__          d_printf ((stderr, "ASCII - text :\n"));#else /* __STDC__ */          d_printf ("ASCII - text :\n");#endif /* __STDC__ */          break;         case 6:			/* repeat marker, says repeatcount */          /* my specs don't say it: maybe this can be recursive, but             I don't think somebody use it */          repeat = *(u_short *)data; COUNT(sizeof(u_short));#ifdef __STDC__          d_printf ((stderr, "Repeat loop %d times\n", repeat));#else /* __STDC__ */          d_printf ("Repeat loop %d times\n", repeat);#endif /* __STDC__ */          if (filepos >= 0)	/* if < 0, one seek fails, why test another */            if ( (filepos = lseek (fd, 0, 1)) < 0 ) {              fprintf(stderr, "%s: can't play loops; %s isn't seekable\n",                       command, name);              repeat = 0;            }            else              filepos -= in_buffer;	/* set filepos after repeat */          else            repeat = 0;          break;        case 7:			/* ok, lets repeat that be rewinding tape */          if (repeat) {            if (repeat != 0xFFFF) {#ifdef __STDC__              d_printf ((stderr, "Repeat loop %d\n", repeat));#else /* __STDC__ */              d_printf ("Repeat loop %d\n", repeat);#endif /* __STDC__ */              --repeat;            }            else#ifdef __STDC__              d_printf ((stderr, "Neverending loop\n"));#else /* __STDC__ */              d_printf ("Neverending loop\n");#endif /* __STDC__ */            lseek (fd, filepos, 0);            in_buffer = 0;		/* clear the buffer */            goto Fill_the_buffer;          }          else#ifdef __STDC__            d_printf ((stderr, "End repeat loop\n"));#else /* __STDC__ */            d_printf ("End repeat loop\n");#endif /* __STDC__ */          break;        case 8:			/* the extension to play Stereo, I have SB 1.0 :-( */          was_extended = 1;          eb = (Ext_Block *)data; COUNT(sizeof(Ext_Block));          dsp_speed = (int)(eb->tc);          dsp_speed = 256000000L / (65536 - dsp_speed);          dsp_stereo = eb->mode;          if (dsp_stereo == MODE_STEREO)             dsp_speed = dsp_speed >> 1;          if (eb->pack) {     /* /dev/dsp can't it */            fprintf (stderr, "%s: can't play packed .voc files\n", command);            return;          }#ifdef __STDC__          d_printf ((stderr, "Extended block %s %d Hz\n", 				(eb->mode ? "Stereo" : "Mono"), dsp_speed));#else /* __STDC */          d_printf ("Extended block %s %d Hz\n", 				(eb->mode ? "Stereo" : "Mono"), dsp_speed);#endif /* __STDC__ */          break;        default:          fprintf (stderr, "%s: unknown blocktype %d. terminate.\n",                    command, bp->type);          return;      } 		/* switch (bp->type) */    }			/* while (! nextblock)  */    /* put nextblock data bytes to dsp */    l = min (in_buffer, nextblock);    if (l) {        if (output && !quiet_mode)        write (2, data, l);	/* to stderr */      else {        real_l = one_chn ? one_channel(data, l, one_chn, 0) : l;        if (write (audio, data, real_l) != real_l) {          perror (AUDIO);          exit(-1);        }      }      COUNT(l);    }  }			/* while(1) */}/* that was a big one, perhaps somebody split it :-) *//* setting the globals for playing raw data */void init_raw_data(void){  timelimit  = raw_info.timelimit;  dsp_speed  = raw_info.dsp_speed;  dsp_stereo = raw_info.dsp_stereo;  samplesize = raw_info.samplesize;}/* calculate the data count to read from/to dsp */u_long calc_count(void){  u_long count;  if (!timelimit)    count = 0x7fffffff;  else {    count = timelimit * dsp_speed;    if (dsp_stereo)      count *= 2;    if (samplesize != 8)      count *= 2;  }  return count;}/* write a .VOC-header */ void start_voc(int fd, u_long cnt){  VocHeader  vh;  BlockType  bt;  Voice_data vd;  Ext_Block  eb;   strncpy((char *)vh.magic,MAGIC_STRING,20);  vh.magic[19] = 0x1A;  vh.headerlen = sizeof(VocHeader);  vh.version = ACTUAL_VERSION;  vh.coded_ver = 0x1233 - ACTUAL_VERSION;  write (fd, &vh, sizeof(VocHeader));  if (dsp_stereo) {    /* write a extended block */    bt.type = 8;    bt.datalen = 4;    bt.datalen_m = bt.datalen_h = 0;    write (fd, &bt, sizeof(BlockType));    eb.tc = (u_short)(65536 - 256000000L / (dsp_speed << 1));    eb.pack = 0;    eb.mode = 1;    write (fd, &eb, sizeof(Ext_Block));  }  bt.type = 1;  cnt += sizeof(Voice_data);	/* Voice_data block follows */  bt.datalen   = (u_char)  (cnt & 0xFF);  bt.datalen_m = (u_char)( (cnt & 0xFF00) >> 8 );  bt.datalen_h = (u_char)( (cnt & 0xFF0000) >> 16 );  write (fd, &bt, sizeof(BlockType));  vd.tc = (u_char)(256 - (1000000 / dsp_speed) );  vd.pack = 0;  write (fd, &vd, sizeof(Voice_data) );} /* write a WAVE-header */void start_wave(int fd, u_long cnt){  WaveHeader wh;  wh.main_chunk = RIFF;  wh.length     = cnt + sizeof(WaveHeader) - 8;   wh.chunk_type = WAVE;  wh.sub_chunk  = FMT;  wh.sc_len     = 16;  wh.format     = PCM_CODE;  wh.modus      = dsp_stereo ? 2 : 1;  wh.sample_fq  = dsp_speed;  wh.byte_p_spl = (samplesize == 8) ? 1 : 2;  wh.byte_p_sec = dsp_speed * wh.modus * wh.byte_p_spl;  wh.bit_p_spl  = samplesize;  wh.data_chunk = DATA;  wh.data_length= cnt;  write (fd, &wh, sizeof(WaveHeader));}/* closing .VOC */void end_voc(int fd){  char dummy = 0;		/* Write a Terminator */  write (fd, &dummy, 1);  if (fd != 1)    close (fd);}void end_wave_raw(int fd){				/* only close output */  if (fd != 1)    close (fd);}/* playing/recording raw data, this proc handels WAVE files and   recording .VOCs (as one block) */ void recplay (int fd, int loaded, u_long count, int rtype, char *name){  int l, real_l;  u_long c;  char one_chn = 0;  char to_8 = 0;  int tmps;  sync_dsp();  if (!quiet_mode) {    fprintf (stderr, "%s %s : ",              (direction == PLAY) ? "Playing" : "Recording",             fmt_rec_table[rtype].what);    if (samplesize != 8)      fprintf(stderr, "%d bit, ", samplesize);    fprintf (stderr, "Speed %d Hz ", dsp_speed);    fprintf (stderr, "%s ...\n", dsp_stereo ? "Stereo" : "Mono");  }  tmps = samplesize;  IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, tmps);  if (tmps != samplesize) {    fprintf (stderr, "%s: unable to set %d bit sample size",              command, samplesize);    if (samplesize == 16) {      samplesize = 8;      IOCTL(audio, SNDCTL_DSP_SAMPLESIZE, samplesize);      if (samplesize != 8) {        fprintf(stderr, "%s: unable to set 8 bit sample size!\n", command);        exit (-1);      }      fprintf (stderr, "; playing 8 bit\n");      to_8 = 1;    }    else {      fprintf (stderr, "\n");      exit (-1);    }  }#ifdef SOUND_VERSION  if (ioctl (audio, SNDCTL_DSP_STEREO, &dsp_stereo) < 0) {#else    if (dsp_stereo != ioctl (audio, SNDCTL_DSP_STEREO, dsp_stereo) ) {#endif    if (direction == PLAY) {      fprintf (stderr, "%s: can't play in Stereo; playing only one channel\n",                command);      dsp_stereo = MODE_MONO;      one_chn = 1;    }    else {      fprintf (stderr, "%s: can't record in Stereo\n", command);      exit (-1);    }  }  set_dsp_speed (dsp_speed);   if (direction == PLAY) {    while (count) {      c = count;      if (c > abuf_size)        c = abuf_size;      if ((l = read (fd, (char *)audiobuf + loaded, c - loaded)) > 0) {        l += loaded; loaded = 0;	/* correct the count; ugly but ... */        real_l = (one_chn || to_8) ? one_channel(audiobuf, l, one_chn, to_8) : l;        if (write (audio, (char *)audiobuf, real_l) != real_l) {	  perror (AUDIO);	  exit (-1);	}        count -= l;      }      else {	if (l == -1) { 	  perror (name);          exit (-1);        }        count = 0;	/* Stop */      }    }			/* while (count) */  }  else {		/* we are recording */    while (count) {      c = count;      if (c > abuf_size)        c = abuf_size;      if ((l = read (audio, (char *)audiobuf, c)) > 0) {        if (write (fd, (char *)audiobuf, l) != l) {	  perror (name);	  exit (-1);	}        count -= l;      }      if (l == -1) {        perror (AUDIO);        exit (-1);      }    }			/* While count */  }}/*  let's play or record it (record_type says VOC/WAVE/raw)*/void record_play(char *name){  int fd, ofs;  if (direction == PLAY) {     if (!name) {      fd = 0;      name = "stdin";    }    else if ((fd = open (name, O_RDONLY, 0)) == -1) {      perror (name);      exit (-1);    }    /* read the file header */    read (fd, (char *)audiobuf, sizeof(VocHeader));    if ( (ofs = test_vocfile (audiobuf) ) >= 0)       vplay (fd, ofs, name);    else {      /* read bytes for WAVE-header */      read (fd,  (char *)audiobuf + sizeof(VocHeader),             sizeof(WaveHeader) - sizeof(VocHeader) );      if (test_wavefile (audiobuf) >= 0)        recplay (fd, 0, count, WAVE_FMT, name);      else {        /* should be raw data */        init_raw_data();        count = calc_count();        recplay (fd, sizeof(WaveHeader), count, RAW_DATA, name);      }    }    if (fd != 0)      close(fd);  }  else {		/* recording ... */    if (!name) {      fd = 1;      name = "stdout";    }    else {      if ((fd = open (name, O_WRONLY | O_CREAT, 0666)) == -1) {        perror (name);        exit (-1);      }    }    count = calc_count() & 0xFFFFFFFE;    /* WAVE-file should be even (I'm not sure), but wasting one byte       isn't a problem (this can only be in 8 bit mono) */    if (fmt_rec_table[record_type].start)      fmt_rec_table[record_type].start(fd, count);    recplay (fd, 0, count, record_type, name);    fmt_rec_table[record_type].end(fd);  }} 

⌨️ 快捷键说明

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