samer@1
|
1 classdef sigcat < sigbase
|
samer@1
|
2 properties (GetAccess=private, SetAccess=immutable)
|
samer@1
|
3 signals
|
samer@1
|
4 end
|
samer@1
|
5 methods
|
samer@1
|
6 function s=sigcat(varargin)
|
samer@1
|
7 fs=foldl(@unify_rates,nan,map(@rate,varargin));
|
samer@1
|
8 if isinf(fs), error('sampling rate mismatch'); end
|
samer@1
|
9 ch=foldl(@unify_channels,nan,map(@channels,varargin));
|
samer@1
|
10 if isinf(ch), error('channel count mismatch'); end
|
samer@1
|
11 s=s@sigbase(ch,fs);
|
samer@1
|
12 s.signals=varargin;
|
samer@1
|
13 end
|
samer@1
|
14
|
samer@1
|
15 function s=tostring(sig)
|
samer@1
|
16 n=length(sig.signals);
|
samer@1
|
17 strx=map(@tostring,sig.signals);
|
samer@1
|
18 if n==1, s=strx{1};
|
samer@1
|
19 elseif n==2, s=sprintf('%s & %s',strx{1},strx{2});
|
samer@1
|
20 else s=sprintf('sigcat(%s,...)',strx{1});
|
samer@1
|
21 end
|
samer@1
|
22 end
|
samer@1
|
23
|
samer@1
|
24 function s=construct(sig)
|
samer@1
|
25 sc=construct(sig.signals{1});
|
samer@1
|
26 sx=sig.signals(2:end);
|
samer@1
|
27
|
samer@1
|
28 s.start = @start;
|
samer@1
|
29 s.stop = @stop;
|
samer@1
|
30 s.dispose = @dispose;
|
samer@1
|
31 s.reader = @reader;
|
samer@1
|
32
|
samer@1
|
33 function start, sc.start(); end
|
samer@1
|
34 function stop, sc.stop(); end
|
samer@1
|
35 function dispose, sc.dispose(); end
|
samer@1
|
36
|
samer@1
|
37 function r=reader(n)
|
samer@1
|
38 rc=sc.reader(n);
|
samer@1
|
39 r = @next;
|
samer@1
|
40 function [x,rem]=next
|
samer@1
|
41 [x,rem]=rc();
|
samer@1
|
42 while rem>0 && ~isempty(sx) % current signal exhausted, try next
|
samer@1
|
43 sc.dispose();
|
samer@1
|
44 sc=construct(sx{1}); sx=sx(2:end);
|
samer@1
|
45 [x(:,end-rem+1:end),rem]=sigreadn(sc,rem);
|
samer@1
|
46 rc=sc.reader(n);
|
samer@1
|
47 end
|
samer@1
|
48 end
|
samer@1
|
49 end
|
samer@1
|
50 end
|
samer@1
|
51 end
|
samer@1
|
52 end
|