summaryrefslogtreecommitdiff
path: root/sys/src/cmd/audio
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-11-06 22:18:36 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-11-06 22:18:36 +0100
commita60001871e67311f413affdca45039f1734b206a (patch)
treee3d75c256fa43c3bc3e16d5023ebfd826d44abc4 /sys/src/cmd/audio
parent7b36a7e1a9056bc8046d161c81aee008854daadf (diff)
mp3dec: fix volume for mp3dec
the libmad samples need to be scaled properly. the previous assumption was that it is 32 bits, but it really is MAD_F_FRACTBITS + sign bit and rest used for overflow. thanks eekee!
Diffstat (limited to 'sys/src/cmd/audio')
-rw-r--r--sys/src/cmd/audio/mp3dec/main.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/src/cmd/audio/mp3dec/main.c b/sys/src/cmd/audio/mp3dec/main.c
index 50a000e06..1aef43e0c 100644
--- a/sys/src/cmd/audio/mp3dec/main.c
+++ b/sys/src/cmd/audio/mp3dec/main.c
@@ -46,7 +46,7 @@ output(void *, struct mad_header const* header, struct mad_pcm *pcm)
rate = pcm->samplerate;
chans = pcm->channels;
- snprint(fmt, sizeof(fmt), "s32r%dc%d", rate, chans);
+ snprint(fmt, sizeof(fmt), "s%dr%dc%d", MAD_F_FRACBITS+1, rate, chans);
if(ifd >= 0){
close(ifd);
@@ -82,6 +82,13 @@ output(void *, struct mad_header const* header, struct mad_pcm *pcm)
p = buf + j*4;
for(i=0; i < pcm->length; i++){
v = *s++;
+
+ /* clipping */
+ if(v >= MAD_F_ONE)
+ v = MAD_F_ONE-1;
+ else if(v < -MAD_F_ONE)
+ v = -MAD_F_ONE;
+
p[0] = v, v>>=8;
p[1] = v, v>>=8;
p[2] = v, v>>=8;