diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-06 22:18:36 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-06 22:18:36 +0100 |
commit | a60001871e67311f413affdca45039f1734b206a (patch) | |
tree | e3d75c256fa43c3bc3e16d5023ebfd826d44abc4 /sys/src/cmd/audio | |
parent | 7b36a7e1a9056bc8046d161c81aee008854daadf (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.c | 9 |
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; |