diff options
author | Liam Girdwood <liam.r.girdwood@linux.intel.com> | 2013-09-13 17:43:16 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2013-09-26 09:28:22 +0200 |
commit | b26d19e44adfd10b691bf4ffd50ed411c1be9317 (patch) | |
tree | 94378d0e6f3860bcd3ba30aca2566f8928251ce2 | |
parent | 4028b6c4c03f213260e9290ff3a6b5439aad07ce (diff) | |
download | linux-b26d19e44adfd10b691bf4ffd50ed411c1be9317.tar.bz2 |
ALSA: compress: Make sure we trigger STOP before closing the stream.
Currently we assume that userspace will shut down the compressed stream
correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont
stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | sound/core/compress_offload.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 5863ba6dd12b..bea523a5d852 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data; + struct snd_compr_runtime *runtime = data->stream.runtime; + + switch (runtime->state) { + case SNDRV_PCM_STATE_RUNNING: + case SNDRV_PCM_STATE_DRAINING: + case SNDRV_PCM_STATE_PAUSED: + data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP); + break; + default: + break; + } + data->stream.ops->free(&data->stream); kfree(data->stream.runtime->buffer); kfree(data->stream.runtime); |