From: Takashi Iwai <tiwai@suse.de>
To: sujith kumar reddy <sujithreddy6192@gmail.com>
Cc: alsa-devel@alsa-project.org, folkert <folkert@vanheusden.com>
Subject: Re: arecord is failing with -V stereo
Date: Tue, 24 Aug 2021 10:12:52 +0200 [thread overview]
Message-ID: <s5heeaj2rcr.wl-tiwai@suse.de> (raw)
In-Reply-To: <CAAd2w=adJ3+Rw16ZVbkq72O7D0Dgo1ukHF1DLK6aaN3sGKu3DQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 497 bytes --]
On Mon, 23 Aug 2021 21:06:05 +0200,
sujith kumar reddy wrote:
>
> Hi Folkert,
>
> Tried with the above code.This is also getting p value negative.
>
> My point is p is negative it doesn't go to
>
> if (p >= bar_length)
> p = bar_length - 1;
> it is going to memset second argument p,that is negative so crashing.
Gah, the code there contains lots of craps. A negative value must not
have been passed there.
Below is a series of fixes. Please give it a try.
thanks,
Takashi
[-- Attachment #2: 0001-aplay-Fix-conversion-of-unsigned-samples-in-peak-cal.patch --]
[-- Type: application/octet-stream, Size: 1539 bytes --]
From 0ea7bfea83d97fefd18845948350322017a865c2 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Tue, 24 Aug 2021 09:00:40 +0200
Subject: [PATCH 1/5] aplay: Fix conversion of unsigned samples in peak
calculation
The XOR with the mask has to be applied before calculating abs value.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
aplay/aplay.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/aplay/aplay.c b/aplay/aplay.c
index cc51dcb48bba..91af244edb60 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -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++;
--
2.26.2
[-- Attachment #3: 0002-aplay-Handle-16bit-sample-negative-overflow-in-peak-.patch --]
[-- Type: application/octet-stream, Size: 1135 bytes --]
From 5c4bf63a94ed0c20aca5bafb94ecd05893a45ec1 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Tue, 24 Aug 2021 09:36:33 +0200
Subject: [PATCH 2/5] aplay: Handle 16bit sample negative overflow in peak
calculations
The handling of 16bit samples in the peak calculations has a bug when
a sample with 0x8000 is passed. As abs() treats 32bit int, it returns
0x8000. And yet the code stores back into 16bit value again.
To fix that overflow, use 32bit value (i.e. val instead of sval) for
the further calculations.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
aplay/aplay.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/aplay/aplay.c b/aplay/aplay.c
index 91af244edb60..c884346c9f25 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -1829,9 +1829,9 @@ static void compute_max_peak(u_char *data, size_t samples)
else
sval = be16toh(*valp);
sval ^= mask;
- sval = abs(sval);
- if (max_peak[c] < sval)
- max_peak[c] = sval;
+ val = abs(sval);
+ if (max_peak[c] < val)
+ max_peak[c] = val;
valp++;
if (vumeter == VUMETER_STEREO)
c = !c;
--
2.26.2
[-- Attachment #4: 0003-aplay-Don-t-pass-most-negative-integer-to-abs-in-pea.patch --]
[-- Type: application/octet-stream, Size: 914 bytes --]
From d9b31338153591944d72e62523bad7850b407c63 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Tue, 24 Aug 2021 09:58:29 +0200
Subject: [PATCH 3/5] aplay: Don't pass most negative integer to abs() in peak
calculations
The return value from abs() for the most negative integer is
undefined. Cap it properly for the 32bit sample handling.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
aplay/aplay.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/aplay/aplay.c b/aplay/aplay.c
index c884346c9f25..2543de5b6cd8 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -1874,7 +1874,10 @@ static void compute_max_peak(u_char *data, size_t samples)
else
val = be32toh(*valp);
val ^= mask;
- val = abs(val);
+ if (val == 0x80000000U)
+ val = 0x7fffffff;
+ else
+ val = abs(val);
if (max_peak[c] < val)
max_peak[c] = val;
valp++;
--
2.26.2
[-- Attachment #5: 0004-aplay-Handle-upper-bound-in-peak-calculations.patch --]
[-- Type: application/octet-stream, Size: 801 bytes --]
From 2efe124c31360cf0156dd0e5e7cdd52d1346a5c0 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Tue, 24 Aug 2021 10:00:26 +0200
Subject: [PATCH 4/5] aplay: Handle upper bound in peak calculations
Make sure that the calculated max_peak[] won't go beyond the sample
max resolution.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
aplay/aplay.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/aplay/aplay.c b/aplay/aplay.c
index 2543de5b6cd8..a51a37ba34bd 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -1898,6 +1898,8 @@ static void compute_max_peak(u_char *data, size_t samples)
max = 0x7fffffff;
for (c = 0; c < ichans; c++) {
+ if (max_peak[c] > max)
+ max_peak[c] = max;
if (bits_per_sample > 16)
perc[c] = max_peak[c] / (max / 100);
else
--
2.26.2
[-- Attachment #6: 0005-aplay-Fix-out-of-bound-access-in-stereo-VU-meter-dra.patch --]
[-- Type: application/octet-stream, Size: 1086 bytes --]
From dea51861a8626694c6e80121c17a0a38efc2e33c Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Tue, 24 Aug 2021 10:06:05 +0200
Subject: [PATCH 5/5] aplay: Fix out-of-bound access in stereo VU meter drawing
The left channel drawing of a stereo VU meter has a bug where it may
access a negative array index.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
aplay/aplay.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/aplay/aplay.c b/aplay/aplay.c
index a51a37ba34bd..63a4e3437fd9 100644
--- a/aplay/aplay.c
+++ b/aplay/aplay.c
@@ -1758,10 +1758,12 @@ static void print_vu_meter_stereo(int *perc, int *maxperc)
if (c)
memset(line + bar_length + 6 + 1, '#', p);
else
- memset(line + bar_length - p - 1, '#', p);
- p = maxperc[c] * bar_length / 100;
- if (p > bar_length)
- p = bar_length;
+ memset(line + bar_length - p, '#', p);
+ p = maxperc[c] * bar_length / 100 - 1;
+ if (p < 0)
+ p = 0;
+ else if (p >= bar_length)
+ p = bar_length - 1;
if (c)
line[bar_length + 6 + 1 + p] = '+';
else
--
2.26.2
next prev parent reply other threads:[~2021-08-24 8:13 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-19 18:04 arecord is failing with -V stereo sujith kumar reddy
2021-08-19 18:34 ` folkert
2021-08-19 18:43 ` sujith kumar reddy
2021-08-19 19:06 ` folkert
2021-08-23 16:31 ` sujith kumar reddy
2021-08-23 17:03 ` folkert
2021-08-23 18:44 ` sujith kumar reddy
2021-08-23 18:47 ` folkert
2021-08-23 19:06 ` sujith kumar reddy
2021-08-23 19:08 ` folkert
2021-08-23 19:33 ` sujith kumar reddy
2021-08-23 20:16 ` folkert
2021-08-24 1:15 ` sujith kumar reddy
2021-08-24 6:11 ` sujith kumar reddy
2021-08-24 8:12 ` Takashi Iwai [this message]
2021-08-24 9:19 ` sujith kumar reddy
2021-08-24 9:50 ` Takashi Iwai
-- strict thread matches above, loose matches on Subject: below --
2021-08-17 8:38 sujith kumar reddy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=s5heeaj2rcr.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=folkert@vanheusden.com \
--cc=sujithreddy6192@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.