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