Commit 1576274d authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] Fix Oops of PCM OSS emulation

Modules: PCM Midlevel,ALSA<-OSS emulation

Fix Oops of PCM OSS emulation occuring when multiple playback is used.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent bbdc1b7d
...@@ -367,7 +367,7 @@ struct snd_pcm_substream { ...@@ -367,7 +367,7 @@ struct snd_pcm_substream {
struct snd_pcm_group self_group; /* fake group for non linked substream (with substream lock inside) */ struct snd_pcm_group self_group; /* fake group for non linked substream (with substream lock inside) */
struct snd_pcm_group *group; /* pointer to current group */ struct snd_pcm_group *group; /* pointer to current group */
/* -- assigned files -- */ /* -- assigned files -- */
struct snd_pcm_file *file; void *file;
struct file *ffile; struct file *ffile;
void (*pcm_release)(struct snd_pcm_substream *); void (*pcm_release)(struct snd_pcm_substream *);
#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE) #if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
......
...@@ -1682,7 +1682,7 @@ static void snd_pcm_oss_init_substream(struct snd_pcm_substream *substream, ...@@ -1682,7 +1682,7 @@ static void snd_pcm_oss_init_substream(struct snd_pcm_substream *substream,
substream->oss.setup = *setup; substream->oss.setup = *setup;
if (setup->nonblock) if (setup->nonblock)
substream->ffile->f_flags |= O_NONBLOCK; substream->ffile->f_flags |= O_NONBLOCK;
else else if (setup->block)
substream->ffile->f_flags &= ~O_NONBLOCK; substream->ffile->f_flags &= ~O_NONBLOCK;
runtime = substream->runtime; runtime = substream->runtime;
runtime->oss.params = 1; runtime->oss.params = 1;
...@@ -1757,6 +1757,7 @@ static int snd_pcm_oss_open_file(struct file *file, ...@@ -1757,6 +1757,7 @@ static int snd_pcm_oss_open_file(struct file *file,
} }
pcm_oss_file->streams[idx] = substream; pcm_oss_file->streams[idx] = substream;
substream->file = pcm_oss_file;
snd_pcm_oss_init_substream(substream, &setup[idx], minor); snd_pcm_oss_init_substream(substream, &setup[idx], minor);
} }
...@@ -1809,7 +1810,7 @@ static int snd_pcm_oss_open(struct inode *inode, struct file *file) ...@@ -1809,7 +1810,7 @@ static int snd_pcm_oss_open(struct inode *inode, struct file *file)
err = -EFAULT; err = -EFAULT;
goto __error; goto __error;
} }
memset(setup, 0, sizeof(*setup)); memset(setup, 0, sizeof(setup));
if (file->f_mode & FMODE_WRITE) if (file->f_mode & FMODE_WRITE)
snd_pcm_oss_look_for_setup(pcm, SNDRV_PCM_STREAM_PLAYBACK, snd_pcm_oss_look_for_setup(pcm, SNDRV_PCM_STREAM_PLAYBACK,
task_name, &setup[0]); task_name, &setup[0]);
......
...@@ -2007,14 +2007,16 @@ static void pcm_release_private(struct snd_pcm_substream *substream) ...@@ -2007,14 +2007,16 @@ static void pcm_release_private(struct snd_pcm_substream *substream)
void snd_pcm_release_substream(struct snd_pcm_substream *substream) void snd_pcm_release_substream(struct snd_pcm_substream *substream)
{ {
snd_pcm_drop(substream); snd_pcm_drop(substream);
if (substream->pcm_release)
substream->pcm_release(substream);
if (substream->hw_opened) { if (substream->hw_opened) {
if (substream->ops->hw_free != NULL) if (substream->ops->hw_free != NULL)
substream->ops->hw_free(substream); substream->ops->hw_free(substream);
substream->ops->close(substream); substream->ops->close(substream);
substream->hw_opened = 0; substream->hw_opened = 0;
} }
if (substream->pcm_release) {
substream->pcm_release(substream);
substream->pcm_release = NULL;
}
snd_pcm_detach_substream(substream); snd_pcm_detach_substream(substream);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment