diff options
author | Abramo Bagnara <abramo@alsa-project.org> | 2000-11-24 17:08:03 +0000 |
---|---|---|
committer | Abramo Bagnara <abramo@alsa-project.org> | 2000-11-24 17:08:03 +0000 |
commit | 8c080ce9ddc111ecd108538624444337a9391583 (patch) | |
tree | 0a1edf7f82d638ea4ad5ac0fe76e2daada840035 | |
parent | 206f489fe14016faaa0ba3605add4378bcc9291e (diff) |
Added snd_pcm_reset to API
-rw-r--r-- | aserver/aserver.c | 5 | ||||
-rw-r--r-- | include/pcm.h | 1 | ||||
-rw-r--r-- | src/pcm/pcm.c | 7 | ||||
-rw-r--r-- | src/pcm/pcm_file.c | 8 | ||||
-rw-r--r-- | src/pcm/pcm_hw.c | 12 | ||||
-rw-r--r-- | src/pcm/pcm_local.h | 1 | ||||
-rw-r--r-- | src/pcm/pcm_multi.c | 7 | ||||
-rw-r--r-- | src/pcm/pcm_null.c | 9 | ||||
-rw-r--r-- | src/pcm/pcm_plugin.c | 17 | ||||
-rw-r--r-- | src/pcm/pcm_share.c | 15 | ||||
-rw-r--r-- | src/pcm/pcm_shm.c | 9 |
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, |