Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f6d8d26 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ALSA: compress: use mutex in drain"

parents 1e117ba8 413db9c2
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -690,18 +690,29 @@ static int snd_compr_stop(struct snd_compr_stream *stream)
	return retval;
}

/* this fn is called without lock being held and we change stream states here
 * so while using the stream state auquire the lock but relase before invoking
 * DSP as the call will possibly take a while
 */
static int snd_compr_drain(struct snd_compr_stream *stream)
{
	int retval;

	mutex_lock(&stream->device->lock);
	if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
			stream->runtime->state == SNDRV_PCM_STATE_SETUP)
		return -EPERM;
			stream->runtime->state == SNDRV_PCM_STATE_SETUP) {
		retval = -EPERM;
		goto ret;
	}
	mutex_unlock(&stream->device->lock);
	retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN);
	mutex_lock(&stream->device->lock);
	if (!retval) {
		stream->runtime->state = SNDRV_PCM_STATE_DRAINING;
		wake_up(&stream->runtime->sleep);
	}
ret:
	mutex_unlock(&stream->device->lock);
	return retval;
}

@@ -730,9 +741,14 @@ static int snd_compr_next_track(struct snd_compr_stream *stream)
static int snd_compr_partial_drain(struct snd_compr_stream *stream)
{
	int retval;

	mutex_lock(&stream->device->lock);
	if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
			stream->runtime->state == SNDRV_PCM_STATE_SETUP)
			stream->runtime->state == SNDRV_PCM_STATE_SETUP) {
		mutex_unlock(&stream->device->lock);
		return -EPERM;
	}
	mutex_unlock(&stream->device->lock);
	/* stream can be drained only when next track has been signalled */
	if (stream->next_track == false)
		return -EPERM;