samer@0: /* samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.units; samer@0: samer@0: import samer.maths.*; samer@0: import samer.core.*; samer@0: import samer.core.types.*; samer@0: import samer.audio.*; samer@0: import samer.tools.*; samer@0: import javax.sound.sampled.*; samer@0: samer@0: /** samer@0: A class which takes real valued samples from a VVector, converts samer@0: them to 16 bit integer samples, and writes them to an audio samer@0: device. samer@0: samer@0:

samer@0: Can optionally output only a sub-window of input vector samer@0: This window is adjustable on the fly, so, for example, we can samer@0: output the last M samples of a sliding window. samer@0: samer@0: */ samer@0: samer@0: public class LineOut implements Task samer@0: { samer@0: AudioSink sink; samer@0: Task writer=new NullTask(); samer@0: samer@0: Vec vec; samer@0: int i0, i1; samer@0: samer@0: public LineOut(Vec buf, AudioSink sink) throws Exception { samer@0: this.sink=sink; setInput(buf); samer@0: } samer@0: samer@0: public Vec input() { return vec; } samer@0: public AudioSink getSink() { return sink; } samer@0: public void setSink(AudioSink sink) { this.sink=sink; setWindow(i0,i1); } samer@0: public void setInput(Vec vec) { this.vec=vec; setWindow(0,vec.size()); } samer@0: public void setWindow(int a,int b) { samer@0: i0=a; i1=b; writer=sink.writer(vec.array(),i0,i1-i0); samer@0: } samer@0: samer@0: public void dispose() { writer.dispose(); sink.dispose(); } samer@0: public void starting() { writer.starting(); } samer@0: public void stopping() { writer.stopping(); } samer@0: public void run() throws Exception { writer.run(); } samer@0: } samer@0: