samer@1: classdef sigcat < sigbase samer@1: properties (GetAccess=private, SetAccess=immutable) samer@1: signals samer@1: end samer@1: methods samer@1: function s=sigcat(varargin) samer@1: fs=foldl(@unify_rates,nan,map(@rate,varargin)); samer@1: if isinf(fs), error('sampling rate mismatch'); end samer@1: ch=foldl(@unify_channels,nan,map(@channels,varargin)); samer@1: if isinf(ch), error('channel count mismatch'); end samer@1: s=s@sigbase(ch,fs); samer@1: s.signals=varargin; samer@1: end samer@1: samer@1: function s=tostring(sig) samer@1: n=length(sig.signals); samer@1: strx=map(@tostring,sig.signals); samer@1: if n==1, s=strx{1}; samer@1: elseif n==2, s=sprintf('%s & %s',strx{1},strx{2}); samer@1: else s=sprintf('sigcat(%s,...)',strx{1}); samer@1: end samer@1: end samer@1: samer@1: function s=construct(sig) samer@1: sc=construct(sig.signals{1}); samer@1: sx=sig.signals(2:end); samer@1: samer@1: s.start = @start; samer@1: s.stop = @stop; samer@1: s.dispose = @dispose; samer@1: s.reader = @reader; samer@1: samer@1: function start, sc.start(); end samer@1: function stop, sc.stop(); end samer@1: function dispose, sc.dispose(); end samer@1: samer@1: function r=reader(n) samer@1: rc=sc.reader(n); samer@1: r = @next; samer@1: function [x,rem]=next samer@1: [x,rem]=rc(); samer@1: while rem>0 && ~isempty(sx) % current signal exhausted, try next samer@1: sc.dispose(); samer@1: sc=construct(sx{1}); sx=sx(2:end); samer@1: [x(:,end-rem+1:end),rem]=sigreadn(sc,rem); samer@1: rc=sc.reader(n); samer@1: end samer@1: end samer@1: end samer@1: end samer@1: end samer@1: end