samer@1: classdef sigbinop < signal samer@1: properties (GetAccess=private, SetAccess=immutable) samer@1: op samer@1: sig1 samer@1: sig2 samer@1: chans samer@1: end samer@1: methods samer@1: function s=sigbinop(f,sig1,sig2,chf) samer@1: if isinf(unify_rates(rate(sig1),rate(sig2))), samer@1: error('Sample rate mismatch'); samer@1: end samer@1: if nargin<4, samer@1: chf=@(c1,c2)size(f(zeros(c1,1),zeros(c2,1)),1); samer@1: end samer@1: s.op=f; samer@1: s.sig1=sig1; samer@1: s.sig2=sig2; samer@1: s.chans=chf(channels(sig1),channels(sig2)); samer@1: end samer@1: samer@1: function c=channels(s), c=s.chans; end samer@1: function r=rate(s), r=rate(s.sig1); end samer@1: function s=construct(sig) samer@1: samer@1: s1=construct(sig.sig1); samer@1: s2=construct(sig.sig2); samer@1: op=sig.op; 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, s1.start(); s2.start(); end samer@1: function stop, s1.stop(); s2.stop(); end samer@1: function dispose, s1.dispose(); s2.dispose(); end samer@1: function r=reader(n) samer@1: r1=s1.reader(n); samer@1: r2=s2.reader(n); samer@1: r =@next; samer@1: function [x,rem]=next samer@1: [x1,rem1]=r1(); samer@1: [x2,rem2]=r2(); samer@1: x=op(x1,x2); samer@1: rem=max(rem1,rem2); samer@1: end samer@1: end samer@1: end samer@1: function s=tostring(sig) samer@1: s=sprintf('(%s <%s> %s)',tostring(sig.sig1),tostring(sig.op),tostring(sig.sig2)); samer@1: end samer@1: end samer@1: end