Update tinyalsa for pcm_start/stop() support
authorSimon Wilson <simonwilson@google.com>
Fri, 24 Jun 2011 18:08:10 +0000 (11:08 -0700)
committerSimon Wilson <simonwilson@google.com>
Fri, 24 Jun 2011 18:08:30 +0000 (11:08 -0700)
d6458e6 pcm: add pcm_start/stop() functions for streams

Change-Id: Iba1dd4e6adc0be68008b44978d55231c584e92c4

include/tinyalsa/asoundlib.h
pcm.c

index bd0cdee35fe0ca4e2b5aebf2f38fe07a87edb4d3..14511c9bd55a27298c4b8bb21206498d94c852cb 100644 (file)
@@ -97,6 +97,10 @@ unsigned int pcm_get_latency(struct pcm *pcm);
 int pcm_write(struct pcm *pcm, void *data, unsigned int count);
 int pcm_read(struct pcm *pcm, void *data, unsigned int count);
 
+/* Start and stop a PCM channel that doesn't transfer data */
+int pcm_start(struct pcm *pcm);
+int pcm_stop(struct pcm *pcm);
+
 
 /*
  * MIXER API
diff --git a/pcm.c b/pcm.c
index adc04957857de9c2af7283360c519c559872836e..3ba51baf784f5ff39506dd4b5e3660e5bb190522 100644 (file)
--- a/pcm.c
+++ b/pcm.c
@@ -350,3 +350,22 @@ int pcm_is_ready(struct pcm *pcm)
 {
     return pcm->fd >= 0;
 }
+
+int pcm_start(struct pcm *pcm)
+{
+    if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_PREPARE) < 0)
+        return oops(pcm, errno, "cannot prepare channel");
+    if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_START) < 0)
+        return oops(pcm, errno, "cannot start channel");
+
+    return 0;
+}
+
+int pcm_stop(struct pcm *pcm)
+{
+    if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_DROP) < 0)
+        return oops(pcm, errno, "cannot stop channel");
+
+    return 0;
+}
+