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
|