forked from Minki/linux
[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: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
bbdc1b7dbe
commit
1576274d30
@ -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 *group; /* pointer to current group */
|
||||
/* -- assigned files -- */
|
||||
struct snd_pcm_file *file;
|
||||
void *file;
|
||||
struct file *ffile;
|
||||
void (*pcm_release)(struct snd_pcm_substream *);
|
||||
#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,
|
||||
substream->oss.setup = *setup;
|
||||
if (setup->nonblock)
|
||||
substream->ffile->f_flags |= O_NONBLOCK;
|
||||
else
|
||||
else if (setup->block)
|
||||
substream->ffile->f_flags &= ~O_NONBLOCK;
|
||||
runtime = substream->runtime;
|
||||
runtime->oss.params = 1;
|
||||
@ -1757,6 +1757,7 @@ static int snd_pcm_oss_open_file(struct file *file,
|
||||
}
|
||||
|
||||
pcm_oss_file->streams[idx] = substream;
|
||||
substream->file = pcm_oss_file;
|
||||
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)
|
||||
err = -EFAULT;
|
||||
goto __error;
|
||||
}
|
||||
memset(setup, 0, sizeof(*setup));
|
||||
memset(setup, 0, sizeof(setup));
|
||||
if (file->f_mode & FMODE_WRITE)
|
||||
snd_pcm_oss_look_for_setup(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||
task_name, &setup[0]);
|
||||
|
@ -2007,14 +2007,16 @@ static void pcm_release_private(struct snd_pcm_substream *substream)
|
||||
void snd_pcm_release_substream(struct snd_pcm_substream *substream)
|
||||
{
|
||||
snd_pcm_drop(substream);
|
||||
if (substream->pcm_release)
|
||||
substream->pcm_release(substream);
|
||||
if (substream->hw_opened) {
|
||||
if (substream->ops->hw_free != NULL)
|
||||
substream->ops->hw_free(substream);
|
||||
substream->ops->close(substream);
|
||||
substream->hw_opened = 0;
|
||||
}
|
||||
if (substream->pcm_release) {
|
||||
substream->pcm_release(substream);
|
||||
substream->pcm_release = NULL;
|
||||
}
|
||||
snd_pcm_detach_substream(substream);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user