mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
Takashi: added shadow pcm to avoid problem with plug plugin and mmaped access
This commit is contained in:
parent
18927bfe9a
commit
63c19961b9
3 changed files with 17 additions and 2 deletions
|
|
@ -201,6 +201,7 @@ struct _snd_pcm {
|
||||||
snd_pcm_rbptr_t hw;
|
snd_pcm_rbptr_t hw;
|
||||||
snd_pcm_uframes_t min_align;
|
snd_pcm_uframes_t min_align;
|
||||||
int mmap_rw;
|
int mmap_rw;
|
||||||
|
int shadow_mmap;
|
||||||
int donot_close;
|
int donot_close;
|
||||||
snd_pcm_channel_info_t *mmap_channels;
|
snd_pcm_channel_info_t *mmap_channels;
|
||||||
snd_pcm_channel_area_t *running_areas;
|
snd_pcm_channel_area_t *running_areas;
|
||||||
|
|
|
||||||
|
|
@ -295,6 +295,8 @@ int snd_pcm_mmap(snd_pcm_t *pcm)
|
||||||
err = pcm->ops->mmap(pcm);
|
err = pcm->ops->mmap(pcm);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
if (pcm->shadow_mmap)
|
||||||
|
return 0;
|
||||||
pcm->mmap_channels = calloc(pcm->channels, sizeof(pcm->mmap_channels[0]));
|
pcm->mmap_channels = calloc(pcm->channels, sizeof(pcm->mmap_channels[0]));
|
||||||
if (!pcm->mmap_channels)
|
if (!pcm->mmap_channels)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
@ -427,6 +429,8 @@ int snd_pcm_munmap(snd_pcm_t *pcm)
|
||||||
unsigned int c;
|
unsigned int c;
|
||||||
assert(pcm);
|
assert(pcm);
|
||||||
assert(pcm->mmap_channels);
|
assert(pcm->mmap_channels);
|
||||||
|
if (pcm->shadow_mmap)
|
||||||
|
return pcm->ops->munmap(pcm);
|
||||||
for (c = 0; c < pcm->channels; ++c) {
|
for (c = 0; c < pcm->channels; ++c) {
|
||||||
snd_pcm_channel_info_t *i = &pcm->mmap_channels[c];
|
snd_pcm_channel_info_t *i = &pcm->mmap_channels[c];
|
||||||
unsigned int c1;
|
unsigned int c1;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue