OSDN Git Service

Takashi: added shadow pcm to avoid problem with plug plugin and mmaped access
authorJaroslav Kysela <perex@perex.cz>
Fri, 8 Aug 2003 09:06:41 +0000 (09:06 +0000)
committerJaroslav Kysela <perex@perex.cz>
Fri, 8 Aug 2003 09:06:41 +0000 (09:06 +0000)
src/pcm/pcm_local.h
src/pcm/pcm_mmap.c
src/pcm/pcm_plug.c

index 48ba437..3a66af6 100644 (file)
@@ -201,6 +201,7 @@ struct _snd_pcm {
        snd_pcm_rbptr_t hw;
        snd_pcm_uframes_t min_align;
        int mmap_rw;
+       int shadow_mmap;
        int donot_close;
        snd_pcm_channel_info_t *mmap_channels;
        snd_pcm_channel_area_t *running_areas;
index b02115a..6d525eb 100644 (file)
@@ -295,6 +295,8 @@ int snd_pcm_mmap(snd_pcm_t *pcm)
        err = pcm->ops->mmap(pcm);
        if (err < 0)
                return err;
+       if (pcm->shadow_mmap)
+               return 0;
        pcm->mmap_channels = calloc(pcm->channels, sizeof(pcm->mmap_channels[0]));
        if (!pcm->mmap_channels)
                return -ENOMEM;
@@ -427,6 +429,8 @@ int snd_pcm_munmap(snd_pcm_t *pcm)
        unsigned int c;
        assert(pcm);
        assert(pcm->mmap_channels);
+       if (pcm->shadow_mmap)
+               return pcm->ops->munmap(pcm);
        for (c = 0; c < pcm->channels; ++c) {
                snd_pcm_channel_info_t *i = &pcm->mmap_channels[c];
                unsigned int c1;
index a3efda6..b3f43b9 100644 (file)
@@ -937,13 +937,23 @@ static int snd_pcm_plug_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *inf
        return snd_pcm_channel_info(plug->slave, info);
 }
 
-static int snd_pcm_plug_mmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
+static int snd_pcm_plug_mmap(snd_pcm_t *pcm)
 {
+       snd_pcm_plug_t *plug = pcm->private_data;
+       pcm->mmap_channels = plug->slave->mmap_channels;
+       pcm->running_areas = plug->slave->running_areas;
+       pcm->stopped_areas = plug->slave->stopped_areas;
+       pcm->shadow_mmap = 1;
        return 0;
 }
 
-static int snd_pcm_plug_munmap(snd_pcm_t *pcm ATTRIBUTE_UNUSED)
+static int snd_pcm_plug_munmap(snd_pcm_t *pcm)
 {
+       // snd_pcm_plug_t *plug = pcm->private_data;
+       pcm->mmap_channels = NULL;
+       pcm->running_areas = NULL;
+       pcm->stopped_areas = NULL;
+       pcm->shadow_mmap = 0;
        return 0;
 }