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
|