Update to latest tinyalsa
authorSimon Wilson <simonwilson@google.com>
Tue, 28 Feb 2012 23:26:02 +0000 (15:26 -0800)
committerSimon Wilson <simonwilson@google.com>
Tue, 28 Feb 2012 23:26:02 +0000 (15:26 -0800)
a6dd4ab tinyplay: Use buffer size in bytes instead of frames
5f64fe7 pcm: Factor out pcm_start() from pcm_read()
6bbe77a pcm: Constify write buffers
9989fc2 tinycap, tinyplay, tinymix: Add extra parameters.
3e3376a tinycap, tinyplay: Check *argv before dereferencing.
80085d4 pcm: Fix integer size error.

Change-Id: I69a37c0a89e5531b9ab66a8b3f730765904ed9f7

include/tinyalsa/asoundlib.h
pcm.c
tinycap.c
tinymix.c
tinyplay.c

index 92a004cb4ef64c53c76a40dcbf662e7856c6496a..655fe76895ce6248ae2f5d513101fb7db274c066 100644 (file)
@@ -139,13 +139,13 @@ int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail,
  * Will start playback on the first write or on a write that
  * occurs after a fifo underrun.
  */
-int pcm_write(struct pcm *pcm, void *data, unsigned int count);
+int pcm_write(struct pcm *pcm, const void *data, unsigned int count);
 int pcm_read(struct pcm *pcm, void *data, unsigned int count);
 
 /*
  * mmap() support.
  */
-int pcm_mmap_write(struct pcm *pcm, void *data, unsigned int count);
+int pcm_mmap_write(struct pcm *pcm, const void *data, unsigned int count);
 int pcm_mmap_begin(struct pcm *pcm, void **areas, unsigned int *offset,
                    unsigned int *frames);
 int pcm_mmap_commit(struct pcm *pcm, unsigned int offset, unsigned int frames);
diff --git a/pcm.c b/pcm.c
index 9324f384143a533a23cfca3898fc226973e73d82..f0dbcc5b7bd8b3cfdf61bfdf320e136eb6135f78 100644 (file)
--- a/pcm.c
+++ b/pcm.c
@@ -303,7 +303,7 @@ static int pcm_areas_copy(struct pcm *pcm, unsigned int pcm_offset,
     return 0;
 }
 
-static int pcm_mmap_write_areas(struct pcm *pcm, char *src,
+static int pcm_mmap_write_areas(struct pcm *pcm, const char *src,
                                 unsigned int offset, unsigned int size)
 {
     void *pcm_areas;
@@ -365,14 +365,14 @@ int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail,
     return 0;
 }
 
-int pcm_write(struct pcm *pcm, void *data, unsigned int count)
+int pcm_write(struct pcm *pcm, const void *data, unsigned int count)
 {
     struct snd_xferi x;
 
     if (pcm->flags & PCM_IN)
         return -EINVAL;
 
-    x.buf = data;
+    x.buf = (void*)data;
     x.frames = count / (pcm->config.channels *
                         pcm_format_to_bits(pcm->config.format) / 8);
 
@@ -411,11 +411,7 @@ int pcm_read(struct pcm *pcm, void *data, unsigned int count)
 
     for (;;) {
         if (!pcm->running) {
-            if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_PREPARE))
-                return oops(pcm, errno, "cannot prepare channel");
-            if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_START))
-                return oops(pcm, errno, "cannot start channel");
-            pcm->running = 1;
+            pcm_start(pcm);
         }
         if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_READI_FRAMES, &x)) {
             pcm->running = 0;
@@ -575,7 +571,7 @@ struct pcm *pcm_open(unsigned int card, unsigned int device,
     sparams.silence_threshold = config->silence_threshold;
     pcm->boundary = sparams.boundary = pcm->buffer_size;
 
-    while (pcm->boundary * 2 <= LONG_MAX - pcm->buffer_size)
+    while (pcm->boundary * 2 <= INT_MAX - pcm->buffer_size)
                pcm->boundary *= 2;
 
     if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_SW_PARAMS, &sparams)) {
@@ -774,7 +770,7 @@ int pcm_wait(struct pcm *pcm, int timeout)
     return 1;
 }
 
-int pcm_mmap_write(struct pcm *pcm, void *buffer, unsigned int bytes)
+int pcm_mmap_write(struct pcm *pcm, const void *buffer, unsigned int bytes)
 {
     int err = 0, frames, avail;
     unsigned int offset = 0, count;
index 3eb5c60d5a27ed26686f067f1253389461a85282..a50c4178256e62adcc1a2f890f975a42463331c5 100644 (file)
--- a/tinycap.c
+++ b/tinycap.c
@@ -57,9 +57,10 @@ struct wav_header {
 
 int capturing = 1;
 
-unsigned int capture_sample(FILE *file, unsigned int device,
+unsigned int capture_sample(FILE *file, unsigned int card, unsigned int device,
                             unsigned int channels, unsigned int rate,
-                            unsigned int bits);
+                            unsigned int bits, unsigned int period_size,
+                            unsigned int period_count);
 
 void sigint_handler(int sig)
 {
@@ -70,14 +71,17 @@ int main(int argc, char **argv)
 {
     FILE *file;
     struct wav_header header;
+    unsigned int card = 0;
     unsigned int device = 0;
     unsigned int channels = 2;
     unsigned int rate = 44100;
     unsigned int bits = 16;
     unsigned int frames;
+    unsigned int period_size = 1024;
+    unsigned int period_count = 4;
 
     if (argc < 2) {
-        fprintf(stderr, "Usage: %s file.wav [-d device] [-c channels] "
+        fprintf(stderr, "Usage: %s file.wav [-D card] [-d device] [-c channels] "
                 "[-r rate] [-b bits]\n", argv[0]);
         return 1;
     }
@@ -93,18 +97,35 @@ int main(int argc, char **argv)
     while (*argv) {
         if (strcmp(*argv, "-d") == 0) {
             argv++;
-            device = atoi(*argv);
+            if (*argv)
+                device = atoi(*argv);
         } else if (strcmp(*argv, "-c") == 0) {
             argv++;
-            channels = atoi(*argv);
+            if (*argv)
+                channels = atoi(*argv);
         } else if (strcmp(*argv, "-r") == 0) {
             argv++;
-            rate = atoi(*argv);
+            if (*argv)
+                rate = atoi(*argv);
         } else if (strcmp(*argv, "-b") == 0) {
             argv++;
-            bits = atoi(*argv);
+            if (*argv)
+                bits = atoi(*argv);
+        } else if (strcmp(*argv, "-D") == 0) {
+            argv++;
+            if (*argv)
+                card = atoi(*argv);
+        } else if (strcmp(*argv, "-p") == 0) {
+            argv++;
+            if (*argv)
+                period_size = atoi(*argv);
+        } else if (strcmp(*argv, "-n") == 0) {
+            argv++;
+            if (*argv)
+                period_count = atoi(*argv);
         }
-        argv++;
+        if (*argv)
+            argv++;
     }
 
     header.riff_id = ID_RIFF;
@@ -125,8 +146,9 @@ int main(int argc, char **argv)
 
     /* install signal handler and begin capturing */
     signal(SIGINT, sigint_handler);
-    frames = capture_sample(file, device, header.num_channels,
-                            header.sample_rate, header.bits_per_sample);
+    frames = capture_sample(file, card, device, header.num_channels,
+                            header.sample_rate, header.bits_per_sample,
+                            period_size, period_count);
     printf("Captured %d frames\n", frames);
 
     /* write header now all information is known */
@@ -139,9 +161,10 @@ int main(int argc, char **argv)
     return 0;
 }
 
-unsigned int capture_sample(FILE *file, unsigned int device,
+unsigned int capture_sample(FILE *file, unsigned int card, unsigned int device,
                             unsigned int channels, unsigned int rate,
-                            unsigned int bits)
+                            unsigned int bits, unsigned int period_size,
+                            unsigned int period_count)
 {
     struct pcm_config config;
     struct pcm *pcm;
@@ -151,8 +174,8 @@ unsigned int capture_sample(FILE *file, unsigned int device,
 
     config.channels = channels;
     config.rate = rate;
-    config.period_size = 1024;
-    config.period_count = 4;
+    config.period_size = period_size;
+    config.period_count = period_count;
     if (bits == 32)
         config.format = PCM_FORMAT_S32_LE;
     else if (bits == 16)
@@ -161,7 +184,7 @@ unsigned int capture_sample(FILE *file, unsigned int device,
     config.stop_threshold = 0;
     config.silence_threshold = 0;
 
-    pcm = pcm_open(0, device, PCM_IN, &config);
+    pcm = pcm_open(card, device, PCM_IN, &config);
     if (!pcm || !pcm_is_ready(pcm)) {
         fprintf(stderr, "Unable to open PCM device (%s)\n",
                 pcm_get_error(pcm));
index b9c71a4176cd942e4226188f7d6cf439034d09b4..e7bd27678d9a5b2b7dbc9b0a89a93e2366d9bd0c 100644 (file)
--- a/tinymix.c
+++ b/tinymix.c
@@ -41,8 +41,20 @@ static void tinymix_print_enum(struct mixer_ctl *ctl, int print_all);
 int main(int argc, char **argv)
 {
     struct mixer *mixer;
+    int card = 0;
+
+    if ((argc > 2) && (strcmp(argv[1], "-D") == 0)) {
+        argv++;
+        if (argv[1]) {
+            card = atoi(argv[1]);
+            argv++;
+            argc -= 2;
+        } else {
+            argc -= 1;
+        }
+    }
 
-    mixer = mixer_open(0);
+    mixer = mixer_open(card);
     if (!mixer) {
         fprintf(stderr, "Failed to open mixer\n");
         return EXIT_FAILURE;
@@ -55,7 +67,7 @@ int main(int argc, char **argv)
     else if (argc == 3)
         tinymix_set_value(mixer, atoi(argv[1]), argv[2]);
     else
-        printf("Usage: tinymix [control id] [value to set]\n");
+        printf("Usage: tinymix [-D card] [control id] [value to set]\n");
 
     mixer_close(mixer);
 
index 915a1eae953288c40cd4334304cb44eff6f0f04a..4d257e768cccc1488775c2c1f5b7d7ef832c1eb5 100644 (file)
@@ -54,17 +54,22 @@ struct wav_header {
     uint32_t data_sz;
 };
 
-void play_sample(FILE *file, unsigned int device, unsigned int channels,
-                 unsigned int rate, unsigned int bits);
+void play_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels,
+                 unsigned int rate, unsigned int bits, unsigned int period_size,
+                 unsigned int period_count);
 
 int main(int argc, char **argv)
 {
     FILE *file;
     struct wav_header header;
     unsigned int device = 0;
+    unsigned int card = 0;
+    unsigned int period_size = 1024;
+    unsigned int period_count = 4;
 
     if (argc < 2) {
-        fprintf(stderr, "Usage: %s file.wav [-d device]\n", argv[0]);
+        fprintf(stderr, "Usage: %s file.wav [-D card] [-d device] [-p period_size]"
+                " [-n n_periods] \n", argv[0]);
         return 1;
     }
 
@@ -79,9 +84,26 @@ int main(int argc, char **argv)
     while (*argv) {
         if (strcmp(*argv, "-d") == 0) {
             argv++;
-            device = atoi(*argv);
+            if (*argv)
+                device = atoi(*argv);
         }
-        argv++;
+        if (strcmp(*argv, "-p") == 0) {
+            argv++;
+            if (*argv)
+                period_size = atoi(*argv);
+        }
+        if (strcmp(*argv, "-n") == 0) {
+            argv++;
+            if (*argv)
+                period_count = atoi(*argv);
+        }
+        if (strcmp(*argv, "-D") == 0) {
+            argv++;
+            if (*argv)
+                card = atoi(*argv);
+        }
+        if (*argv)
+            argv++;
     }
 
     fread(&header, sizeof(struct wav_header), 1, file);
@@ -96,16 +118,17 @@ int main(int argc, char **argv)
         return 1;
     }
 
-    play_sample(file, device, header.num_channels, header.sample_rate,
-                header.bits_per_sample);
+    play_sample(file, card, device, header.num_channels, header.sample_rate,
+                header.bits_per_sample, period_size, period_count);
 
     fclose(file);
 
     return 0;
 }
 
-void play_sample(FILE *file, unsigned int device, unsigned int channels,
-                 unsigned int rate, unsigned int bits)
+void play_sample(FILE *file, unsigned int card, unsigned int device, unsigned int channels,
+                 unsigned int rate, unsigned int bits, unsigned int period_size,
+                 unsigned int period_count)
 {
     struct pcm_config config;
     struct pcm *pcm;
@@ -115,8 +138,8 @@ void play_sample(FILE *file, unsigned int device, unsigned int channels,
 
     config.channels = channels;
     config.rate = rate;
-    config.period_size = 1024;
-    config.period_count = 4;
+    config.period_size = period_size;
+    config.period_count = period_count;
     if (bits == 32)
         config.format = PCM_FORMAT_S32_LE;
     else if (bits == 16)
@@ -125,14 +148,14 @@ void play_sample(FILE *file, unsigned int device, unsigned int channels,
     config.stop_threshold = 0;
     config.silence_threshold = 0;
 
-    pcm = pcm_open(0, device, PCM_OUT, &config);
+    pcm = pcm_open(card, device, PCM_OUT, &config);
     if (!pcm || !pcm_is_ready(pcm)) {
         fprintf(stderr, "Unable to open PCM device %u (%s)\n",
                 device, pcm_get_error(pcm));
         return;
     }
 
-    size = pcm_get_buffer_size(pcm);
+    size = pcm_frames_to_bytes(pcm, pcm_get_buffer_size(pcm));
     buffer = malloc(size);
     if (!buffer) {
         fprintf(stderr, "Unable to allocate %d bytes\n", size);