Skip to content

Commit 1709c33

Browse files
vinodkoulgregkh
authored andcommitted
ALSA: compress: fix partial_drain completion state
[ Upstream commit f79a732 ] On partial_drain completion we should be in SNDRV_PCM_STATE_RUNNING state, so set that for partially draining streams in snd_compr_drain_notify() and use a flag for partially draining streams While at it, add locks for stream state change in snd_compr_drain_notify() as well. Fixes: f44f2a5 ("ALSA: compress: fix drain calls blocking other compress functions (v6)") Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com> Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Vinod Koul <vkoul@kernel.org> Link: https://lore.kernel.org/r/20200629134737.105993-4-vkoul@kernel.org Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 1f81358 commit 1709c33

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

include/sound/compress_driver.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ struct snd_compr_runtime {
7272
* @direction: stream direction, playback/recording
7373
* @metadata_set: metadata set flag, true when set
7474
* @next_track: has userspace signal next track transition, true when set
75+
* @partial_drain: undergoing partial_drain for stream, true when set
7576
* @private_data: pointer to DSP private data
7677
*/
7778
struct snd_compr_stream {
@@ -83,6 +84,7 @@ struct snd_compr_stream {
8384
enum snd_compr_direction direction;
8485
bool metadata_set;
8586
bool next_track;
87+
bool partial_drain;
8688
void *private_data;
8789
};
8890

@@ -185,7 +187,13 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)
185187
if (snd_BUG_ON(!stream))
186188
return;
187189

188-
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
190+
/* for partial_drain case we are back to running state on success */
191+
if (stream->partial_drain) {
192+
stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
193+
stream->partial_drain = false; /* clear this flag as well */
194+
} else {
195+
stream->runtime->state = SNDRV_PCM_STATE_SETUP;
196+
}
189197

190198
wake_up(&stream->runtime->sleep);
191199
}

sound/core/compress_offload.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,9 @@ static int snd_compr_stop(struct snd_compr_stream *stream)
723723

724724
retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP);
725725
if (!retval) {
726+
/* clear flags and stop any drain wait */
727+
stream->partial_drain = false;
728+
stream->metadata_set = false;
726729
snd_compr_drain_notify(stream);
727730
stream->runtime->total_bytes_available = 0;
728731
stream->runtime->total_bytes_transferred = 0;
@@ -880,6 +883,7 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream)
880883
if (stream->next_track == false)
881884
return -EPERM;
882885

886+
stream->partial_drain = true;
883887
retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN);
884888
if (retval) {
885889
pr_debug("Partial drain returned failure\n");

0 commit comments

Comments
 (0)