Added snd_pcm_reset to API

This commit is contained in:
Abramo Bagnara 2000-11-24 17:08:03 +00:00
parent 206f489fe1
commit 8c080ce9dd
11 changed files with 91 additions and 0 deletions

View 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;

View 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);

View 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);

View 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,

View 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,

View 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);

View 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,

View 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,

View 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,

View 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,

View 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,