aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pcm.c16
-rw-r--r--src/pcm_plugin.c13
2 files changed, 29 insertions, 0 deletions
diff --git a/src/pcm.c b/src/pcm.c
index d681563..1b2103a 100644
--- a/src/pcm.c
+++ b/src/pcm.c
@@ -1218,6 +1218,22 @@ int pcm_start(struct pcm *pcm)
return 0;
}
+/** Drains a PCM.
+ * @param pcm A PCM handle.
+ * @return On success, zero; on failure, a negative number.
+ * @ingroup libtinyalsa-pcm
+ */
+int pcm_drain(struct pcm *pcm)
+{
+ if (!pcm_is_ready(pcm))
+ return -1;
+
+ if (pcm->ops->ioctl(pcm->data, SNDRV_PCM_IOCTL_DRAIN) < 0)
+ return oops(pcm, errno, "cannot drain channel");
+
+ return 0;
+}
+
/** Stops a PCM.
* @param pcm A PCM handle.
* @return On success, zero; on failure, a negative number.
diff --git a/src/pcm_plugin.c b/src/pcm_plugin.c
index b6b69aa..4d2651c 100644
--- a/src/pcm_plugin.c
+++ b/src/pcm_plugin.c
@@ -622,6 +622,16 @@ static int pcm_plug_drop(struct pcm_plug_data *plug_data)
return rc;
}
+static int pcm_plug_drain(struct pcm_plug_data *plug_data)
+{
+ struct pcm_plugin *plugin = plug_data->plugin;
+
+ if (plugin->state != PCM_PLUG_STATE_RUNNING)
+ return -EBADFD;
+
+ return plug_data->ops->drain(plugin);
+}
+
static int pcm_plug_ioctl(void *data, unsigned int cmd, ...)
{
struct pcm_plug_data *plug_data = data;
@@ -659,6 +669,9 @@ static int pcm_plug_ioctl(void *data, unsigned int cmd, ...)
case SNDRV_PCM_IOCTL_START:
ret = pcm_plug_start(plug_data);
break;
+ case SNDRV_PCM_IOCTL_DRAIN:
+ ret = pcm_plug_drain(plug_data);
+ break;
case SNDRV_PCM_IOCTL_DROP:
ret = pcm_plug_drop(plug_data);
break;