annotate yetilab/stream/filter.yeti @ 173:2cb4c78d42db

Another test
author Chris Cannam
date Thu, 02 May 2013 17:38:23 +0100
parents f1c75782e56e
children cd5484b642aa
rev   line source
Chris@162 1
Chris@162 2 module yetilab.stream.filter;
Chris@162 3
Chris@162 4 mat = load yetilab.matrix.matrix;
Chris@162 5
Chris@162 6 load yetilab.stream.streamtype;
Chris@162 7
Chris@171 8 minDurationOf d1 d2 =
Chris@171 9 case d1 of
Chris@171 10 Known a:
Chris@171 11 case d2 of
Chris@171 12 Known b: Known (min a b);
Chris@171 13 Unknown (): Unknown ();
Chris@171 14 Infinite (): Known a;
Chris@171 15 esac;
Chris@171 16 Unknown ():
Chris@171 17 case d2 of
Chris@171 18 Known b: Known b;
Chris@171 19 Unknown (): Unknown ();
Chris@171 20 Infinite (): Unknown ();
Chris@171 21 esac;
Chris@171 22 Infinite ():
Chris@171 23 d2;
Chris@171 24 esac;
Chris@171 25
Chris@171 26 truncatedTo nsamples s = //!!! should nsamples be a time in seconds?
Chris@162 27 {
Chris@162 28 get position () = s.position,
Chris@162 29 get channels () = s.channels,
Chris@162 30 get sampleRate () = s.sampleRate,
Chris@162 31 get available () = Known (nsamples - s.position),
Chris@162 32 get finished? () = not (nsamples > s.position),
Chris@162 33 read count =
Chris@162 34 if nsamples > s.position + count then
Chris@162 35 s.read count;
Chris@162 36 elif nsamples > s.position then
Chris@162 37 s.read (nsamples - s.position)
Chris@162 38 else
Chris@162 39 mat.zeroMatrix { columns = 0, rows = s.channels }
Chris@162 40 fi,
Chris@162 41 close = s.close,
Chris@162 42 };
Chris@162 43
Chris@171 44
Chris@171 45 //!!! not really mixed -- what's the word for it? one per channel
Chris@171 46 mixed s1 s2 = //!!! could generalise to list of streams
Chris@171 47 {
Chris@172 48 get position () = min s1.position s2.position, // can differ after EOS
Chris@171 49 get channels () = s1.channels + s2.channels,
Chris@171 50 get sampleRate () = s1.sampleRate,
Chris@171 51 get available () = minDurationOf s1.available s2.available,
Chris@171 52 get finished? () = s1.finished? or s2.finished?,
Chris@171 53 read count =
Chris@171 54 (outs = map do s: s.read count done [ s1, s2 ];
Chris@171 55 minlen = head (sort (map do m: m.size.columns done outs));
Chris@171 56 outs = map do m:
Chris@171 57 mat.resizedTo { rows = m.size.rows, columns = minlen } m
Chris@171 58 done outs;
Chris@171 59 mat.newMatrix (RowMajor ())
Chris@171 60 (concat (map mat.asRows outs))
Chris@171 61 ),
Chris@171 62 close = (s1.close (); s2.close ())
Chris@171 63 };
Chris@171 64
Chris@162 65 {
Chris@162 66 truncatedTo,
Chris@171 67 mixed,
Chris@163 68 //!!!} as {
Chris@163 69 // truncatedTo is number -> stream -> stream
Chris@162 70 }
Chris@162 71
Chris@162 72
Chris@162 73
Chris@162 74