mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-11 08:07:24 -05:00
Potential existed for the audio output class to become unsynchronized with the underlying source data line and attempt to perform a blocking write to the data line when the data line doesn't have the capacity to accept the full buffer, and the data line is not started. Thus, playback could potentially stay in a persitent blocked state. Refactored Mono and Stereo audio output implementations to push the audio buffer queue processing into the parent abstract class. AudioManager was updated to remove the last time active timestamp out of the audio manager and down into the audio output to remove duplicate timestamp accounting.
58 lines
1.2 KiB
Java
58 lines
1.2 KiB
Java
package audio.output;
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteOrder;
|
|
import java.nio.ShortBuffer;
|
|
|
|
import javax.sound.sampled.Mixer;
|
|
|
|
import source.mixer.MixerChannel;
|
|
import audio.AudioFormats;
|
|
import audio.AudioPacket;
|
|
import controller.ThreadPoolManager;
|
|
|
|
/**
|
|
* Mono Audio output implementation
|
|
*/
|
|
public class MonoAudioOutput extends AudioOutput
|
|
{
|
|
private final static int BUFFER_SIZE = 48000;
|
|
|
|
public MonoAudioOutput( ThreadPoolManager threadPoolManager, Mixer mixer )
|
|
{
|
|
super( threadPoolManager,
|
|
mixer,
|
|
MixerChannel.MONO,
|
|
AudioFormats.PCM_SIGNED_48KHZ_16BITS_MONO,
|
|
AudioFormats.MONO_SOURCE_DATALINE_INFO,
|
|
BUFFER_SIZE );
|
|
}
|
|
|
|
/**
|
|
* Converts the audio packet data into mono audio frames.
|
|
*/
|
|
protected ByteBuffer convert( AudioPacket packet )
|
|
{
|
|
if( packet.hasAudioBuffer() )
|
|
{
|
|
float[] samples = packet.getAudioBuffer().getSamples();
|
|
|
|
/* Little-endian byte buffer */
|
|
ByteBuffer buffer =
|
|
ByteBuffer.allocate( samples.length * 2 )
|
|
.order( ByteOrder.LITTLE_ENDIAN );
|
|
|
|
ShortBuffer shortBuffer = buffer.asShortBuffer();
|
|
|
|
for( float sample: samples )
|
|
{
|
|
shortBuffer.put( (short)( sample * Short.MAX_VALUE ) );
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|