recording.c
changeset 0 af501b0c1716
child 8 96d16dfe787a
equal deleted inserted replaced
-1:000000000000 0:af501b0c1716
       
     1 /*
       
     2  *     $Id: recording.c,v 1.1.1.1 2008-04-28 17:32:53 mbroeker Exp $
       
     3  * $Source: /development/c/demos/recording.c,v $
       
     4  *
       
     5  * Program to illustrate /dev/dsp device
       
     6  * Records several seconds of sound, then echoes it back.
       
     7  * Runs until Control-C is pressed.
       
     8  */
       
     9 
       
    10 #include <unistd.h>
       
    11 #include <fcntl.h>
       
    12 #include <sys/types.h>
       
    13 #include <sys/ioctl.h>
       
    14 #include <stdlib.h>
       
    15 #include <stdio.h>
       
    16 #include <linux/soundcard.h>
       
    17 
       
    18 #define LENGTH 3                /* how many seconds of speech to store */
       
    19 #define RATE 8000               /* the sampling rate */
       
    20 #define SIZE 8                  /* sample size: 8 or 16 bits */
       
    21 #define CHANNELS 1              /* 1 = mono 2 = stereo */
       
    22 
       
    23      /*
       
    24       * this buffer holds the digitized audio
       
    25       */
       
    26 unsigned char buf[LENGTH * RATE * SIZE * CHANNELS / 8];
       
    27 
       
    28 int main (int argc, char **argv)
       
    29 {
       
    30     int fd;                     /* sound device file descriptor */
       
    31     int arg;                    /* argument for ioctl calls */
       
    32     int status;                 /* return status of system calls */
       
    33 
       
    34     /*
       
    35      * open sound device
       
    36      */
       
    37 
       
    38     if (argc != 2) {
       
    39         printf ("Usage: %s <DEVICE>\n", argv[0]);
       
    40         printf ("Example: %s /dev/dsp\n", argv[0]);
       
    41         printf ("Example: %s /dev/dsp1\n", argv[0]);
       
    42         return EXIT_SUCCESS;
       
    43     }
       
    44 
       
    45     fd = open (argv[1], O_RDWR);
       
    46     if (fd < 0) {
       
    47         perror ("open of sound device failed");
       
    48         return EXIT_FAILURE;
       
    49     }
       
    50 
       
    51     /*
       
    52      * set sampling parameters
       
    53      */
       
    54     arg = SIZE;                 /* sample size */
       
    55     status = ioctl (fd, SOUND_PCM_WRITE_BITS, &arg);
       
    56     if (status == -1)
       
    57         perror ("SOUND_PCM_WRITE_BITS ioctl failed");
       
    58     if (arg != SIZE)
       
    59         perror ("unable to set sample size");
       
    60 
       
    61     arg = CHANNELS;             /* mono or stereo */
       
    62     status = ioctl (fd, SOUND_PCM_WRITE_CHANNELS, &arg);
       
    63     if (status == -1)
       
    64         perror ("SOUND_PCM_WRITE_CHANNELS ioctl failed");
       
    65     if (arg != CHANNELS)
       
    66         perror ("unable to set number of channels");
       
    67 
       
    68     arg = RATE;                 /* sampling rate */
       
    69     status = ioctl (fd, SOUND_PCM_WRITE_RATE, &arg);
       
    70     if (status == -1)
       
    71         perror ("SOUND_PCM_WRITE_WRITE ioctl failed");
       
    72 
       
    73     while (1) {                 /* loop until Control-C */
       
    74         printf ("Say something:\n");
       
    75         status = read (fd, buf, sizeof (buf));  /* record some sound */
       
    76         if (status != sizeof (buf))
       
    77             perror ("read wrong number of bytes");
       
    78         printf ("You said:\n");
       
    79         status = write (fd, buf, sizeof (buf)); /* play it back */
       
    80         if (status != sizeof (buf))
       
    81             perror ("wrote wrong number of bytes");
       
    82         /*
       
    83          * wait for playback to complete before recording again
       
    84          */
       
    85         status = ioctl (fd, SOUND_PCM_SYNC, 0);
       
    86         if (status == -1)
       
    87             perror ("SOUND_PCM_SYNC ioctl failed");
       
    88     }
       
    89     return EXIT_SUCCESS;
       
    90 }