OSDN Git Service

Merge android-4.4.190 (ac7fbca) into msm-4.4
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / sound / core / compress_offload.c
index 15f58ea..1fbd29c 100644 (file)
@@ -554,10 +554,7 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
                stream->metadata_set = false;
                stream->next_track = false;
 
-               if (stream->direction == SND_COMPRESS_PLAYBACK)
-                       stream->runtime->state = SNDRV_PCM_STATE_SETUP;
-               else
-                       stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
+               stream->runtime->state = SNDRV_PCM_STATE_SETUP;
        } else {
                return -EPERM;
        }
@@ -674,8 +671,17 @@ static int snd_compr_start(struct snd_compr_stream *stream)
 {
        int retval;
 
-       if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED)
+       switch (stream->runtime->state) {
+       case SNDRV_PCM_STATE_SETUP:
+               if (stream->direction != SND_COMPRESS_CAPTURE)
+                       return -EPERM;
+               break;
+       case SNDRV_PCM_STATE_PREPARED:
+               break;
+       default:
                return -EPERM;
+       }
+
        retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START);
        if (!retval)
                stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
@@ -686,9 +692,15 @@ static int snd_compr_stop(struct snd_compr_stream *stream)
 {
        int retval;
 
-       if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED ||
-                       stream->runtime->state == SNDRV_PCM_STATE_SETUP)
+       switch (stream->runtime->state) {
+       case SNDRV_PCM_STATE_OPEN:
+       case SNDRV_PCM_STATE_SETUP:
+       case SNDRV_PCM_STATE_PREPARED:
                return -EPERM;
+       default:
+               break;
+       }
+
        retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP);
        if (!retval) {
                stream->runtime->state = SNDRV_PCM_STATE_SETUP;
@@ -708,12 +720,21 @@ 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) {
+       switch (stream->runtime->state) {
+       case SNDRV_PCM_STATE_OPEN:
+       case SNDRV_PCM_STATE_SETUP:
+       case SNDRV_PCM_STATE_PREPARED:
+       case SNDRV_PCM_STATE_PAUSED:
                retval = -EPERM;
                goto ret;
+       case SNDRV_PCM_STATE_XRUN:
+               retval = -EPIPE;
+               goto ret;
+       default:
+               break;
        }
        mutex_unlock(&stream->device->lock);
+
        retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN);
        mutex_lock(&stream->device->lock);
        if (!retval) {
@@ -753,12 +774,21 @@ 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) {
+       switch (stream->runtime->state) {
+       case SNDRV_PCM_STATE_OPEN:
+       case SNDRV_PCM_STATE_SETUP:
+       case SNDRV_PCM_STATE_PREPARED:
+       case SNDRV_PCM_STATE_PAUSED:
                mutex_unlock(&stream->device->lock);
                return -EPERM;
+       case SNDRV_PCM_STATE_XRUN:
+               mutex_unlock(&stream->device->lock);
+               return -EPIPE;
+       default:
+               break;
        }
        mutex_unlock(&stream->device->lock);
+
        /* stream can be drained only when next track has been signalled */
        if (stream->next_track == false)
                return -EPERM;