Skip to content

Commit f79a732

Browse files
vinodkoultiwai
authored andcommitted
ALSA: compress: fix partial_drain completion state
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 <[email protected]> Tested-by: Srinivas Kandagatla <[email protected]> Reviewed-by: Charles Keepax <[email protected]> Tested-by: Charles Keepax <[email protected]> Signed-off-by: Vinod Koul <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Takashi Iwai <[email protected]>
1 parent b6a1e78 commit f79a732

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
@@ -66,6 +66,7 @@ struct snd_compr_runtime {
6666
* @direction: stream direction, playback/recording
6767
* @metadata_set: metadata set flag, true when set
6868
* @next_track: has userspace signal next track transition, true when set
69+
* @partial_drain: undergoing partial_drain for stream, true when set
6970
* @private_data: pointer to DSP private data
7071
* @dma_buffer: allocated buffer if any
7172
*/
@@ -78,6 +79,7 @@ struct snd_compr_stream {
7879
enum snd_compr_direction direction;
7980
bool metadata_set;
8081
bool next_track;
82+
bool partial_drain;
8183
void *private_data;
8284
struct snd_dma_buffer dma_buffer;
8385
};
@@ -182,7 +184,13 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)
182184
if (snd_BUG_ON(!stream))
183185
return;
184186

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

187195
wake_up(&stream->runtime->sleep);
188196
}

sound/core/compress_offload.c

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

765765
retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP);
766766
if (!retval) {
767+
/* clear flags and stop any drain wait */
768+
stream->partial_drain = false;
769+
stream->metadata_set = false;
767770
snd_compr_drain_notify(stream);
768771
stream->runtime->total_bytes_available = 0;
769772
stream->runtime->total_bytes_transferred = 0;
@@ -921,6 +924,7 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream)
921924
if (stream->next_track == false)
922925
return -EPERM;
923926

927+
stream->partial_drain = true;
924928
retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN);
925929
if (retval) {
926930
pr_debug("Partial drain returned failure\n");

0 commit comments

Comments
 (0)