From 5394f605bce7cb3fce0b9ef35890f938f6699244 Mon Sep 17 00:00:00 2001 From: Andreas Pape Date: Wed, 17 Jun 2020 13:42:35 +0200 Subject: [PATCH] pcm: direct: correctly apply existing interval settings Feature 'variable periodsize' allows to extend user period size up to buffer_size/2 independent of slave period. On enlargement of the settings for period_time.max and period_size.max the setting for openmax was not updated. This lead to the effect, that if the slave period itself had openmax set it was still set on the extended size. Configuration of a period matching half buffer size was thus rejected. Example for failure: period size of 384 (half buffer size) is requested which is rejected and rounded down to 352: PERIOD_SIZE: [32 352] BUFFER_SIZE: [64 768] When correctly applying the openmax setting: PERIOD_SIZE: [32 384] BUFFER_SIZE: [64 768] Signed-off-by: Andreas Pape Signed-off-by: Jaroslav Kysela --- src/pcm/pcm_direct.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index aa60a477..66534095 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -929,10 +929,14 @@ int snd_pcm_direct_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) return err; if (dshare->var_periodsize) { /* more tolerant settings... */ - if (dshare->shmptr->hw.buffer_size.max / 2 > period_size.max) + if (dshare->shmptr->hw.buffer_size.max / 2 > period_size.max) { period_size.max = dshare->shmptr->hw.buffer_size.max / 2; - if (dshare->shmptr->hw.buffer_time.max / 2 > period_time.max) + period_size.openmax = dshare->shmptr->hw.buffer_size.openmax; + } + if (dshare->shmptr->hw.buffer_time.max / 2 > period_time.max) { period_time.max = dshare->shmptr->hw.buffer_time.max / 2; + period_time.openmax = dshare->shmptr->hw.buffer_time.openmax; + } } err = hw_param_interval_refine_one(params, SND_PCM_HW_PARAM_PERIOD_SIZE, -- 2.47.1