annotate sinks/@sinkarray/sinkarray.m @ 0:672052bd81f8

Initial partial import.
author samer
date Wed, 19 Dec 2012 22:38:28 +0000
parents
children 3f77126f7b5f
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@0 10 classdef sinkarray < sink
samer@0 11 properties (GetAccess=private,SetAccess=immutable)
samer@0 12 chans % natural
samer@0 13 length % natural
samer@0 14 fs % nonneg
samer@0 15 cont % [[C,N]] -> void
samer@0 16 end
samer@0 17 methods
samer@0 18 function s=sinkarray(cont,ch,len,rate)
samer@0 19 if nargin<4, rate=nan; end
samer@0 20 s.chans=ch;
samer@0 21 s.length=len;
samer@0 22 s.fs=rate;
samer@0 23 s.cont=cont;
samer@0 24 end
samer@0 25
samer@0 26 function s=tostring(sig),
samer@0 27 s=sprintf('sinkarray(%s,<%dx%d>)',tostring(sig.cont),sig.chans,sig.length);
samer@0 28 end
samer@0 29
samer@0 30 function c=channels(s), c=s.chans; end
samer@0 31 function c=rate(s), c=s.fs; end
samer@0 32 function s=construct(sig)
samer@0 33
samer@0 34 length=sig.length;
samer@0 35 ch=channels(sig);
samer@0 36 array=zeros(ch,length);
samer@0 37 pos=0;
samer@0 38
samer@0 39 s.start = @nop;
samer@0 40 s.stop = @nop;
samer@0 41 s.dispose = @dispose;
samer@0 42 s.writer = @writer;
samer@0 43
samer@0 44 function dispose, sig.cont(array(:,1:pos)); end
samer@0 45
samer@0 46 function r=writer(n)
samer@0 47 r = @next;
samer@0 48 CHUNK = 1:uint32(n);
samer@0 49 function rem=next(x)
samer@0 50 n=size(x,2);
samer@0 51 if pos+n<=length
samer@0 52 array(:,pos+CHUNK)=x; rem=0;
samer@0 53 pos=pos+n;
samer@0 54 else
samer@0 55 rem=n-(length-pos);
samer@0 56 array(:,pos+1:end)=x(:,1:rem);
samer@0 57 pos=length;
samer@0 58 end
samer@0 59 end
samer@0 60 end
samer@0 61 end
samer@0 62 end
samer@0 63 end