summaryrefslogtreecommitdiff
path: root/sys/src/cmd/audio
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-12-11 19:55:02 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2012-12-11 19:55:02 +0100
commit0903d01134a93869bea5f80129e99f872c00712d (patch)
tree533ee6f8e7f9f10e0a89e5907151175a482cba20 /sys/src/cmd/audio
parent3d1f5d4812316a6845233041b11c91b76cdb668f (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.c6
-rw-r--r--sys/src/cmd/audio/mp3dec/main.c10
-rw-r--r--sys/src/cmd/audio/oggdec/oggdec.c4
-rw-r--r--sys/src/cmd/audio/pcmconv/pcmconv.c25
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;