ALSA: pcm: Check PCM state by a common helper function
authorTakashi Iwai <tiwai@suse.de>
Wed, 24 May 2017 15:51:30 +0000 (17:51 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 2 Jun 2017 17:38:20 +0000 (19:38 +0200)
Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm_lib.c

index 9c5fe62e2c51fcfa11cc64e2f3d67ee34c1be340..5fcd798672b49207bea1332a15c42067103889a9 100644 (file)
@@ -2019,6 +2019,22 @@ typedef int (*transfer_f)(struct snd_pcm_substream *substream, unsigned int hwof
                          unsigned long data, unsigned int off,
                          snd_pcm_uframes_t size);
 
+static int pcm_accessible_state(struct snd_pcm_runtime *runtime)
+{
+       switch (runtime->status->state) {
+       case SNDRV_PCM_STATE_PREPARED:
+       case SNDRV_PCM_STATE_RUNNING:
+       case SNDRV_PCM_STATE_PAUSED:
+               return 0;
+       case SNDRV_PCM_STATE_XRUN:
+               return -EPIPE;
+       case SNDRV_PCM_STATE_SUSPENDED:
+               return -ESTRPIPE;
+       default:
+               return -EBADFD;
+       }
+}
+
 static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, 
                                            unsigned long data,
                                            snd_pcm_uframes_t size,
@@ -2035,21 +2051,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream,
                return 0;
 
        snd_pcm_stream_lock_irq(substream);
-       switch (runtime->status->state) {
-       case SNDRV_PCM_STATE_PREPARED:
-       case SNDRV_PCM_STATE_RUNNING:
-       case SNDRV_PCM_STATE_PAUSED:
-               break;
-       case SNDRV_PCM_STATE_XRUN:
-               err = -EPIPE;
-               goto _end_unlock;
-       case SNDRV_PCM_STATE_SUSPENDED:
-               err = -ESTRPIPE;
-               goto _end_unlock;
-       default:
-               err = -EBADFD;
+       err = pcm_accessible_state(runtime);
+       if (err < 0)
                goto _end_unlock;
-       }
 
        runtime->twake = runtime->control->avail_min ? : 1;
        if (runtime->status->state == SNDRV_PCM_STATE_RUNNING)
@@ -2085,16 +2089,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream,
                snd_pcm_stream_lock_irq(substream);
                if (err < 0)
                        goto _end_unlock;
-               switch (runtime->status->state) {
-               case SNDRV_PCM_STATE_XRUN:
-                       err = -EPIPE;
-                       goto _end_unlock;
-               case SNDRV_PCM_STATE_SUSPENDED:
-                       err = -ESTRPIPE;
+               err = pcm_accessible_state(runtime);
+               if (err < 0)
                        goto _end_unlock;
-               default:
-                       break;
-               }
                appl_ptr += frames;
                if (appl_ptr >= runtime->boundary)
                        appl_ptr -= runtime->boundary;
@@ -2265,27 +2262,14 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream,
                return 0;
 
        snd_pcm_stream_lock_irq(substream);
-       switch (runtime->status->state) {
-       case SNDRV_PCM_STATE_PREPARED:
-               if (size >= runtime->start_threshold) {
-                       err = snd_pcm_start(substream);
-                       if (err < 0)
-                               goto _end_unlock;
-               }
-               break;
-       case SNDRV_PCM_STATE_DRAINING:
-       case SNDRV_PCM_STATE_RUNNING:
-       case SNDRV_PCM_STATE_PAUSED:
-               break;
-       case SNDRV_PCM_STATE_XRUN:
-               err = -EPIPE;
-               goto _end_unlock;
-       case SNDRV_PCM_STATE_SUSPENDED:
-               err = -ESTRPIPE;
-               goto _end_unlock;
-       default:
-               err = -EBADFD;
+       err = pcm_accessible_state(runtime);
+       if (err < 0)
                goto _end_unlock;
+       if (runtime->status->state == SNDRV_PCM_STATE_PREPARED &&
+           size >= runtime->start_threshold) {
+               err = snd_pcm_start(substream);
+               if (err < 0)
+                       goto _end_unlock;
        }
 
        runtime->twake = runtime->control->avail_min ? : 1;
@@ -2329,16 +2313,9 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream,
                snd_pcm_stream_lock_irq(substream);
                if (err < 0)
                        goto _end_unlock;
-               switch (runtime->status->state) {
-               case SNDRV_PCM_STATE_XRUN:
-                       err = -EPIPE;
-                       goto _end_unlock;
-               case SNDRV_PCM_STATE_SUSPENDED:
-                       err = -ESTRPIPE;
+               err = pcm_accessible_state(runtime);
+               if (err < 0)
                        goto _end_unlock;
-               default:
-                       break;
-               }
                appl_ptr += frames;
                if (appl_ptr >= runtime->boundary)
                        appl_ptr -= runtime->boundary;