You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2022/04/10 22:12:17 UTC

[incubator-nuttx] 01/03: Fixes some issues with the implementation of the balance functionality. In function "wm8904_hw_reset" the priv->balance is initialized with b16HALF, indicating a range from 0 to b16ONE. In function "wm8904_setvolume" the assumed range for priv->balance is between 0 and 1000. The changes now make this consistent for 0 to b16ONE-1. Furthermore, in wm8904_configure the change of balance was not implemented.

This is an automated email from the ASF dual-hosted git repository.

acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git

commit eb3e8175de4cf7d5d7ec73c7e0abe86cf72cf09f
Author: okayserh <o....@gmail.com>
AuthorDate: Sun Apr 10 19:00:22 2022 +0200

    Fixes some issues with the implementation of the balance
    functionality. In function "wm8904_hw_reset" the priv->balance
    is initialized with b16HALF, indicating a range from
    0 to b16ONE. In function "wm8904_setvolume" the assumed
    range for priv->balance is between 0 and 1000. The changes
    now make this consistent for 0 to b16ONE-1. Furthermore,
    in wm8904_configure the change of balance was not implemented.
---
 drivers/audio/wm8904.c | 40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)

diff --git a/drivers/audio/wm8904.c b/drivers/audio/wm8904.c
index baec14523c..2a056cb8b9 100644
--- a/drivers/audio/wm8904.c
+++ b/drivers/audio/wm8904.c
@@ -480,22 +480,24 @@ static void wm8904_setvolume(FAR struct wm8904_dev_s *priv, uint16_t volume,
 #ifndef CONFIG_AUDIO_EXCLUDE_BALANCE
   /* Calculate the left channel volume level {0..1000} */
 
-  if (priv->balance <= 500)
+  if (priv->balance <= (b16HALF - 1))
     {
       leftlevel = volume;
     }
-  else if (priv->balance == 1000)
+  else if (priv->balance == (b16ONE - 1))
     {
       leftlevel = 0;
     }
   else
     {
-      leftlevel = wm8904_scalevolume(volume, b16ONE - (b16_t)priv->balance);
+      /* Note: b16ONE - balance goes from 0 to 0.5. Hence need to multiply volume by 2! */
+
+      leftlevel = wm8904_scalevolume(2 * volume, b16ONE - (b16_t)priv->balance);
     }
 
   /* Calculate the right channel volume level {0..1000} */
 
-  if (priv->balance >= 500)
+  if (priv->balance >= (b16HALF - 1))
     {
       rightlevel = volume;
     }
@@ -505,7 +507,9 @@ static void wm8904_setvolume(FAR struct wm8904_dev_s *priv, uint16_t volume,
     }
   else
     {
-      rightlevel = wm8904_scalevolume(volume, (b16_t)priv->balance);
+      /* Note: b16ONE - balance goes from 0 to 0.5. Hence need to multiply volume by 2! */
+
+      rightlevel = wm8904_scalevolume(2 * volume, (b16_t)priv->balance);
     }
 #else
   leftlevel  = priv->volume;
@@ -1210,6 +1214,30 @@ static int wm8904_configure(FAR struct audio_lowerhalf_s *dev,
           break;
 #endif /* CONFIG_AUDIO_EXCLUDE_VOLUME */
 
+#ifndef CONFIG_AUDIO_EXCLUDE_BALANCE
+        case AUDIO_FU_BALANCE:
+          {
+            /* Set the balance.  The percentage level * 10 (0-1000) is in the
+             * ac_controls.b[0] parameter.
+             */
+
+            uint16_t balance = caps->ac_controls.hw[0];
+            audinfo("    Balance: %d\n", balance);
+
+            if (balance >= 0 && balance <= 1000)
+              {
+                /* Scale the balance setting to the range {0..(b16ONE - 1)} */
+		priv->balance = (balance * (b16ONE - 1)) / 1000;
+                wm8994_setvolume(priv, priv->volume, priv->mute);
+              }
+            else
+              {
+                ret = -EDOM;
+              }
+           }
+          break;
+#endif /* CONFIG_AUDIO_EXCLUDE_BALANCE */
+
 #ifndef CONFIG_AUDIO_EXCLUDE_TONE
         case AUDIO_FU_BASS:
           {
@@ -2492,7 +2520,7 @@ static void wm8904_hw_reset(FAR struct wm8904_dev_s *priv)
   priv->nchannels  = WM8904_DEFAULT_NCHANNELS;
   priv->bpsamp     = WM8904_DEFAULT_BPSAMP;
 #if !defined(CONFIG_AUDIO_EXCLUDE_VOLUME) && !defined(CONFIG_AUDIO_EXCLUDE_BALANCE)
-  priv->balance    = b16HALF;            /* Center balance */
+  priv->balance    = b16HALF - 1;            /* Center balance */
 #endif
 
   /* Software reset.  This puts all WM8904 registers back in their