Mercurial > hg > ishara
diff sinks/@sinkarray/sinkarray.m @ 0:672052bd81f8
Initial partial import.
author | samer |
---|---|
date | Wed, 19 Dec 2012 22:38:28 +0000 |
parents | |
children | 3f77126f7b5f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sinks/@sinkarray/sinkarray.m Wed Dec 19 22:38:28 2012 +0000 @@ -0,0 +1,63 @@ +% sinkarray - sink that collects data in an array +% +% sinkarray :: +% ([[C,L]] -> action void) ~'function to do something with array on dispose', +% C:natural ~'number of channels, +% L:natural ~'capacity of sink', +% R:nonneg ~'sampling rate' +% -> sink(C,R). + +classdef sinkarray < sink + properties (GetAccess=private,SetAccess=immutable) + chans % natural + length % natural + fs % nonneg + cont % [[C,N]] -> void + end + methods + function s=sinkarray(cont,ch,len,rate) + if nargin<4, rate=nan; end + s.chans=ch; + s.length=len; + s.fs=rate; + s.cont=cont; + end + + function s=tostring(sig), + s=sprintf('sinkarray(%s,<%dx%d>)',tostring(sig.cont),sig.chans,sig.length); + end + + function c=channels(s), c=s.chans; end + function c=rate(s), c=s.fs; end + function s=construct(sig) + + length=sig.length; + ch=channels(sig); + array=zeros(ch,length); + pos=0; + + s.start = @nop; + s.stop = @nop; + s.dispose = @dispose; + s.writer = @writer; + + function dispose, sig.cont(array(:,1:pos)); end + + function r=writer(n) + r = @next; + CHUNK = 1:uint32(n); + function rem=next(x) + n=size(x,2); + if pos+n<=length + array(:,pos+CHUNK)=x; rem=0; + pos=pos+n; + else + rem=n-(length-pos); + array(:,pos+1:end)=x(:,1:rem); + pos=length; + end + end + end + end + end +end