package ddf.minim;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.Control;
import ddf.minim.spi.AudioOut;
import ddf.minim.spi.AudioStream;
// ddf (9/5/15): very very basic audio out implementation
// : that is used when creating an AudioInput
// : in the event that getLineOut does not return
// : a usable audio out.
class BasicAudioOut extends Thread
implements AudioOut
{
private AudioFormat format;
private MultiChannelBuffer buffer;
private AudioListener listener;
private AudioStream stream;
private boolean running;
public BasicAudioOut(AudioFormat format, int bufferSize)
{
this.format = format;
buffer = new MultiChannelBuffer(bufferSize, format.getChannels());
}
public void run()
{
running = true;
while (running)
{
// this should block until we get a full buffer
int samplesRead = stream.read(buffer);
// but with JavaSound, at least, it might return without
// a full buffer if the TargetDataLine the stream is reading from
// is closed during a read, so in that case we simply
// fill the rest of the buffer with silence
if ( samplesRead != buffer.getBufferSize() )
{
for(int i = samplesRead; i < buffer.getBufferSize(); ++i)
{
for(int c = 0; c < buffer.getChannelCount(); ++c)
{
buffer.setSample( c, i, 0 );
buffer.setSample( c, i, 0 );
}
}
}
if (buffer.getChannelCount()==1)
{
listener.samples(buffer.getChannel(0));
}
else
{
listener.samples(buffer.getChannel(0), buffer.getChannel(1));
}
try
{
Thread.sleep(1);
}
catch (InterruptedException e)
{
}
}
}
public void open()
{
start();
}
public void close()
{
running = false;
}
public Control[] getControls()
{
return new Control[0];
}
public AudioFormat getFormat()
{
return format;
}
public int bufferSize()
{
return buffer.getBufferSize();
}
public void setAudioSignal(AudioSignal signal)
{
//Minim.error( "BasicAudioOut does not support setting an AudioSignal." );
}
public void setAudioStream(AudioStream stream)
{
this.stream = stream;
}
public void setAudioEffect(AudioEffect effect)
{
//Minim.error( "BasicAudiOut does not support setting an AudioEffect." );
}
public void setAudioListener(AudioListener listen)
{
this.listener = listen;
}
}