]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fixed mmaped access..
authorJaroslav Kysela <perex@perex.cz>
Mon, 8 Nov 1999 23:19:36 +0000 (23:19 +0000)
committerJaroslav Kysela <perex@perex.cz>
Mon, 8 Nov 1999 23:19:36 +0000 (23:19 +0000)
include/pcm.h
src/pcm/pcm_plugin.c
src/pcm/plugin/block.c
src/pcm/plugin/mmap.c
src/pcm/plugin/stream.c

index 3749bce474205011d73a0b74e54d6b46ebc11310..2569c5449259958cb777bb6b5be87097d6fdf3ea 100644 (file)
@@ -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);
index 38a9e0235353684348d1ead5883b328390611a99..931b22a0d0e74026ed527a9141a2fd2055a15109 100644 (file)
@@ -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;
index a34cb9ecaee3ca10aa07ac3b4abb120cef695c41..195b4683519f5ec61329d53983ab1eab0fd2ae44 100644 (file)
@@ -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;
 }
index 2c99ccd24d9abede3ffb0a1c6d02bece05a85b39..46d874685261d3e05125497d0bfaaf7b7070b357 100644 (file)
@@ -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 */
 }
index fba08b477a61cbadb3b01d589e598442c287e117..3324221caa7d4b0bc051a8885bd758b391835dcb 100644 (file)
@@ -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;
 }