]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: direct: correctly apply existing interval settings
authorAndreas Pape <apape@de.adit-jv.com>
Wed, 17 Jun 2020 11:42:35 +0000 (13:42 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 17 Jun 2020 13:33:55 +0000 (15:33 +0200)
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 <apape@de.adit-jv.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/pcm/pcm_direct.c

index aa60a47774aebdeda7b4f9e3afe8ffad831c52b5..665340954cf341b74bd9fb570af7011cc2a72714 100644 (file)
@@ -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,