]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: Remove resume support from dmix & co
authorTakashi Iwai <tiwai@suse.de>
Wed, 18 May 2016 08:38:27 +0000 (10:38 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 18 May 2016 08:49:06 +0000 (10:49 +0200)
PCM dmix and other plugins inherit the resume behavior from the slave
PCM.  However, the resume on dmix can't work reliably even if the
slave PCM may do resume.  The running state of each dmix stream is
individual and may be PREPARED or RUN_PENDING while the slave PCM is
already in RUNNING.  And, when the slave PCM is resumed, the whole
samples that have been already mapped are also played back, even if
the corresponding dmix stream is still in SUSPENDED.  Such
inconsistencies can't be avoided as long as we manage each stream
individually.

That said, dmix & co can't provide the proper resume support "by
design".  For aligning with it, we should drop the whole resume code
and clear the PCM SND_PCM_INFO_RESUME flag.

Reported-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_direct.c

index ac082f1a73b236a66cb9fe62091b8735edd4cea4..53c49929cb1f3ebc648574013191c8ec9873dc83 100644 (file)
@@ -837,27 +837,7 @@ int snd_pcm_direct_prepare(snd_pcm_t *pcm)
 
 int snd_pcm_direct_resume(snd_pcm_t *pcm)
 {
-       snd_pcm_direct_t *dmix = pcm->private_data;
-       int err;
-       
-       snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
-       /* resume only when the slave PCM is still in suspended state */
-       if (snd_pcm_state(dmix->spcm) != SND_PCM_STATE_SUSPENDED) {
-               err = 0;
-               goto out;
-       }
-
-       err = snd_pcm_resume(dmix->spcm);
-       if (err == -ENOSYS) {
-               /* FIXME: error handling? */
-               snd_pcm_prepare(dmix->spcm);
-               snd_pcm_start(dmix->spcm);
-               err = 0;
-       }
- out:
-       dmix->state = snd_pcm_state(dmix->spcm);
-       snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
-       return err;
+       return -ENOSYS;
 }
 
 #define COPY_SLAVE(field) (dmix->shmptr->s.field = spcm->field)
@@ -865,7 +845,7 @@ int snd_pcm_direct_resume(snd_pcm_t *pcm)
 /* copy the slave setting */
 static void save_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
 {
-       spcm->info &= ~SND_PCM_INFO_PAUSE;
+       spcm->info &= ~(SND_PCM_INFO_PAUSE | SND_PCM_INFO_RESUME);
 
        COPY_SLAVE(access);
        COPY_SLAVE(format);