mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-14 05:15:43 +01:00
Fix VU meter
Fixed VU meter output of 8 and 32bit samples.
This commit is contained in:
parent
990153e3a4
commit
02244f65c0
1 changed files with 39 additions and 11 deletions
|
@ -955,6 +955,7 @@ static void set_params(void)
|
||||||
|
|
||||||
err = snd_pcm_sw_params_set_xfer_align(handle, swparams, xfer_align);
|
err = snd_pcm_sw_params_set_xfer_align(handle, swparams, xfer_align);
|
||||||
assert(err >= 0);
|
assert(err >= 0);
|
||||||
|
|
||||||
if (snd_pcm_sw_params(handle, swparams) < 0) {
|
if (snd_pcm_sw_params(handle, swparams) < 0) {
|
||||||
error("unable to install sw params:");
|
error("unable to install sw params:");
|
||||||
snd_pcm_sw_params_dump(swparams, log);
|
snd_pcm_sw_params_dump(swparams, log);
|
||||||
|
@ -1062,20 +1063,47 @@ static void suspend(void)
|
||||||
static void compute_max_peak(u_char *data, size_t count)
|
static void compute_max_peak(u_char *data, size_t count)
|
||||||
{
|
{
|
||||||
signed int val, max, max_peak = 0, perc;
|
signed int val, max, max_peak = 0, perc;
|
||||||
size_t step, ocount = count;
|
size_t ocount = count;
|
||||||
|
|
||||||
while (count-- > 0) {
|
|
||||||
switch (bits_per_sample) {
|
switch (bits_per_sample) {
|
||||||
case 8: val = *(signed char *)data ^ snd_pcm_format_silence(hwparams.format); step = 1; break;
|
case 8: {
|
||||||
case 16: val = *(signed short *)data ^ snd_pcm_format_silence_16(hwparams.format); step = 2; break;
|
signed char *valp = (signed char *)data;
|
||||||
case 32: val = *(signed int *)data ^ snd_pcm_format_silence_32(hwparams.format); step = 4; break;
|
signed char mask = snd_pcm_format_silence(hwparams.format);
|
||||||
default: val = 0; step = 1; break;
|
while (count-- > 0) {
|
||||||
}
|
val = *valp++ ^ mask;
|
||||||
data += step;
|
|
||||||
val = abs(val);
|
val = abs(val);
|
||||||
if (max_peak < val)
|
if (max_peak < val)
|
||||||
max_peak = val;
|
max_peak = val;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 16: {
|
||||||
|
signed short *valp = (signed short *)data;
|
||||||
|
signed short mask = snd_pcm_format_silence_16(hwparams.format);
|
||||||
|
count /= 2;
|
||||||
|
while (count-- > 0) {
|
||||||
|
val = *valp++ ^ mask;
|
||||||
|
val = abs(val);
|
||||||
|
if (max_peak < val)
|
||||||
|
max_peak = val;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 32: {
|
||||||
|
signed int *valp = (signed int *)data;
|
||||||
|
signed int mask = snd_pcm_format_silence_32(hwparams.format);
|
||||||
|
count /= 4;
|
||||||
|
while (count-- > 0) {
|
||||||
|
val = *valp++ ^ mask;
|
||||||
|
val = abs(val);
|
||||||
|
if (max_peak < val)
|
||||||
|
max_peak = val;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
max = 1 << (bits_per_sample-1);
|
max = 1 << (bits_per_sample-1);
|
||||||
if (max <= 0)
|
if (max <= 0)
|
||||||
max = 0x7fffffff;
|
max = 0x7fffffff;
|
||||||
|
|
Loading…
Reference in a new issue