mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
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>
This commit is contained in:
parent
c9a0d7d601
commit
d942498bfb
1 changed files with 2 additions and 22 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue