summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbramo Bagnara <abramo@alsa-project.org>2000-11-24 17:08:03 +0000
committerAbramo Bagnara <abramo@alsa-project.org>2000-11-24 17:08:03 +0000
commit8c080ce9ddc111ecd108538624444337a9391583 (patch)
tree0a1edf7f82d638ea4ad5ac0fe76e2daada840035
parent206f489fe14016faaa0ba3605add4378bcc9291e (diff)
Added snd_pcm_reset to API
-rw-r--r--aserver/aserver.c5
-rw-r--r--include/pcm.h1
-rw-r--r--src/pcm/pcm.c7
-rw-r--r--src/pcm/pcm_file.c8
-rw-r--r--src/pcm/pcm_hw.c12
-rw-r--r--src/pcm/pcm_local.h1
-rw-r--r--src/pcm/pcm_multi.c7
-rw-r--r--src/pcm/pcm_null.c9
-rw-r--r--src/pcm/pcm_plugin.c17
-rw-r--r--src/pcm/pcm_share.c15
-rw-r--r--src/pcm/pcm_shm.c9
11 files changed, 91 insertions, 0 deletions
diff --git a/aserver/aserver.c b/aserver/aserver.c
index 3b326ff8..37874531 100644
--- a/aserver/aserver.c
+++ b/aserver/aserver.c
@@ -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;
diff --git a/include/pcm.h b/include/pcm.h
index c0ecee92..b49bea5a 100644
--- a/include/pcm.h
+++ b/include/pcm.h
@@ -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);
diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
index 9c22d213..3b255b68 100644
--- a/src/pcm/pcm.c
+++ b/src/pcm/pcm.c
@@ -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);
diff --git a/src/pcm/pcm_file.c b/src/pcm/pcm_file.c
index 4130812e..1cf456a6 100644
--- a/src/pcm/pcm_file.c
+++ b/src/pcm/pcm_file.c
@@ -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,
diff --git a/src/pcm/pcm_hw.c b/src/pcm/pcm_hw.c
index 0aaa1fc0..2e3f14fc 100644
--- a/src/pcm/pcm_hw.c
+++ b/src/pcm/pcm_hw.c
@@ -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,
diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
index d3b4bb10..9065a1c0 100644
--- a/src/pcm/pcm_local.h
+++ b/src/pcm/pcm_local.h
@@ -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);
diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c
index 95f63478..a2016102 100644
--- a/src/pcm/pcm_multi.c
+++ b/src/pcm/pcm_multi.c
@@ -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,
diff --git a/src/pcm/pcm_null.c b/src/pcm/pcm_null.c
index 2878a17b..f46cd6ac 100644
--- a/src/pcm/pcm_null.c
+++ b/src/pcm/pcm_null.c
@@ -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,
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 9dd4e612..253c147f 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -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,
diff --git a/src/pcm/pcm_share.c b/src/pcm/pcm_share.c
index 898f8647..148353c6 100644
--- a/src/pcm/pcm_share.c
+++ b/src/pcm/pcm_share.c
@@ -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,
diff --git a/src/pcm/pcm_shm.c b/src/pcm/pcm_shm.c
index d609e742..d543f22f 100644
--- a/src/pcm/pcm_shm.c
+++ b/src/pcm/pcm_shm.c
@@ -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,