changeset 11:ed031bfa8184

Working framer; handle end of stream correctly
author Chris Cannam
date Thu, 13 Dec 2012 13:52:41 +0000
parents 149d6911ca12
children 2afcb56f57b1
files audiofile.yeti framer.yeti
diffstat 2 files changed, 22 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/audiofile.yeti	Thu Dec 13 11:13:35 2012 +0000
+++ b/audiofile.yeti	Thu Dec 13 13:52:41 2012 +0000
@@ -17,6 +17,9 @@
     format = stream#getFormat();
     { stream, format } );
 
+finished? { stream is ~AudioInputStream } =
+    not (stream#available() > 0);
+
 close { stream is ~AudioInputStream } =
     stream#close();
 
@@ -67,10 +70,13 @@
     bytesPerSample = format#getSampleSizeInBits() / 8;
     bytes = new byte[nframes * channels * bytesPerSample];
     bytesRead = stream#read(bytes);
-    n = bytesRead / bytesPerSample;
-    doubles = new double[n];
-    decode { format } bytes doubles n;
-    doubles;
+    if bytesRead <= 0 then new double[0];
+    else
+        n = int(bytesRead / bytesPerSample);
+        doubles = new double[n];
+        decode { format } bytes doubles n;
+        doubles;
+    fi;
    );
 
 read { format is ~AudioFormat, stream is ~AudioInputStream } n =
@@ -104,6 +110,7 @@
     readAllInterleaved,
     readMono,
     readAllMono,
+    finished?,
     close
 }
 
--- a/framer.yeti	Thu Dec 13 11:13:35 2012 +0000
+++ b/framer.yeti	Thu Dec 13 13:52:41 2012 +0000
@@ -1,14 +1,19 @@
 
 module framer;
 
+vec = load fvector;
 af = load audiofile;
 
+flist blocksize file =
+    if af.finished? file then
+       (af.close file; [] );
+    else
+        af.readMono file blocksize :. \(flist blocksize file);
+    fi;
 
+frames blocksize filename = flist blocksize (af.open filename);
 
-retrieveFrame blocksize filename =
-   (f = af.open filename; \(af.read f blocksize));
+{ 
+    frames
+}
 
-
-
-{ }
-