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; }
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); }