Chris@162: Chris@162: module yetilab.stream.filter; Chris@162: Chris@162: mat = load yetilab.matrix.matrix; Chris@162: Chris@162: load yetilab.stream.streamtype; Chris@162: Chris@171: minDurationOf d1 d2 = Chris@171: case d1 of Chris@171: Known a: Chris@171: case d2 of Chris@171: Known b: Known (min a b); Chris@171: Unknown (): Unknown (); Chris@171: Infinite (): Known a; Chris@171: esac; Chris@171: Unknown (): Chris@171: case d2 of Chris@171: Known b: Known b; Chris@171: Unknown (): Unknown (); Chris@171: Infinite (): Unknown (); Chris@171: esac; Chris@171: Infinite (): Chris@171: d2; Chris@171: esac; Chris@171: Chris@171: truncatedTo nsamples s = //!!! should nsamples be a time in seconds? Chris@162: { Chris@162: get position () = s.position, Chris@162: get channels () = s.channels, Chris@162: get sampleRate () = s.sampleRate, Chris@162: get available () = Known (nsamples - s.position), Chris@162: get finished? () = not (nsamples > s.position), Chris@162: read count = Chris@162: if nsamples > s.position + count then Chris@162: s.read count; Chris@162: elif nsamples > s.position then Chris@162: s.read (nsamples - s.position) Chris@162: else Chris@162: mat.zeroMatrix { columns = 0, rows = s.channels } Chris@162: fi, Chris@162: close = s.close, Chris@162: }; Chris@162: Chris@171: Chris@171: //!!! not really mixed -- what's the word for it? one per channel Chris@171: mixed s1 s2 = //!!! could generalise to list of streams Chris@171: { Chris@172: get position () = min s1.position s2.position, // can differ after EOS Chris@171: get channels () = s1.channels + s2.channels, Chris@171: get sampleRate () = s1.sampleRate, Chris@171: get available () = minDurationOf s1.available s2.available, Chris@171: get finished? () = s1.finished? or s2.finished?, Chris@171: read count = Chris@171: (outs = map do s: s.read count done [ s1, s2 ]; Chris@171: minlen = head (sort (map do m: m.size.columns done outs)); Chris@171: outs = map do m: Chris@171: mat.resizedTo { rows = m.size.rows, columns = minlen } m Chris@171: done outs; Chris@171: mat.newMatrix (RowMajor ()) Chris@171: (concat (map mat.asRows outs)) Chris@171: ), Chris@171: close = (s1.close (); s2.close ()) Chris@171: }; Chris@171: Chris@162: { Chris@162: truncatedTo, Chris@171: mixed, Chris@163: //!!!} as { Chris@163: // truncatedTo is number -> stream -> stream Chris@162: } Chris@162: Chris@162: Chris@162: Chris@162: