annotate sinks/@sinkarray/sinkarray.m @ 61:eff6bddf82e3 tip

Finally implemented perceptual brightness thing.
author samer
date Sun, 11 Oct 2015 10:20:42 +0100
parents ae596261e75f
children
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@42 18 s=s@sinkbase(ch,rate);
samer@0 19 s.length=len;
samer@0 20 s.cont=cont;
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 s.start = @nop;
samer@0 29 s.stop = @nop;
samer@42 30 if isfinite(sig.length)
samer@42 31 length=sig.length;
samer@42 32 array=zeros(channels(sig),length);
samer@42 33 pos=0;
samer@42 34
samer@42 35 s.dispose = @dispose;
samer@42 36 s.writer = @writer;
samer@42 37 else
samer@42 38 gg=gatherer([channels(sig),1]);
samer@42 39 s.dispose = @dispose_gatherer;
samer@42 40 s.writer = @writer_gatherer;
samer@42 41 end
samer@0 42
samer@0 43 function dispose, sig.cont(array(:,1:pos)); end
samer@0 44
samer@0 45 function r=writer(n)
samer@0 46 r = @next;
samer@0 47 CHUNK = 1:uint32(n);
samer@0 48 function rem=next(x)
samer@0 49 n=size(x,2);
samer@0 50 if pos+n<=length
samer@0 51 array(:,pos+CHUNK)=x; rem=0;
samer@0 52 pos=pos+n;
samer@0 53 else
samer@0 54 rem=n-(length-pos);
samer@0 55 array(:,pos+1:end)=x(:,1:rem);
samer@0 56 pos=length;
samer@0 57 end
samer@0 58 end
samer@0 59 end
samer@42 60
samer@42 61 function dispose_gatherer, sig.cont(gg.collect()); end
samer@42 62 function r=writer_gatherer(n)
samer@42 63 r = @next;
samer@42 64 function rem=next(x)
samer@42 65 n=size(x,2);
samer@42 66 for i=1:n, gg.append(x(:,i)); end
samer@42 67 rem=0;
samer@42 68 end
samer@42 69 end
samer@0 70 end
samer@0 71 end
samer@0 72 end