samer@1: % transfer - Transfer samples from a signal to a sink samer@1: % samer@1: % transfer :: signal(C,R), sink(C,R) -> action natural. samer@1: % samer@1: % Returns the number of samples transfered. samer@1: function n=transfer(sig,sink,varargin) samer@37: opts=options('chunk',512,varargin{:}); samer@1: chunk=uint32(opts.chunk); samer@1: samer@1: u=construct(sink); samer@1: try samer@1: write=u.writer(chunk); samer@1: s=construct(sig); samer@1: try % to make sure we dispose of s once opened samer@1: n=uint32(0); CHUNK=1:chunk; samer@1: x=zeros(channels(sig),chunk); % buffer samer@1: r=s.reader(opts.chunk); samer@1: rem=0; samer@1: s.start(); samer@1: u.start(); samer@1: while rem==0 samer@1: [x,rem]=r(); samer@1: if rem==0, rem=write(x); samer@1: else rem=rem+write(x(:,1:end-rem)); samer@1: end samer@1: n=n+(chunk-rem); samer@1: end samer@1: u.stop(); samer@1: s.stop(); samer@1: catch ex samer@1: s.dispose(); samer@1: rethrow(ex); samer@1: end samer@1: catch ex samer@1: u.dispose(); samer@1: rethrow(ex); samer@1: end samer@1: samer@1: s.dispose(); samer@1: u.dispose(); samer@1: end