/* Broadcast 2.0 multitrack audio editing (c) 1997 Heroine Virtual This program is distributed with the intent that it will be useful, without any warranty. The code is being updated and has many bugs which are constantly being elucidated so changes should not be made without notifying the author. */ /* Run at startup to permanently allocate your DMA buffers */ #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int dsp; int duplexenable = 1; audio_buf_info playinfo, recinfo; int bufsize = 0x7FFF0000; int fragsize; int format = AFMT_S16_LE; int channels = 2; int samplerate = 44100; if(argc < 2) { bufsize += 15; } else { fragsize = atol(argv[1]); if(fragsize <= 0) fragsize = 32768; bufsize += (long)(log(fragsize) / log(2)); } #ifdef USE_FULLDUPLEX printf("*** Full duplex\n"); if((dsp = open("/dev/dsp", O_RDWR)) < 0){ printf("Can't open audio device.\n"); close(dsp); return 1; } if (ioctl(dsp, SNDCTL_DSP_SETFRAGMENT, &bufsize)) printf("Couldn't set buffer parameters.\n"); if(duplexenable && ioctl(dsp, SNDCTL_DSP_SETDUPLEX, 0) == -1){ printf("Couldn't enable full duplex audio.\n"); duplexenable = 0; } if(ioctl(dsp, SNDCTL_DSP_SETFMT, &format) < 0) printf("playback file format failed\n"); if(ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels) < 0) printf("playback channel allocation failed\n"); if(ioctl(dsp, SNDCTL_DSP_SPEED, &samplerate) < 0) printf("playback sample rate set failed\n"); ioctl(dsp, SNDCTL_DSP_GETOSPACE, &playinfo); printf(" fragments fragstotal fragsize bytes TOTAL BYTES AVAILABLE\n"); printf("Playback: %9d %10d %8d %7d %12d\n", playinfo.fragments, playinfo.fragstotal, playinfo.fragsize, playinfo.bytes, playinfo.bytes); if(duplexenable) { if(ioctl(dsp, SNDCTL_DSP_SETFMT, &format) < 0) printf("record file format failed\n"); if(ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels) < 0) printf("record channel allocation failed\n"); if(ioctl(dsp, SNDCTL_DSP_SPEED, &samplerate) < 0) printf("record sample rate set failed\n"); ioctl(dsp, SNDCTL_DSP_GETISPACE, &recinfo); printf("Record: %9d %10d %8d %7d %12d\n", recinfo.fragments, recinfo.fragstotal, recinfo.fragsize, recinfo.bytes, recinfo.fragstotal * recinfo.fragsize); } close(dsp); #endif printf("\n*** Half duplex\n"); if((dsp = open("/dev/dsp", O_WRONLY)) < 0){ printf("Can't open audio device.\n"); close(dsp); return 1; } if (ioctl(dsp, SNDCTL_DSP_SETFRAGMENT, &bufsize)) printf("Couldn't set buffer parameters.\n"); if(duplexenable && ioctl(dsp, SNDCTL_DSP_SETDUPLEX, 0) == -1){ printf("Couldn't enable full duplex audio.\n"); duplexenable = 0; } if(ioctl(dsp, SNDCTL_DSP_SETFMT, &format) < 0) printf("playback file format failed\n"); if(ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels) < 0) printf("playback channel allocation failed\n"); if(ioctl(dsp, SNDCTL_DSP_SPEED, &samplerate) < 0) printf("playback sample rate set failed\n"); ioctl(dsp, SNDCTL_DSP_GETOSPACE, &playinfo); printf(" fragments fragstotal fragsize bytes TOTAL BYTES AVAILABLE\n"); printf("Playback: %9d %10d %8d %7d %12d\n", playinfo.fragments, playinfo.fragstotal, playinfo.fragsize, playinfo.bytes, playinfo.bytes); close(dsp); if((dsp = open("/dev/dsp", O_RDONLY)) < 0){ printf("Can't open audio device.\n"); close(dsp); return 1; } if (ioctl(dsp, SNDCTL_DSP_SETFRAGMENT, &bufsize)) printf("Couldn't set buffer parameters.\n"); if(duplexenable && ioctl(dsp, SNDCTL_DSP_SETDUPLEX, 0) == -1){ printf("Couldn't enable full duplex audio.\n"); duplexenable = 0; } if(ioctl(dsp, SNDCTL_DSP_SETFMT, &format) < 0) printf("playback file format failed\n"); if(ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels) < 0) printf("playback channel allocation failed\n"); if(ioctl(dsp, SNDCTL_DSP_SPEED, &samplerate) < 0) printf("playback sample rate set failed\n"); if(ioctl(dsp, SNDCTL_DSP_SETFMT, &format) < 0) printf("record file format failed\n"); if(ioctl(dsp, SNDCTL_DSP_CHANNELS, &channels) < 0) printf("record channel allocation failed\n"); if(ioctl(dsp, SNDCTL_DSP_SPEED, &samplerate) < 0) printf("record sample rate set failed\n"); ioctl(dsp, SNDCTL_DSP_GETISPACE, &recinfo); printf("Record: %9d %10d %8d %7d %12d\n", recinfo.fragments, recinfo.fragstotal, recinfo.fragsize, recinfo.bytes, recinfo.fragstotal * recinfo.fragsize); ioctl(dsp, SNDCTL_DSP_RESET); close(dsp); return 0; }