]> git.alsa-project.org Git - alsa-utils.git/commitdiff
aplay: Fix conversion of unsigned samples in peak calculation
authorTakashi Iwai <tiwai@suse.de>
Tue, 24 Aug 2021 07:00:40 +0000 (09:00 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 24 Aug 2021 07:51:39 +0000 (09:51 +0200)
The XOR with the mask has to be applied before calculating abs value.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
aplay/aplay.c

index cc51dcb48bba395cdbbe002e38e6d8f0d52872ee..91af244edb60a68711fda5295cffa09901947e19 100644 (file)
@@ -1828,7 +1828,8 @@ static void compute_max_peak(u_char *data, size_t samples)
                                sval = le16toh(*valp);
                        else
                                sval = be16toh(*valp);
-                       sval = abs(sval) ^ mask;
+                       sval ^= mask;
+                       sval = abs(sval);
                        if (max_peak[c] < sval)
                                max_peak[c] = sval;
                        valp++;
@@ -1848,11 +1849,12 @@ static void compute_max_peak(u_char *data, size_t samples)
                        } else {
                                val = (valp[0]<<16) | (valp[1]<<8) | valp[2];
                        }
+                       val ^= mask;
                        /* Correct signed bit in 32-bit value */
                        if (val & (1<<(bits_per_sample-1))) {
                                val |= 0xff<<24;        /* Negate upper bits too */
                        }
-                       val = abs(val) ^ mask;
+                       val = abs(val);
                        if (max_peak[c] < val)
                                max_peak[c] = val;
                        valp += 3;
@@ -1871,7 +1873,8 @@ static void compute_max_peak(u_char *data, size_t samples)
                                val = le32toh(*valp);
                        else
                                val = be32toh(*valp);
-                       val = abs(val) ^ mask;
+                       val ^= mask;
+                       val = abs(val);
                        if (max_peak[c] < val)
                                max_peak[c] = val;
                        valp++;