All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shengjiu Wang <shengjiu.wang@nxp.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: "alsa-devel@alsa-project.org" <alsa-devel@alsa-project.org>
Subject: Re: [PATCH] pcm: Don't store the state for SND_PCM_STATE_SUSPENDED
Date: Fri, 20 May 2016 09:41:25 +0000	[thread overview]
Message-ID: <HE1PR04MB212271FEAAEFBBE21A2E358FE34B0@HE1PR04MB2122.eurprd04.prod.outlook.com> (raw)
In-Reply-To: <s5h60ubn42y.wl-tiwai@suse.de>

Hi Takashi

   I tested your patch, after suspend and resume, the playback is stopped.
It is caused by the DMA. DMA is not started after resume.

With your patch, DMA is not terminated but then is re-started. The driver don't
support this behavior. 

Best regards
Wang shengjiu

> -----Original Message-----
> From: Takashi Iwai [mailto:tiwai@suse.de]
> Sent: Wednesday, May 18, 2016 4:49 PM
> To: Shengjiu Wang
> Cc: perex@perex.cz; alsa-devel@alsa-project.org
> Subject: Re: [PATCH] pcm: Don't store the state for
> SND_PCM_STATE_SUSPENDED
> 
> On Wed, 18 May 2016 07:48:15 +0200,
> Shengjiu Wang wrote:
> >
> > Hi Takashi
> >
> >   After adding your patch, I find another regression issue.
> >
> >   The alsa-lib may stop at
> >
> >   snd_pcm_write_areas()
> > 		snd_pcm_wait_nocheck()
> >
> >   with suspend and resume test.
> >
> >   The reason is that:
> >
> >   In the beginning of playback, before the snd_pcm_dmix_start() is
> > called, the system enter suspend. After resume,
> snd_pcm_direct_resume()
> > update the dmix->state, and dmix->state is 3 (RUNNING, because
> > the dmix->spcm is in RUNNING from snd_pcm_dmix_open()).
> >
> >   So in snd_pcm_write_areas() the state is RUNNING, then
> > snd_pcm_start() will never be called, after a while,
> > alsa-lib will stop at the snd_pcm_wait_nocheck() for the kernel
> > will not wake up the timer.
> 
> A good point.  Actually the culprit is that we declare dmix as if it's
> supporting the resume properly.  Even if the resume works in the
> slave, dmix itself can't guarantee the proper resume.  So, we should
> rather drop the whole resume stuff from dmix & co.
> 
> Below is the patch against to the current git tree.  Give it a try.
> 
> 
> thanks,
> 
> Takashi
> 
> ---
> From: Takashi Iwai <tiwai@suse.de>
> Subject: [PATCH] pcm: Remove resume support from dmix & co
> 
> 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 | 24 ++----------------------
>  1 file changed, 2 insertions(+), 22 deletions(-)
> 
> diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
> index ac082f1a73b2..53c49929cb1f 100644
> --- a/src/pcm/pcm_direct.c
> +++ b/src/pcm/pcm_direct.c
> @@ -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);
> --
> 2.8.2

  parent reply	other threads:[~2016-05-20  9:41 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-10  7:45 [PATCH] pcm: Don't store the state for SND_PCM_STATE_SUSPENDED Shengjiu Wang
2016-05-10  8:22 ` Takashi Iwai
2016-05-11  2:28   ` Shengjiu Wang
2016-05-11  5:15     ` Takashi Iwai
2016-05-11  6:24       ` Shengjiu Wang
2016-05-11  7:13         ` Takashi Iwai
2016-05-18  5:48           ` Shengjiu Wang
2016-05-18  8:49             ` Takashi Iwai
2016-05-20  7:27               ` Takashi Iwai
2016-05-20 10:03                 ` Shengjiu Wang
2016-05-20  9:41               ` Shengjiu Wang [this message]
2016-05-20 10:46                 ` Takashi Iwai
2016-05-20 14:31                   ` Takashi Iwai
2016-05-24 10:12                     ` Shengjiu Wang
2016-05-24 10:18                       ` Takashi Iwai
2016-05-28  8:46                         ` Takashi Iwai
2016-05-31  9:27                           ` Shengjiu Wang
2016-05-31 10:52                             ` Takashi Iwai
2016-06-01  3:10                               ` Shengjiu Wang
2016-06-01  5:15                                 ` Takashi Iwai
2016-05-31  7:30                         ` Shengjiu Wang
2016-05-31  7:47                           ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=HE1PR04MB212271FEAAEFBBE21A2E358FE34B0@HE1PR04MB2122.eurprd04.prod.outlook.com \
    --to=shengjiu.wang@nxp.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.