annotate sinks/@sinkarray/sinkarray.m @ 38:9d24b616bb06

Added function algebra.
author samer
date Tue, 29 Jan 2013 15:59:01 +0000
parents 3f77126f7b5f
children ae596261e75f
rev   line source
samer@0 1 % sinkarray - sink that collects data in an array
samer@0 2 %
samer@0 3 % sinkarray ::
samer@0 4 % ([[C,L]] -> action void) ~'function to do something with array on dispose',
samer@0 5 % C:natural ~'number of channels,
samer@0 6 % L:natural ~'capacity of sink',
samer@0 7 % R:nonneg ~'sampling rate'
samer@0 8 % -> sink(C,R).
samer@0 9
samer@3 10 classdef sinkarray < sinkbase
samer@0 11 properties (GetAccess=private,SetAccess=immutable)
samer@0 12 length % natural
samer@0 13 cont % [[C,N]] -> void
samer@0 14 end
samer@0 15 methods
samer@0 16 function s=sinkarray(cont,ch,len,rate)
samer@0 17 if nargin<4, rate=nan; end
samer@0 18 s.length=len;
samer@0 19 s.cont=cont;
samer@3 20 s=s@sinkbase(ch,rate);
samer@0 21 end
samer@0 22
samer@0 23 function s=tostring(sig),
samer@3 24 s=sprintf('sinkarray(%s,<%dx%d>)',tostring(sig.cont),channels(sig),sig.length);
samer@0 25 end
samer@0 26
samer@0 27 function s=construct(sig)
samer@0 28 length=sig.length;
samer@0 29 ch=channels(sig);
samer@0 30 array=zeros(ch,length);
samer@0 31 pos=0;
samer@0 32
samer@0 33 s.start = @nop;
samer@0 34 s.stop = @nop;
samer@0 35 s.dispose = @dispose;
samer@0 36 s.writer = @writer;
samer@0 37
samer@0 38 function dispose, sig.cont(array(:,1:pos)); end
samer@0 39
samer@0 40 function r=writer(n)
samer@0 41 r = @next;
samer@0 42 CHUNK = 1:uint32(n);
samer@0 43 function rem=next(x)
samer@0 44 n=size(x,2);
samer@0 45 if pos+n<=length
samer@0 46 array(:,pos+CHUNK)=x; rem=0;
samer@0 47 pos=pos+n;
samer@0 48 else
samer@0 49 rem=n-(length-pos);
samer@0 50 array(:,pos+1:end)=x(:,1:rem);
samer@0 51 pos=length;
samer@0 52 end
samer@0 53 end
samer@0 54 end
samer@0 55 end
samer@0 56 end
samer@0 57 end