static int snd_compr_drain(struct snd_compr_stream *stream)
{
	int retval = 0;

	if (stream->runtime->state == SNDRV_PCM_STATE_SETUP)
		return -EPERM;

	stream->runtime->drain_wake = 0;

	/* this is hackish for our tree but for now lets carry it while we fix
	 * usermode behaviour
	 */
	if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED)
		retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN);
	else
		return 0;

	if (retval) {
		pr_err("SND_COMPR_TRIGGER_DRAIN failed %d\n", retval);
		wake_up(&stream->runtime->sleep);
		return retval;
	}

	retval = snd_compress_wait_for_drain(stream);
	stream->runtime->state = SNDRV_PCM_STATE_SETUP;
	return retval;
}
static int snd_compr_partial_drain(struct snd_compr_stream *stream)
{
	int retval = 0;

	/* agaain hackish  changes */
	if (stream->runtime->state == SNDRV_PCM_STATE_SETUP)
		return -EPERM;
	/* stream can be drained only when next track has been signalled */
	if (stream->next_track == false)
		return -EPERM;

	stream->runtime->drain_wake = 0;
	if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED)
		retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN);
	else
		return 0;

	if (retval) {
		pr_err("Partial drain returned failure\n");
		wake_up(&stream->runtime->sleep);
		return retval;
	}

	stream->next_track = false;
	retval = snd_compress_wait_for_drain(stream);
	stream->runtime->state = SNDRV_PCM_STATE_SETUP;
	return retval;
}
Esempio n. 3
0
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) {
		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;

	retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_PARTIAL_DRAIN);
	if (retval) {
		pr_debug("Partial drain returned failure\n");
		wake_up(&stream->runtime->sleep);
		return retval;
	}

	stream->next_track = false;
	return snd_compress_wait_for_drain(stream);
}
static int snd_compr_drain(struct snd_compr_stream *stream)
{
	int retval;

	if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
			stream->runtime->state == SNDRV_PCM_STATE_SETUP)
		return -EPERM;

	retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN);
	if (retval) {
		pr_debug("SND_COMPR_TRIGGER_DRAIN failed %d\n", retval);
		wake_up(&stream->runtime->sleep);
		return retval;
	}

	return snd_compress_wait_for_drain(stream);
}