samer@0: % linein - Live input signal samer@0: % samer@0: % linein :: samer@0: % C:natural ~'desired no. of channels', samer@0: % R:nonneg ~'desired sample rate', samer@0: % options { samer@0: % bufsize :: natural/0 ~'desired buffer size, 0 is auto' samer@0: % } samer@0: % -> signal(C,R). samer@0: classdef linein < sigbase samer@0: properties (GetAccess=private, SetAccess=immutable) samer@0: opts samer@0: end samer@0: methods samer@0: function s=linein(channels,rate,varargin) samer@0: s=s@sigbase(channels,rate); samer@42: s.opts = options('bufsize',0,'bits',16,'quiet',0,varargin{:}); samer@0: end samer@0: function c=tostring(sig), c='linein'; end samer@0: samer@0: function s=construct(sig) samer@0: import javax.sound.sampled.*; samer@46: import ishara.audio.*; samer@0: samer@0: src=LineSource(audio_format(sig.channels,sig.rate,sig.opts.bits),sig.opts.bufsize); samer@0: ref=disposables('reg',src); samer@42: if ~sig.opts.quiet samer@42: fprintf('\nOpened audio input device:\n %s\n',char(src.toString)); samer@42: fprintf(' Actual buffer size is %d.\n',src.getLine.getBufferSize); samer@42: end samer@0: samer@0: s.stop = @stop; samer@0: s.start = @start; samer@0: s.dispose = @dispose; samer@0: s.reader = @reader; samer@0: samer@0: s.getLine = @()src.getLine(); samer@0: samer@0: function start, src.start(); src.check(); end samer@0: function stop, src.check(); src.stop(); end samer@0: function r=reader(n) samer@0: ch=sig.channels; samer@0: rdr=src.reader(ch*n); samer@0: r=@next; samer@0: function [x,rem]=next samer@0: x=reshape(rdr.next(),ch,n); rem=0; samer@0: end samer@0: end samer@0: samer@0: function dispose samer@0: disposables('dereg',ref); samer@0: src.dispose(); samer@0: end samer@0: end samer@0: end samer@0: end