diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-11 19:55:02 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-11 19:55:02 +0100 |
commit | 0903d01134a93869bea5f80129e99f872c00712d (patch) | |
tree | 533ee6f8e7f9f10e0a89e5907151175a482cba20 /sys/src/cmd/audio | |
parent | 3d1f5d4812316a6845233041b11c91b76cdb668f (diff) |
audio: fix broken write() size for mp3dec/oggdec/flacdec
they accidently wrote additional bytes in the stream. this
confused the new audio/pcmconv (now actually checking
if it got complete samples).
Diffstat (limited to 'sys/src/cmd/audio')
-rw-r--r-- | sys/src/cmd/audio/flacdec/flacdec.c | 6 | ||||
-rw-r--r-- | sys/src/cmd/audio/mp3dec/main.c | 10 | ||||
-rw-r--r-- | sys/src/cmd/audio/oggdec/oggdec.c | 4 | ||||
-rw-r--r-- | sys/src/cmd/audio/pcmconv/pcmconv.c | 25 |
4 files changed, 33 insertions, 12 deletions
diff --git a/sys/src/cmd/audio/flacdec/flacdec.c b/sys/src/cmd/audio/flacdec/flacdec.c index c29cc7421..88f596508 100644 --- a/sys/src/cmd/audio/flacdec/flacdec.c +++ b/sys/src/cmd/audio/flacdec/flacdec.c @@ -93,8 +93,10 @@ decoutput(FLAC__StreamDecoder *dec, FLAC__Frame *frame, FLAC__int32 *buffer[], v p += chans*b; } } - if(p > buf) - write(ifd, buf, p - buf); + n = b * chans * len; + if(n > 0) + write(ifd, buf, n); + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } diff --git a/sys/src/cmd/audio/mp3dec/main.c b/sys/src/cmd/audio/mp3dec/main.c index 4c6bc89ec..50a000e06 100644 --- a/sys/src/cmd/audio/mp3dec/main.c +++ b/sys/src/cmd/audio/mp3dec/main.c @@ -67,19 +67,20 @@ output(void *, struct mad_header const* header, struct mad_pcm *pcm) close(pfd[1]); ifd = pfd[0]; } + n = 4 * chans * pcm->length; if(n > nbuf){ nbuf = n; buf = realloc(buf, nbuf); if(buf == nil) sysfatal("realloc: %r"); + memset(buf, 0, nbuf); } p = buf; for(j=0; j < chans; j++){ s = pcm->samples[j]; - n = pcm->length; p = buf + j*4; - for(i=0; i < n; i++){ + for(i=0; i < pcm->length; i++){ v = *s++; p[0] = v, v>>=8; p[1] = v, v>>=8; @@ -88,8 +89,9 @@ output(void *, struct mad_header const* header, struct mad_pcm *pcm) p += chans*4; } } - if(p > buf) - write(ifd, buf, p - buf); + if(n > 0) + write(ifd, buf, n); + return MAD_FLOW_CONTINUE; } diff --git a/sys/src/cmd/audio/oggdec/oggdec.c b/sys/src/cmd/audio/oggdec/oggdec.c index 300433bf8..af9283f89 100644 --- a/sys/src/cmd/audio/oggdec/oggdec.c +++ b/sys/src/cmd/audio/oggdec/oggdec.c @@ -86,8 +86,8 @@ output(float **pcm, int samples, vorbis_info *vi) p += chans*sizeof(float); } } - if(p > buf) - write(ifd, buf, p - buf); + if(n > 0) + write(ifd, buf, n); } int main(){ diff --git a/sys/src/cmd/audio/pcmconv/pcmconv.c b/sys/src/cmd/audio/pcmconv/pcmconv.c index 887e69e43..b40b8e562 100644 --- a/sys/src/cmd/audio/pcmconv/pcmconv.c +++ b/sys/src/cmd/audio/pcmconv/pcmconv.c @@ -327,6 +327,25 @@ Bad: return d; } +int +cread(int fd, uchar *buf, int len, int mod) +{ + uchar *off = buf; + + len -= (len % mod); +Again: + len = read(fd, off, len); + if(len <= 0) + return len; + off += len; + len = off - buf; + if((len % mod) != 0){ + len = mod - (len % mod); + goto Again; + } + return len; +} + void usage(void) { @@ -404,13 +423,11 @@ main(int argc, char *argv[]) for(;;){ if(l >= 0 && l < r) r = l; - n = read(0, ibuf, r); - if(n < 0) + n = cread(0, ibuf, r, i.framesz); + if(n < 0 || n > sizeof(ibuf)) sysfatal("read: %r"); if(l > 0) l -= n; - if(n % i.framesz) - sysfatal("bad framesize %d %% %d", n, i.framesz); n /= i.framesz; (*iconv)(in, ibuf, i.bits, i.framesz, n); m = resample(&ch[0], in, out, n) - out; |