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
|