]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Added snd_pcm_reset to API
authorAbramo Bagnara <abramo@alsa-project.org>
Fri, 24 Nov 2000 17:08:03 +0000 (17:08 +0000)
committerAbramo Bagnara <abramo@alsa-project.org>
Fri, 24 Nov 2000 17:08:03 +0000 (17:08 +0000)
aserver/aserver.c
include/pcm.h
src/pcm/pcm.c
src/pcm/pcm_file.c
src/pcm/pcm_hw.c
src/pcm/pcm_local.h
src/pcm/pcm_multi.c
src/pcm/pcm_null.c
src/pcm/pcm_plugin.c
src/pcm/pcm_share.c
src/pcm/pcm_shm.c

index 3b326ff8ae9a74d82e18802a4dd59ccef9f1b309..37874531f49b6a37320d08e30b5e1b5bfc2dee39 100644 (file)
@@ -412,6 +412,11 @@ int pcm_shm_cmd(client_t *client)
                ctrl->appl_ptr = *pcm->appl_ptr;
                ctrl->hw_ptr = *pcm->hw_ptr;
                break;
+       case SND_PCM_IOCTL_RESET:
+               ctrl->result = snd_pcm_reset(pcm);
+               ctrl->appl_ptr = *pcm->appl_ptr;
+               ctrl->hw_ptr = *pcm->hw_ptr;
+               break;
        case SND_PCM_IOCTL_START:
                ctrl->result = snd_pcm_start(pcm);
                ctrl->appl_ptr = *pcm->appl_ptr;
index c0ecee92aea3ad7cef9cd7c8e8d4de65e1c2eaf0..b49bea5ad7fef7e8e342de3e83ab7c5de42f1499 100644 (file)
@@ -75,6 +75,7 @@ int snd_pcm_dig_info(snd_pcm_t *pcm, snd_pcm_dig_info_t *info);
 int snd_pcm_dig_params(snd_pcm_t *pcm, snd_pcm_dig_params_t *params);
 int snd_pcm_status(snd_pcm_t *pcm, snd_pcm_status_t *status);
 int snd_pcm_prepare(snd_pcm_t *pcm);
+int snd_pcm_reset(snd_pcm_t *pcm);
 int snd_pcm_start(snd_pcm_t *pcm);
 int snd_pcm_drop(snd_pcm_t *pcm);
 int snd_pcm_drain(snd_pcm_t *pcm);
index 9c22d2136b8547cee03a45f3401447901114e354..3b255b68dc1fc23900d93c4aebe5a827a7554e24 100644 (file)
@@ -292,6 +292,13 @@ int snd_pcm_prepare(snd_pcm_t *pcm)
        return pcm->fast_ops->prepare(pcm->fast_op_arg);
 }
 
+int snd_pcm_reset(snd_pcm_t *pcm)
+{
+       assert(pcm);
+       assert(pcm->setup);
+       return pcm->fast_ops->reset(pcm->fast_op_arg);
+}
+
 int snd_pcm_start(snd_pcm_t *pcm)
 {
        assert(pcm);
index 4130812e1a39ca333aa3e4609e67254960d626d3..1cf456a6c1520b91ae5d0876139025cc49e0b007 100644 (file)
@@ -97,6 +97,13 @@ static int snd_pcm_file_prepare(snd_pcm_t *pcm)
        return snd_pcm_prepare(file->slave);
 }
 
+static int snd_pcm_file_reset(snd_pcm_t *pcm)
+{
+       snd_pcm_file_t *file = pcm->private;
+       /* FIXME */
+       return snd_pcm_reset(file->slave);
+}
+
 static int snd_pcm_file_start(snd_pcm_t *pcm)
 {
        snd_pcm_file_t *file = pcm->private;
@@ -325,6 +332,7 @@ snd_pcm_fast_ops_t snd_pcm_file_fast_ops = {
        state: snd_pcm_file_state,
        delay: snd_pcm_file_delay,
        prepare: snd_pcm_file_prepare,
+       reset: snd_pcm_file_reset,
        start: snd_pcm_file_start,
        drop: snd_pcm_file_drop,
        drain: snd_pcm_file_drain,
index 0aaa1fc0a8507a257e73819001ac14a8b580e859..2e3f14fc6c28668efea45fc78002f959aa5be3b8 100644 (file)
@@ -237,6 +237,17 @@ static int snd_pcm_hw_prepare(snd_pcm_t *pcm)
        return 0;
 }
 
+static int snd_pcm_hw_reset(snd_pcm_t *pcm)
+{
+       snd_pcm_hw_t *hw = pcm->private;
+       int fd = hw->fd;
+       if (ioctl(fd, SND_PCM_IOCTL_RESET) < 0) {
+               SYSERR("SND_PCM_IOCTL_RESET failed");
+               return -errno;
+       }
+       return 0;
+}
+
 static int snd_pcm_hw_start(snd_pcm_t *pcm)
 {
        snd_pcm_hw_t *hw = pcm->private;
@@ -529,6 +540,7 @@ snd_pcm_fast_ops_t snd_pcm_hw_fast_ops = {
        state: snd_pcm_hw_state,
        delay: snd_pcm_hw_delay,
        prepare: snd_pcm_hw_prepare,
+       reset: snd_pcm_hw_reset,
        start: snd_pcm_hw_start,
        drop: snd_pcm_hw_drop,
        drain: snd_pcm_hw_drain,
index d3b4bb105a8c6416ac4f21016648bf00836d8e2b..9065a1c09b86106676d236891b67e0db29d34bf8 100644 (file)
@@ -72,6 +72,7 @@ typedef struct {
 typedef struct {
        int (*status)(snd_pcm_t *pcm, snd_pcm_status_t *status);
        int (*prepare)(snd_pcm_t *pcm);
+       int (*reset)(snd_pcm_t *pcm);
        int (*start)(snd_pcm_t *pcm);
        int (*drop)(snd_pcm_t *pcm);
        int (*drain)(snd_pcm_t *pcm);
index 95f634780ab4d883445d98d316f148662100401c..a20161029aed09ab34fc952632b0cba978c2750d 100644 (file)
@@ -225,6 +225,12 @@ static int snd_pcm_multi_prepare(snd_pcm_t *pcm)
        return snd_pcm_prepare(multi->slaves[0].pcm);
 }
 
+static int snd_pcm_multi_reset(snd_pcm_t *pcm)
+{
+       snd_pcm_multi_t *multi = pcm->private;
+       return snd_pcm_reset(multi->slaves[0].pcm);
+}
+
 static int snd_pcm_multi_start(snd_pcm_t *pcm)
 {
        snd_pcm_multi_t *multi = pcm->private;
@@ -374,6 +380,7 @@ snd_pcm_fast_ops_t snd_pcm_multi_fast_ops = {
        state: snd_pcm_multi_state,
        delay: snd_pcm_multi_delay,
        prepare: snd_pcm_multi_prepare,
+       reset: snd_pcm_multi_reset,
        start: snd_pcm_multi_start,
        drop: snd_pcm_multi_drop,
        drain: snd_pcm_multi_drain,
index 2878a17ba6ef995501b777ba98e30eaab522f052..f46cd6acdb1b57de8f556ca5d2eae952a1a8ea00 100644 (file)
@@ -98,6 +98,14 @@ static int snd_pcm_null_prepare(snd_pcm_t *pcm)
        return 0;
 }
 
+static int snd_pcm_null_reset(snd_pcm_t *pcm)
+{
+       snd_pcm_null_t *null = pcm->private;
+       null->appl_ptr = 0;
+       null->hw_ptr = 0;
+       return 0;
+}
+
 static int snd_pcm_null_start(snd_pcm_t *pcm)
 {
        snd_pcm_null_t *null = pcm->private;
@@ -316,6 +324,7 @@ snd_pcm_fast_ops_t snd_pcm_null_fast_ops = {
        state: snd_pcm_null_state,
        delay: snd_pcm_null_delay,
        prepare: snd_pcm_null_prepare,
+       reset: snd_pcm_null_reset,
        start: snd_pcm_null_start,
        drop: snd_pcm_null_drop,
        drain: snd_pcm_null_drain,
index 9dd4e6129f84974ba56639b335236f99d314c197..253c147fe2df3b141ccd4f4528a9abf021f879ae 100644 (file)
@@ -121,6 +121,22 @@ int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
        return 0;
 }
 
+int snd_pcm_plugin_reset(snd_pcm_t *pcm)
+{
+       snd_pcm_plugin_t *plugin = pcm->private;
+       int err = snd_pcm_reset(plugin->slave);
+       if (err < 0)
+               return err;
+       plugin->hw_ptr = 0;
+       plugin->appl_ptr = 0;
+       if (plugin->init) {
+               err = plugin->init(pcm);
+               if (err < 0)
+                       return err;
+       }
+       return 0;
+}
+
 int snd_pcm_plugin_start(snd_pcm_t *pcm)
 {
        snd_pcm_plugin_t *plugin = pcm->private;
@@ -395,6 +411,7 @@ snd_pcm_fast_ops_t snd_pcm_plugin_fast_ops = {
        state: snd_pcm_plugin_state,
        delay: snd_pcm_plugin_delay,
        prepare: snd_pcm_plugin_prepare,
+       reset: snd_pcm_plugin_reset,
        start: snd_pcm_plugin_start,
        drop: snd_pcm_plugin_drop,
        drain: snd_pcm_plugin_drain,
index 898f864745c64510bb0a4a4f1170710aba695380..148353c630bb9727c0ea4de74372305b4f5150e1 100644 (file)
@@ -725,6 +725,20 @@ static int snd_pcm_share_prepare(snd_pcm_t *pcm)
        return err;
 }
 
+static int snd_pcm_share_reset(snd_pcm_t *pcm)
+{
+       snd_pcm_share_t *share = pcm->private;
+       snd_pcm_share_slave_t *slave = share->slave;
+       int err = 0;
+       /* FIXME? */
+       Pthread_mutex_lock(&slave->mutex);
+       snd_pcm_areas_silence(pcm->running_areas, 0, pcm->channels, pcm->buffer_size, pcm->format);
+       share->hw_ptr = *slave->pcm->hw_ptr;
+       share->appl_ptr = share->hw_ptr;
+       Pthread_mutex_unlock(&slave->mutex);
+       return err;
+}
+
 static int snd_pcm_share_start(snd_pcm_t *pcm)
 {
        snd_pcm_share_t *share = pcm->private;
@@ -1062,6 +1076,7 @@ snd_pcm_fast_ops_t snd_pcm_share_fast_ops = {
        state: snd_pcm_share_state,
        delay: snd_pcm_share_delay,
        prepare: snd_pcm_share_prepare,
+       reset: snd_pcm_share_reset,
        start: snd_pcm_share_start,
        drop: snd_pcm_share_drop,
        drain: snd_pcm_share_drain,
index d609e7420d9bf6613f4e75b9383518eb97e7ab0e..d543f22face9dd159205e1bf141a332b6576ee29 100644 (file)
@@ -348,6 +348,14 @@ static int snd_pcm_shm_prepare(snd_pcm_t *pcm)
        return snd_pcm_shm_action(pcm);
 }
 
+static int snd_pcm_shm_reset(snd_pcm_t *pcm)
+{
+       snd_pcm_shm_t *shm = pcm->private;
+       volatile snd_pcm_shm_ctrl_t *ctrl = shm->ctrl;
+       ctrl->cmd = SND_PCM_IOCTL_RESET;
+       return snd_pcm_shm_action(pcm);
+}
+
 static int snd_pcm_shm_start(snd_pcm_t *pcm)
 {
        snd_pcm_shm_t *shm = pcm->private;
@@ -470,6 +478,7 @@ snd_pcm_fast_ops_t snd_pcm_shm_fast_ops = {
        state: snd_pcm_shm_state,
        delay: snd_pcm_shm_delay,
        prepare: snd_pcm_shm_prepare,
+       reset: snd_pcm_shm_reset,
        start: snd_pcm_shm_start,
        drop: snd_pcm_shm_drop,
        drain: snd_pcm_shm_drain,