From 8328751e64a31fd8717983c0b1f91746b6fdd156 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 8 Nov 1999 23:19:36 +0000 Subject: [PATCH] Fixed mmaped access.. --- include/pcm.h | 6 ++++-- src/pcm/pcm_plugin.c | 9 +++++++++ src/pcm/plugin/block.c | 16 ---------------- src/pcm/plugin/mmap.c | 7 ++----- src/pcm/plugin/stream.c | 16 ---------------- 5 files changed, 15 insertions(+), 39 deletions(-) diff --git a/include/pcm.h b/include/pcm.h index 3749bce4..2569c544 100644 --- a/include/pcm.h +++ b/include/pcm.h @@ -60,8 +60,9 @@ typedef struct snd_stru_pcm_plugin snd_pcm_plugin_t; typedef enum { INIT = 0, - DRAIN = 1, - FLUSH = 2 + PREPARE = 1, + DRAIN = 2, + FLUSH = 3 } snd_pcm_plugin_action_t; #define snd_pcm_plugin_extra_data(plugin) (((char *)plugin) + sizeof(*plugin)) @@ -95,6 +96,7 @@ int snd_pcm_plugin_info(snd_pcm_t *handle, snd_pcm_channel_info_t *info); int snd_pcm_plugin_params(snd_pcm_t *handle, snd_pcm_channel_params_t *params); int snd_pcm_plugin_setup(snd_pcm_t *handle, snd_pcm_channel_setup_t *setup); int snd_pcm_plugin_status(snd_pcm_t *handle, snd_pcm_channel_status_t *status); +int snd_pcm_plugin_prepare(snd_pcm_t *handle, int channel); int snd_pcm_plugin_drain_playback(snd_pcm_t *handle); int snd_pcm_plugin_flush(snd_pcm_t *handle, int channel); int snd_pcm_plugin_pointer(snd_pcm_t *pcm, int channel, void **ptr, size_t *size); diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c index 38a9e023..931b22a0 100644 --- a/src/pcm/pcm_plugin.c +++ b/src/pcm/pcm_plugin.c @@ -504,6 +504,15 @@ int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_channel_status_t *status) return 0; } +int snd_pcm_plugin_prepare(snd_pcm_t *pcm, int channel) +{ + int err; + + if ((err = snd_pcm_plugin_action(pcm, channel, PREPARE))<0) + return err; + return snd_pcm_channel_prepare(pcm, channel); +} + int snd_pcm_plugin_drain_playback(snd_pcm_t *pcm) { int err; diff --git a/src/pcm/plugin/block.c b/src/pcm/plugin/block.c index a34cb9ec..195b4683 100644 --- a/src/pcm/plugin/block.c +++ b/src/pcm/plugin/block.c @@ -55,21 +55,6 @@ static ssize_t block_transfer(snd_pcm_plugin_t *plugin, } } -static int block_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action) -{ - struct block_private_data *data; - - if (plugin == NULL) - return -EINVAL; - data = (struct block_private_data *)snd_pcm_plugin_extra_data(plugin); - if (action == DRAIN && data->channel == SND_PCM_CHANNEL_PLAYBACK) { - return snd_pcm_drain_playback(data->pcm); - } else if (action == FLUSH) { - return snd_pcm_flush_channel(data->pcm, data->channel); - } - return 0; /* silenty ignore other actions */ -} - int snd_pcm_plugin_build_block(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r_plugin) { struct block_private_data *data; @@ -90,7 +75,6 @@ int snd_pcm_plugin_build_block(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r data->pcm = pcm; data->channel = channel; plugin->transfer = block_transfer; - plugin->action = block_action; *r_plugin = plugin; return 0; } diff --git a/src/pcm/plugin/mmap.c b/src/pcm/plugin/mmap.c index 2c99ccd2..46d87468 100644 --- a/src/pcm/plugin/mmap.c +++ b/src/pcm/plugin/mmap.c @@ -208,7 +208,6 @@ static ssize_t mmap_transfer(snd_pcm_plugin_t *plugin, static int mmap_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action) { struct mmap_private_data *data; - int res; if (plugin == NULL) return -EINVAL; @@ -217,14 +216,12 @@ static int mmap_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action) if (data->control) snd_pcm_munmap(data->pcm, data->channel); return snd_pcm_mmap(data->pcm, data->channel, &data->control, (void **)&data->buffer); + } else if (action == PREPARE) { + data->frag = 0; } else if (action == DRAIN && data->channel == SND_PCM_CHANNEL_PLAYBACK) { - res = snd_pcm_drain_playback(data->pcm); data->frag = 0; - return res; } else if (action == FLUSH) { - res = snd_pcm_flush_channel(data->pcm, data->channel); data->frag = 0; - return res; } return 0; /* silenty ignore other actions */ } diff --git a/src/pcm/plugin/stream.c b/src/pcm/plugin/stream.c index fba08b47..3324221c 100644 --- a/src/pcm/plugin/stream.c +++ b/src/pcm/plugin/stream.c @@ -55,21 +55,6 @@ static ssize_t stream_transfer(snd_pcm_plugin_t *plugin, } } -static int stream_action(snd_pcm_plugin_t *plugin, snd_pcm_plugin_action_t action) -{ - struct stream_private_data *data; - - if (plugin == NULL) - return -EINVAL; - data = (struct stream_private_data *)snd_pcm_plugin_extra_data(plugin); - if (action == DRAIN && data->channel == SND_PCM_CHANNEL_PLAYBACK) { - return snd_pcm_drain_playback(data->pcm); - } else if (action == FLUSH) { - return snd_pcm_flush_channel(data->pcm, data->channel); - } - return 0; /* silenty ignore other actions */ -} - int snd_pcm_plugin_build_stream(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t **r_plugin) { struct stream_private_data *data; @@ -90,7 +75,6 @@ int snd_pcm_plugin_build_stream(snd_pcm_t *pcm, int channel, snd_pcm_plugin_t ** data->pcm = pcm; data->channel = channel; plugin->transfer = stream_transfer; - plugin->action = stream_action; *r_plugin = plugin; return 0; } -- 2.47.1