recording.c
changeset 0 af501b0c1716
child 8 96d16dfe787a
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 <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <linux/soundcard.h>
+
+#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 <DEVICE>\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;
+}