ALSA: pcm: probe events when parameters are changed actually
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 11 Jun 2017 14:56:13 +0000 (23:56 +0900)
committerTakashi Iwai <tiwai@suse.de>
Sun, 11 Jun 2017 17:05:32 +0000 (19:05 +0200)
At present, trace events are probed even if corresponding parameter is
not actually changed. This is inconvenient.

This commit improves the behaviour.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm_native.c

index 425f54827e783269bbe9a54f8fab5c123eefd582..5099078dde93a3f774d167afbc30e6f64c7c970b 100644 (file)
@@ -278,12 +278,12 @@ static int constrain_mask_params(struct snd_pcm_substream *substream,
                changed = snd_mask_refine(m, constrs_mask(constrs, k));
                if (changed < 0)
                        return changed;
-
-               trace_hw_mask_param(substream, k, 0, &old_mask, m);
+               if (changed == 0)
+                       continue;
 
                /* Set corresponding flag so that the caller gets it. */
-               if (changed)
-                       params->cmask |= 1 << k;
+               trace_hw_mask_param(substream, k, 0, &old_mask, m);
+               params->cmask |= 1 << k;
        }
 
        return 0;
@@ -314,12 +314,12 @@ static int constrain_interval_params(struct snd_pcm_substream *substream,
                changed = snd_interval_refine(i, constrs_interval(constrs, k));
                if (changed < 0)
                        return changed;
-
-               trace_hw_interval_param(substream, k, 0, &old_interval, i);
+               if (changed == 0)
+                       continue;
 
                /* Set corresponding flag so that the caller gets it. */
-               if (changed)
-                       params->cmask |= 1 << k;
+               trace_hw_interval_param(substream, k, 0, &old_interval, i);
+               params->cmask |= 1 << k;
        }
 
        return 0;
@@ -409,29 +409,29 @@ retry:
                if (changed < 0)
                        return changed;
 
-               if (hw_is_mask(r->var)) {
-                       trace_hw_mask_param(substream, r->var, k + 1,
-                               &old_mask, hw_param_mask(params, r->var));
-               }
-               if (hw_is_interval(r->var)) {
-                       trace_hw_interval_param(substream, r->var, k + 1,
-                               &old_interval, hw_param_interval(params, r->var));
-               }
-
-               rstamps[k] = stamp;
-
                /*
-                * When the parameters is changed, notify it to the caller
+                * When the parameter is changed, notify it to the caller
                 * by corresponding returned bit, then preparing for next
                 * iteration.
                 */
                if (changed && r->var >= 0) {
+                       if (hw_is_mask(r->var)) {
+                               trace_hw_mask_param(substream, r->var,
+                                       k + 1, &old_mask,
+                                       hw_param_mask(params, r->var));
+                       }
+                       if (hw_is_interval(r->var)) {
+                               trace_hw_interval_param(substream, r->var,
+                                       k + 1, &old_interval,
+                                       hw_param_interval(params, r->var));
+                       }
+
                        params->cmask |= (1 << r->var);
                        vstamps[r->var] = stamp;
                        again = true;
                }
 
-               stamp++;
+               rstamps[k] = stamp++;
        }
 
        /* Iterate to evaluate all rules till no parameters are changed. */
@@ -604,7 +604,7 @@ static int snd_pcm_hw_params_choose(struct snd_pcm_substream *pcm,
        const int *v;
        struct snd_mask old_mask;
        struct snd_interval old_interval;
-       int err;
+       int changed;
 
        for (v = vars; *v != -1; v++) {
                /* Keep old parameter to trace. */
@@ -617,13 +617,15 @@ static int snd_pcm_hw_params_choose(struct snd_pcm_substream *pcm,
                                old_interval = *hw_param_interval(params, *v);
                }
                if (*v != SNDRV_PCM_HW_PARAM_BUFFER_SIZE)
-                       err = snd_pcm_hw_param_first(pcm, params, *v, NULL);
+                       changed = snd_pcm_hw_param_first(pcm, params, *v, NULL);
                else
-                       err = snd_pcm_hw_param_last(pcm, params, *v, NULL);
-               if (snd_BUG_ON(err < 0))
-                       return err;
+                       changed = snd_pcm_hw_param_last(pcm, params, *v, NULL);
+               if (snd_BUG_ON(changed < 0))
+                       return changed;
+               if (changed == 0)
+                       continue;
 
-               /* Trace the parameter. */
+               /* Trace the changed parameter. */
                if (hw_is_mask(*v)) {
                        trace_hw_mask_param(pcm, *v, 0, &old_mask,
                                            hw_param_mask(params, *v));