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
|