Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!samsung!sdd.hp.com!decwrl!sgi!shinobu!odin!dave From: dave@sgi.com (dave "who can do? ratmandu!" ratcliffe) Newsgroups: comp.sys.sgi Subject: Re: /dev/audio examples / applications? Message-ID: <11047@odin.corp.sgi.com> Date: 27 Jul 90 20:13:02 GMT References: Sender: news@odin.corp.sgi.com Organization: Silicon Graphics, Inc., Mountain View, CA Lines: 210 In article guido@cwi.nl (Guido van Rossum) writes: >We just discovered /dev/audio in IRIX 3.2 for the PI, but there seem to >be no standard programs to use it. Anybody got interesting software to >apply this? Or even pointers? in 3.3.1 (coming "soon" to your town) we've got 1 (sorry, only 1 for now...) audio prog down in /usr/people/4Dgifts/examples/audio. to tide you over, the Makefile, README, and audio.c files follow: *************** /usr/people/4Dgifts/examples/audio/Makefile: SHELL = /bin/sh PROGS=audio CFLAGS= -O -s all: $(PROGS) clean: rm -f *.o $(PROGS) .c: $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) *************** /usr/people/4Dgifts/examples/audio/README: README for audio programming examples The capability for audio input/output currently only exists on 4D/2* machines (i.e. Personal IRIS machines ONLY). Admittedly, information about this functionality is sparse, but things WILL be improving fairly soon now. At this stage, a little bit of source code example is better than none... audio.c: demos how to digitally record microphone input to a Personal IRIS (4D/20 or 4D/25) and place the data into a file, as well as playing back the sounds already recorded. *************** /usr/people/4Dgifts/examples/audio/audio.c: /* * audio.c: * * This test program was initially written to demonstrate how one would * digitally record microphone input to a Personal Iris and place the data * into a file (execute "audio -i -opts"). Alternately, you can play back * the sounds or voice that you have recorded (execute "audio -o -opts"). * All that is needed to use this program is an 8 ohm speaker connected to * the audio output and a 600 ohm microphone connected to the microphone * input. The other audio input may be used to connect a higher level audio * signal that doesn't require pre-amplification. * * resusitated by (& hats off to) Frank Demcak -- February, 1990 */ #include #include #include main(argc, argv) int argc; char *argv[]; { int size, gain=100, rate=2, iflag, oflag, gflag, sflag, fflag,rflag; char *file, *buffer; int in, out, audio,i; if ( argc == 1 ) { usage: fprintf(stderr,"usage: %s -i [-g (0-255)gain] ", argv[0]); fprintf(stderr,"[-r (0-3)rate] -f file [-s size]\n"); fprintf(stderr," %s -o [-g (0-255)gain] ", argv[0]); fprintf(stderr,"[-r (0-3)rate] -f file [-s size]\n"); exit(1); } /* Parse the record/playback options */ for ( i = 1; i < argc; i++ ) { if ( !strcmp(argv[i],"-i") ) iflag++; else if ( !strcmp(argv[i],"-o") ) oflag++; else if ( !strcmp(argv[i],"-g") ) { gflag++; gain = atoi(argv[++i]); } else if ( !strcmp(argv[i],"-r") ) { rflag++; rate = atoi(argv[++i]); } else if ( !strcmp(argv[i],"-f") ) { fflag++; file = argv[++i]; } else if ( !strcmp(argv[i],"-s") ) { sflag++; size = atoi(argv[++i]); } else goto usage; } /* Open input or output file for record/playback */ if ( iflag ) { if (fflag) { /* Create a Read Write file and set permissions */ out = open(file, O_CREAT|O_RDWR); chmod (file,00666); } else out = 1; } else if ( oflag ) { if (fflag) /* Just open file for reading */ in = open(file, O_RDONLY); else in = 0; } else { fprintf(stderr, "must specify one of -o or -i\n"); exit(1); } /* printf test diag statements printf("iflag=%i\n",iflag); printf("oflag=%i\n",oflag); printf("gflag=%i\n",gflag); printf(" gain =%d\n",gain); printf("rflag=%i\n",rflag); printf(" rate =%d\n",rate); printf("fflag=%i\n",fflag); printf(" file Name=%s\n",file); printf("sflag=%i\n",sflag); printf(" file size=%d\n",size); */ /* Open audio port as a character device */ audio = open( "/dev/audio", O_RDWR ); /* This part doesn't seem to work as advertised */ /* Investigating how to turn off output while input is being recorded */ if ( gflag ) if ( iflag ) { ioctl(audio, AUDIOCSETINGAIN, gain); ioctl(audio, AUDIOCSETOUTGAIN, 0); } else { ioctl(audio, AUDIOCSETINGAIN, 0); ioctl(audio, AUDIOCSETOUTGAIN, gain); } /* set audio sampling rate 0=none?,1=8k,2=16k,3=32k samples per sec */ if ( rflag ) ioctl(audio, AUDIOCSETRATE, rate); if ( iflag ) { if ( ! sflag ) { fprintf(stderr,"must set a size for input\n"); exit (1); } buffer = (char *)malloc( size ); if ( ! buffer ) { fprintf(stderr,"unable to get %d byte buffer\n",size); exit(1); } read(audio,buffer,size); write(out,buffer,size); } else { /* Assume this is an sound output request */ /* Default buffer size = 16k if nothing is specified */ if ( ! sflag ) size = 16536; buffer = (char *)malloc( size ); if ( ! buffer ) { fprintf(stderr,"unable to get %d byte buffer\n",size); exit(1); } /* Write to audio port the contents of specified file until EOF This can be improved for simultaneous read/writes Insert user customization for specific file or usr needs i.e. while (read(in,buffer,size)!=EOF) write (audio,buffer,size); */ read (in,buffer,size); write(audio,buffer,size); } close(file); }