int snd_pcm_params_info(snd_pcm_t *handle, snd_pcm_params_info_t *info);
int snd_pcm_params(snd_pcm_t *handle, snd_pcm_params_t *params);
int snd_pcm_setup(snd_pcm_t *handle, snd_pcm_setup_t *setup);
+int snd_pcm_channel_info(snd_pcm_t *handle, snd_pcm_channel_info_t *info);
+int snd_pcm_channel_params(snd_pcm_t *handle, snd_pcm_channel_params_t *params);
int snd_pcm_channel_setup(snd_pcm_t *handle, snd_pcm_channel_setup_t *setup);
int snd_pcm_status(snd_pcm_t *handle, snd_pcm_status_t *status);
int snd_pcm_prepare(snd_pcm_t *handle);
return 0;
}
+int snd_pcm_channel_info(snd_pcm_t *handle, snd_pcm_channel_info_t *info)
+{
+ assert(handle && info);
+ return handle->fast_ops->channel_info(handle->fast_op_arg, info);
+}
+
+int snd_pcm_channel_params(snd_pcm_t *handle, snd_pcm_channel_params_t *params)
+{
+ assert(handle && params);
+ return handle->fast_ops->channel_params(handle->fast_op_arg, params);
+}
+
int snd_pcm_channel_setup(snd_pcm_t *handle, snd_pcm_channel_setup_t *setup)
{
assert(handle && setup);
return handle->fast_ops->go(handle->fast_op_arg);
}
-#if 0
-int snd_pcm_synchro(snd_pcm_synchro_cmd_t cmd,
- unsigned int reqs_count, snd_pcm_synchro_request_t *reqs,
- snd_pcm_synchro_mode_t mode)
-{
- snd_pcm_sync_request_t *sync_reqs;
- snd_pcm_sync_t sync;
- unsigned int k;
- int ret;
- assert(reqs_count > 0 && reqs);
- sync_reqs = __builtin_alloca(sizeof(*sync_reqs) * reqs_count);
- switch (cmd) {
- case SND_PCM_SYNCHRO_GO:
- sync.cmd = SND_PCM_IOCTL_GO;
- break;
- default:
- assert(0);
- return -EINVAL;
- }
- sync.mode = mode;
- sync.requests_count = reqs_count;
- sync.requests = sync_reqs;
- for (k = 0; k < reqs_count; ++k) {
- switch (snd_pcm_type(reqs[k].handle)) {
- case SND_PCM_TYPE_HW:
- case SND_PCM_TYPE_PLUG:
- sync_reqs[k].fd = snd_pcm_file_descriptor(reqs[k].handle);
- break;
- default:
- /* Not yet implemented */
- assert(0);
- return -ENOSYS;
- }
- }
- if (ioctl(sync_reqs[0].fd, SND_PCM_IOCTL_SYNC, &sync) < 0)
- ret = -errno;
- else
- ret = 0;
- for (k = 0; k < reqs_count; ++k) {
- reqs[k].tstamp = sync_reqs[k].tstamp;
- reqs[k].result = sync_reqs[k].result;
- }
- return ret;
-}
-#endif
-
int snd_pcm_drain(snd_pcm_t *handle)
{
assert(handle);
return 0;
}
+static int snd_pcm_hw_channel_info(void *private, snd_pcm_channel_info_t * info)
+{
+ snd_pcm_hw_t *hw = (snd_pcm_hw_t*) private;
+ int fd = hw->fd;
+ if (ioctl(fd, SND_PCM_IOCTL_CHANNEL_INFO, info) < 0)
+ return -errno;
+ return 0;
+}
+
+static int snd_pcm_hw_channel_params(void *private, snd_pcm_channel_params_t * params)
+{
+ snd_pcm_hw_t *hw = (snd_pcm_hw_t*) private;
+ int fd = hw->fd;
+ if (ioctl(fd, SND_PCM_IOCTL_CHANNEL_PARAMS, params) < 0)
+ return -errno;
+ return 0;
+}
+
static int snd_pcm_hw_channel_setup(void *private, snd_pcm_channel_setup_t * setup)
{
snd_pcm_hw_t *hw = (snd_pcm_hw_t*) private;
struct snd_pcm_fast_ops snd_pcm_hw_fast_ops = {
nonblock: snd_pcm_hw_nonblock,
+ channel_info: snd_pcm_hw_channel_info,
+ channel_params: snd_pcm_hw_channel_params,
channel_setup: snd_pcm_hw_channel_setup,
status: snd_pcm_hw_status,
frame_io: snd_pcm_hw_frame_io,
struct snd_pcm_fast_ops {
int (*nonblock)(void *private, int nonblock);
int (*status)(void *private, snd_pcm_status_t *status);
+ int (*channel_info)(void *private, snd_pcm_channel_info_t *info);
+ int (*channel_params)(void *private, snd_pcm_channel_params_t *params);
int (*channel_setup)(void *private, snd_pcm_channel_setup_t *setup);
int (*prepare)(void *private);
int (*go)(void *private);
return snd_pcm_pause(multi->slaves[0].handle, enable);
}
+static int snd_pcm_multi_channel_info(void *private, snd_pcm_channel_info_t *info)
+{
+ int err;
+ snd_pcm_multi_t *multi = (snd_pcm_multi_t*) private;
+ unsigned int channel = info->channel;
+ unsigned int i;
+ for (i = 0; i < multi->bindings_count; ++i) {
+ if (multi->bindings[i].client_channel == channel) {
+ info->channel = multi->bindings[i].slave_channel;
+ err = snd_pcm_channel_info(multi->slaves[multi->bindings[i].slave].handle, info);
+ info->channel = channel;
+ return err;
+ }
+ }
+ info->channel = channel;
+ return -EINVAL;
+}
+
+static int snd_pcm_multi_channel_params(void *private, snd_pcm_channel_params_t *params)
+{
+ int err;
+ snd_pcm_multi_t *multi = (snd_pcm_multi_t*) private;
+ unsigned int channel = params->channel;
+ unsigned int i;
+ for (i = 0; i < multi->bindings_count; ++i) {
+ if (multi->bindings[i].client_channel == channel) {
+ params->channel = multi->bindings[i].slave_channel;
+ err = snd_pcm_channel_params(multi->slaves[multi->bindings[i].slave].handle, params);
+ params->channel = channel;
+ return err;
+ }
+ }
+ params->channel = channel;
+ return -EINVAL;
+}
+
static int snd_pcm_multi_channel_setup(void *private, snd_pcm_channel_setup_t *setup)
{
int err;
struct snd_pcm_fast_ops snd_pcm_multi_fast_ops = {
nonblock: snd_pcm_multi_nonblock,
+ channel_info: snd_pcm_multi_channel_info,
+ channel_params: snd_pcm_multi_channel_params,
channel_setup: snd_pcm_multi_channel_setup,
status: snd_pcm_multi_status,
frame_io: snd_pcm_multi_frame_io,
return 0;
}
+static int snd_pcm_plug_channel_info(void *private ATTRIBUTE_UNUSED, snd_pcm_channel_info_t *info ATTRIBUTE_UNUSED)
+{
+ /* FIXME: if route plugin is not inserted or its ttable is trivial
+ this should be implemented */
+ return -ENOSYS;
+}
+
+static int snd_pcm_plug_channel_params(void *private ATTRIBUTE_UNUSED, snd_pcm_channel_params_t *params ATTRIBUTE_UNUSED)
+{
+ /* FIXME: if route plugin is not inserted or its ttable is trivial
+ this should be implemented */
+ return -ENOSYS;
+}
+
static int snd_pcm_plug_channel_setup(void *private ATTRIBUTE_UNUSED, snd_pcm_channel_setup_t *setup ATTRIBUTE_UNUSED)
{
- /* FIXME: non mmap setups */
- return -ENXIO;
+ /* FIXME: if route plugin is not inserted or its ttable is trivial
+ this should be implemented for non mmap setups */
+ return -ENOSYS;
}
static ssize_t snd_pcm_plug_frame_data(void *private, off_t offset)
struct snd_pcm_fast_ops snd_pcm_plug_fast_ops = {
nonblock: snd_pcm_plug_nonblock,
+ channel_info: snd_pcm_plug_channel_info,
+ channel_params: snd_pcm_plug_channel_params,
channel_setup: snd_pcm_plug_channel_setup,
status: snd_pcm_plug_status,
frame_io: snd_pcm_plug_frame_io,