diff --git a/recording.c b/recording.c new file mode 100644 --- /dev/null +++ b/recording.c @@ -0,0 +1,90 @@ +/* + * $Id: recording.c,v 1.1.1.1 2008-04-28 17:32:53 mbroeker Exp $ + * $Source: /development/c/demos/recording.c,v $ + * + * Program to illustrate /dev/dsp device + * Records several seconds of sound, then echoes it back. + * Runs until Control-C is pressed. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define LENGTH 3 /* how many seconds of speech to store */ +#define RATE 8000 /* the sampling rate */ +#define SIZE 8 /* sample size: 8 or 16 bits */ +#define CHANNELS 1 /* 1 = mono 2 = stereo */ + + /* + * this buffer holds the digitized audio + */ +unsigned char buf[LENGTH * RATE * SIZE * CHANNELS / 8]; + +int main (int argc, char **argv) +{ + int fd; /* sound device file descriptor */ + int arg; /* argument for ioctl calls */ + int status; /* return status of system calls */ + + /* + * open sound device + */ + + if (argc != 2) { + printf ("Usage: %s \n", argv[0]); + printf ("Example: %s /dev/dsp\n", argv[0]); + printf ("Example: %s /dev/dsp1\n", argv[0]); + return EXIT_SUCCESS; + } + + fd = open (argv[1], O_RDWR); + if (fd < 0) { + perror ("open of sound device failed"); + return EXIT_FAILURE; + } + + /* + * set sampling parameters + */ + arg = SIZE; /* sample size */ + status = ioctl (fd, SOUND_PCM_WRITE_BITS, &arg); + if (status == -1) + perror ("SOUND_PCM_WRITE_BITS ioctl failed"); + if (arg != SIZE) + perror ("unable to set sample size"); + + arg = CHANNELS; /* mono or stereo */ + status = ioctl (fd, SOUND_PCM_WRITE_CHANNELS, &arg); + if (status == -1) + perror ("SOUND_PCM_WRITE_CHANNELS ioctl failed"); + if (arg != CHANNELS) + perror ("unable to set number of channels"); + + arg = RATE; /* sampling rate */ + status = ioctl (fd, SOUND_PCM_WRITE_RATE, &arg); + if (status == -1) + perror ("SOUND_PCM_WRITE_WRITE ioctl failed"); + + while (1) { /* loop until Control-C */ + printf ("Say something:\n"); + status = read (fd, buf, sizeof (buf)); /* record some sound */ + if (status != sizeof (buf)) + perror ("read wrong number of bytes"); + printf ("You said:\n"); + status = write (fd, buf, sizeof (buf)); /* play it back */ + if (status != sizeof (buf)) + perror ("wrote wrong number of bytes"); + /* + * wait for playback to complete before recording again + */ + status = ioctl (fd, SOUND_PCM_SYNC, 0); + if (status == -1) + perror ("SOUND_PCM_SYNC ioctl failed"); + } + return EXIT_SUCCESS; +}