📄 vplay.c
字号:
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 + -