samer@1: function s=construct(sig) samer@1: fs=rate(sig.head); samer@1: ch=channels(sig.head); samer@1: sc=construct(sig.head); samer@1: sx=sig.tail; 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: 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: [sig2,sx]=sx(); samer@1: samer@1: fs=unify_rates(fs,rate(sig2)); samer@1: if isinf(fs), error('sigcat:Signal sampling rate mismatch'); end samer@1: ch=unify_channels(ch,channels(sig2)); samer@1: if isinf(ch), error('sigcat:Signal channels count mismatch'); end samer@1: sc=construct(sig2); samer@1: 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