diff --git a/javatari/src/javatari.properties b/javatari/src/javatari.properties index d9ca33e..e2fe298 100644 --- a/javatari/src/javatari.properties +++ b/javatari/src/javatari.properties @@ -1 +1 @@ -# CONSOLE SETTINGS # 0 = No Forced Clock, -1 = Full Speed (useful for VSynch). *** TIA Real Clock = 3584160 *** TIA_FORCED_CLOCK = 0 TIA_SYNC_WITH_AUDIO_MONITOR = false TIA_SYNC_WITH_VIDEO_MONITOR = false TIA_AUDIO_SAMPLE_RATE = 31430 TIA_AUDIO_MAX_AMPLITUDE = 0.5 VIDEO_NTSC_FPS = 60 VIDEO_PAL_FPS = 50.384615 RAM_FRY_ZERO_BITS = 120 RAM_FRY_ONE_BITS = 25 RAM_FRY_VARIANCE = 0.3 BUS_DATA_RETENTION = true CONSOLE_FAST_SPEED_FACTOR = 15 # SCREEN SETTINSG # 0 = External Synch (useful for VSynch), -1 = Auto FPS (On Demand) SCREEN_DEFAULT_FPS = -1 SCREEN_BUFFER_VSYNC = 0 SCREEN_DEFAULT_ORIGIN_X = 68 SCREEN_DEFAULT_ORIGIN_Y_PCT = 12.4 SCREEN_DEFAULT_WIDTH = 160 SCREEN_DEFAULT_HEIGHT_PCT = 81.5 SCREEN_DEFAULT_SCALE_X = 4 SCREEN_DEFAULT_SCALE_Y = 2 SCREEN_DEFAULT_SCALE_ASPECT_X = 2 SCREEN_BORDER_SIZE = 3 SCREEN_OSD_FRAMES = 160 SCREEN_VSYNC_TOLERANCE = 16 SCREEN_QUALITY_RENDERING = false SCREEN_CRT_MODE = 0 SCREEN_CRT_RETENTION_ALPHA = 0.75 SCREEN_SCANLINES_STRENGTH = 0.5 SCREEN_MULTI_BUFFERING = 2 SCREEN_PAGE_FLIPPING = true SCREEN_FRAME_ACCELERATION = -1 SCREEN_INTERM_FRAME_ACCELERATION = -1 SCREEN_SCANLINES_ACCELERATION = -1 SCREEN_FIXED_SIZE = false SCREEN_FULLSCREEN = false SCREEN_USE_FSEM = -1 SCREEN_EMBEDDED_POPUP = true SCREEN_CARTRIDGE_CHANGE = true # SPEAKER SETTINGS # 0 = External Synch, -1 = Auto FPS (On Demand) SPEAKER_DEFAULT_FPS = -1 SPEAKER_INPUT_BUFFER_SIZE = 1536 SPEAKER_OUTPUT_BUFFER_SIZE = 1024 SPEAKER_OUTPUT_BUFFER_FULL_SLEEP_TIME = 5 SPEAKER_NO_DATA_SLEEP_TIME = 10 SPEAKER_ADDED_THREAD_PRIORITY = 0 # NETWORK SETTINGS MULTIPLAYER_UI = true SERVER_SERVICE_PORT = 9998 SERVER_MAX_UPDATES_PENDING = 20 CLIENT_MAX_UPDATES_PENDING = 20 # CARTRIDGE SETTINGS # Leave blank to use defaults/auto detection CARTRIDGE_NAME = CARTRIDGE_LABEL = CARTRIDGE_LABEL_COLORS = CARTRIDGE_PADDLES = CARTRIDGE_CRT_MODE = CARTRIDGE_FORMAT = # CONTROLS SETTINGS PADDLES_MODE = JOYSTICK_UPDATE_RATE = 120 \ No newline at end of file +# CONSOLE SETTINGS # 0 = No Forced Clock, -1 = Full Speed (useful for VSynch). *** TIA Real Clock = 3584160 *** TIA_FORCED_CLOCK = 0 TIA_SYNC_WITH_AUDIO_MONITOR = false TIA_SYNC_WITH_VIDEO_MONITOR = false TIA_AUDIO_SAMPLE_RATE = 31440 TIA_AUDIO_MAX_AMPLITUDE = 0.5 VIDEO_NTSC_FPS = 60 VIDEO_PAL_FPS = 50.3846153846153847 RAM_FRY_ZERO_BITS = 120 RAM_FRY_ONE_BITS = 25 RAM_FRY_VARIANCE = 0.3 BUS_DATA_RETENTION = true CONSOLE_FAST_SPEED_FACTOR = 15 # SCREEN SETTINSG # 0 = External Synch (useful for VSynch), -1 = Auto FPS (On Demand) SCREEN_DEFAULT_FPS = -1 SCREEN_BUFFER_VSYNC = 0 SCREEN_DEFAULT_ORIGIN_X = 68 SCREEN_DEFAULT_ORIGIN_Y_PCT = 12.4 SCREEN_DEFAULT_WIDTH = 160 SCREEN_DEFAULT_HEIGHT_PCT = 81.5 SCREEN_DEFAULT_SCALE_X = 4 SCREEN_DEFAULT_SCALE_Y = 2 SCREEN_DEFAULT_SCALE_ASPECT_X = 2 SCREEN_BORDER_SIZE = 3 SCREEN_OSD_FRAMES = 160 SCREEN_VSYNC_TOLERANCE = 16 SCREEN_QUALITY_RENDERING = false SCREEN_CRT_MODE = 0 SCREEN_CRT_RETENTION_ALPHA = 0.75 SCREEN_SCANLINES_STRENGTH = 0.5 SCREEN_MULTI_BUFFERING = 2 SCREEN_PAGE_FLIPPING = true SCREEN_FRAME_ACCELERATION = -1 SCREEN_INTERM_FRAME_ACCELERATION = -1 SCREEN_SCANLINES_ACCELERATION = -1 SCREEN_FIXED_SIZE = false SCREEN_FULLSCREEN = false SCREEN_USE_FSEM = -1 SCREEN_EMBEDDED_POPUP = true SCREEN_CARTRIDGE_CHANGE = true # SPEAKER SETTINGS # 0 = External Synch, -1 = Auto FPS (On Demand) SPEAKER_DEFAULT_FPS = -1 SPEAKER_INPUT_BUFFER_SIZE = 1536 SPEAKER_OUTPUT_BUFFER_SIZE = 1024 SPEAKER_OUTPUT_BUFFER_FULL_SLEEP_TIME = 6 SPEAKER_NO_DATA_SLEEP_TIME = 6 SPEAKER_ADDED_THREAD_PRIORITY = 0 # NETWORK SETTINGS MULTIPLAYER_UI = true SERVER_SERVICE_PORT = 9998 SERVER_MAX_UPDATES_PENDING = 20 CLIENT_MAX_UPDATES_PENDING = 20 # CARTRIDGE SETTINGS # Leave blank to use defaults/auto detection CARTRIDGE_NAME = CARTRIDGE_LABEL = CARTRIDGE_LABEL_COLORS = CARTRIDGE_PADDLES = CARTRIDGE_CRT_MODE = CARTRIDGE_FORMAT = # CONTROLS SETTINGS PADDLES_MODE = JOYSTICK_UPDATE_RATE = 120 \ No newline at end of file diff --git a/javatari/src/javatari.single.properties b/javatari/src/javatari.single.properties index 7113b9b..9380137 100644 --- a/javatari/src/javatari.single.properties +++ b/javatari/src/javatari.single.properties @@ -1 +1 @@ -# CONSOLE SETTINGS # 0 = No Forced Clock, -1 = Full Speed (useful for VSynch). *** TIA Real Clock = 3584160 *** TIA_FORCED_CLOCK = 0 TIA_SYNC_WITH_AUDIO_MONITOR = true TIA_SYNC_WITH_VIDEO_MONITOR = true TIA_AUDIO_SAMPLE_RATE = 31430 TIA_AUDIO_MAX_AMPLITUDE = 0.5 VIDEO_NTSC_FPS = 60 VIDEO_PAL_FPS = 50.384615 RAM_FRY_ZERO_BITS = 120 RAM_FRY_ONE_BITS = 25 RAM_FRY_VARIANCE = 0.3 BUS_DATA_RETENTION = true CONSOLE_FAST_SPEED_FACTOR = 15 # SCREEN SETTINSG # 0 = External Synch (useful for VSynch), -1 = Auto FPS (On Demand) SCREEN_DEFAULT_FPS = 0 SCREEN_BUFFER_VSYNC = 0 SCREEN_DEFAULT_ORIGIN_X = 68 SCREEN_DEFAULT_ORIGIN_Y_PCT = 12.4 SCREEN_DEFAULT_WIDTH = 160 SCREEN_DEFAULT_HEIGHT_PCT = 81.5 SCREEN_DEFAULT_SCALE_X = 4 SCREEN_DEFAULT_SCALE_Y = 2 SCREEN_DEFAULT_SCALE_ASPECT_X = 2 SCREEN_BORDER_SIZE = 3 SCREEN_OSD_FRAMES = 160 SCREEN_VSYNC_TOLERANCE = 16 SCREEN_QUALITY_RENDERING = false SCREEN_CRT_MODE = 0 SCREEN_CRT_RETENTION_ALPHA = 0.75 SCREEN_SCANLINES_STRENGTH = 0.5 SCREEN_MULTI_BUFFERING = 2 SCREEN_PAGE_FLIPPING = true SCREEN_FRAME_ACCELERATION = -1 SCREEN_INTERM_FRAME_ACCELERATION = -1 SCREEN_SCANLINES_ACCELERATION = -1 SCREEN_FIXED_SIZE = false SCREEN_FULLSCREEN = false SCREEN_USE_FSEM = -1 SCREEN_EMBEDDED_POPUP = true SCREEN_CARTRIDGE_CHANGE = true # SPEAKER SETTINGS # 0 = External Synch, -1 = Auto FPS (On Demand) SPEAKER_DEFAULT_FPS = 0 SPEAKER_INPUT_BUFFER_SIZE = 1536 SPEAKER_OUTPUT_BUFFER_SIZE = 1536 SPEAKER_OUTPUT_BUFFER_FULL_SLEEP_TIME = 5 SPEAKER_NO_DATA_SLEEP_TIME = 10 SPEAKER_ADDED_THREAD_PRIORITY = 0 # NETWORK SETTINGS MULTIPLAYER_UI = true SERVER_SERVICE_PORT = 9998 SERVER_MAX_UPDATES_PENDING = 20 CLIENT_MAX_UPDATES_PENDING = 20 # CARTRIDGE SETTINGS # Leave blank to use defaults/auto detection CARTRIDGE_NAME = CARTRIDGE_LABEL = CARTRIDGE_LABEL_COLORS = CARTRIDGE_PADDLES = CARTRIDGE_CRT_MODE = CARTRIDGE_FORMAT = # CONTROLS SETTINGS PADDLES_MODE = -1 JOYSTICK_UPDATE_RATE = 120 \ No newline at end of file +# CONSOLE SETTINGS # 0 = No Forced Clock, -1 = Full Speed (useful for VSynch). *** TIA Real Clock = 3584160 *** TIA_FORCED_CLOCK = 0 TIA_SYNC_WITH_AUDIO_MONITOR = true TIA_SYNC_WITH_VIDEO_MONITOR = true TIA_AUDIO_SAMPLE_RATE = 31440 TIA_AUDIO_MAX_AMPLITUDE = 0.5 VIDEO_NTSC_FPS = 60 VIDEO_PAL_FPS = 50.3846153846153847 RAM_FRY_ZERO_BITS = 120 RAM_FRY_ONE_BITS = 25 RAM_FRY_VARIANCE = 0.3 BUS_DATA_RETENTION = true CONSOLE_FAST_SPEED_FACTOR = 15 # SCREEN SETTINSG # 0 = External Synch (useful for VSynch), -1 = Auto FPS (On Demand) SCREEN_DEFAULT_FPS = 0 SCREEN_BUFFER_VSYNC = 0 SCREEN_DEFAULT_ORIGIN_X = 68 SCREEN_DEFAULT_ORIGIN_Y_PCT = 12.4 SCREEN_DEFAULT_WIDTH = 160 SCREEN_DEFAULT_HEIGHT_PCT = 81.5 SCREEN_DEFAULT_SCALE_X = 4 SCREEN_DEFAULT_SCALE_Y = 2 SCREEN_DEFAULT_SCALE_ASPECT_X = 2 SCREEN_BORDER_SIZE = 3 SCREEN_OSD_FRAMES = 160 SCREEN_VSYNC_TOLERANCE = 16 SCREEN_QUALITY_RENDERING = false SCREEN_CRT_MODE = 0 SCREEN_CRT_RETENTION_ALPHA = 0.75 SCREEN_SCANLINES_STRENGTH = 0.5 SCREEN_MULTI_BUFFERING = 2 SCREEN_PAGE_FLIPPING = true SCREEN_FRAME_ACCELERATION = -1 SCREEN_INTERM_FRAME_ACCELERATION = -1 SCREEN_SCANLINES_ACCELERATION = -1 SCREEN_FIXED_SIZE = false SCREEN_FULLSCREEN = false SCREEN_USE_FSEM = -1 SCREEN_EMBEDDED_POPUP = true SCREEN_CARTRIDGE_CHANGE = true # SPEAKER SETTINGS # 0 = External Synch, -1 = Auto FPS (On Demand) SPEAKER_DEFAULT_FPS = 0 SPEAKER_INPUT_BUFFER_SIZE = 1536 SPEAKER_OUTPUT_BUFFER_SIZE = 1536 SPEAKER_OUTPUT_BUFFER_FULL_SLEEP_TIME = 6 SPEAKER_NO_DATA_SLEEP_TIME = 6 SPEAKER_ADDED_THREAD_PRIORITY = 0 # NETWORK SETTINGS MULTIPLAYER_UI = true SERVER_SERVICE_PORT = 9998 SERVER_MAX_UPDATES_PENDING = 20 CLIENT_MAX_UPDATES_PENDING = 20 # CARTRIDGE SETTINGS # Leave blank to use defaults/auto detection CARTRIDGE_NAME = CARTRIDGE_LABEL = CARTRIDGE_LABEL_COLORS = CARTRIDGE_PADDLES = CARTRIDGE_CRT_MODE = CARTRIDGE_FORMAT = # CONTROLS SETTINGS PADDLES_MODE = -1 JOYSTICK_UPDATE_RATE = 120 \ No newline at end of file diff --git a/javatari/src/org/javatari/atari/tia/TIA.java b/javatari/src/org/javatari/atari/tia/TIA.java index ca2c1d9..d1d1e68 100644 --- a/javatari/src/org/javatari/atari/tia/TIA.java +++ b/javatari/src/org/javatari/atari/tia/TIA.java @@ -116,7 +116,7 @@ public void clockPulse() { videoOutputVSynched = videoOutput.nextLine(linePixels, vSyncOn); } while (!videoOutputVSynched && powerOn); if (powerOn) { - audioOutput.sendSamplesFrameToMonitor(); + audioOutput.finishFrame(); // If needed, synch with audio and video output after each frame if (SYNC_WITH_AUDIO_MONITOR) audioOutput.monitor().synchOutput(); if (SYNC_WITH_VIDEO_MONITOR) videoOutput.monitor().synchOutput(); diff --git a/javatari/src/org/javatari/atari/tia/audio/AudioGenerator.java b/javatari/src/org/javatari/atari/tia/audio/AudioGenerator.java index cde8c2b..a185666 100644 --- a/javatari/src/org/javatari/atari/tia/audio/AudioGenerator.java +++ b/javatari/src/org/javatari/atari/tia/audio/AudioGenerator.java @@ -18,7 +18,12 @@ public void connectMonitor(AudioMonitor monitor) { @Override public void clockPulse() { - if (generatedSamples < samplesPerFrame) generateNextSamples(1); + if (frameSamples < samplesPerFrame) generateNextSamples(1); + if (generatedSamples >= 106) sendGeneratedSamples(); + } + + public AudioMonitor monitor() { + return monitor; } public ChannelStream channel0() { @@ -29,33 +34,43 @@ public ChannelStream channel1() { return channel1; } - public void sendSamplesFrameToMonitor() { - int missingSamples = samplesPerFrame - generatedSamples; - if (missingSamples > 0) generateNextSamples(missingSamples); - if (monitor != null) monitor.nextSamples(samples, generatedSamples); - generatedSamples = 0; + public void videoStandard(VideoStandard standard) { + // Perfect amount is 2 sample per scanline = 31440, 524 for NTSC(60Hz) and 624 for PAL(50hz) + samplesPerFrame = (int) Math.round(SAMPLE_RATE / standard.fps); } public void signalOff() { + generatedSamples = 0; + frameSamples = 0; if (monitor != null) monitor.nextSamples(null, 0); } - public AudioMonitor monitor() { - return monitor; + public void finishFrame() { + int missingSamples = samplesPerFrame - frameSamples; + if (missingSamples > 0) generateNextSamples(missingSamples); + sendGeneratedSamples(); + frameSamples = 0; } - public void videoStandard(VideoStandard standard) { - // Perfect amount is 2 sample per scanline = 31440, 524 for NTSC(60Hz) and 624 for PAL(50hz) - samplesPerFrame = (int) Math.round(SAMPLE_RATE / standard.fps); + private void sendGeneratedSamples() { + if (monitor != null) { + int more = monitor.nextSamples(samples, generatedSamples); + if (more > 0) { + generateNextSamples(more); + monitor.nextSamples(samples, generatedSamples); + } + } + generatedSamples = 0; } - protected abstract void generateNextSamples(int min); + protected abstract void generateNextSamples(int quant); protected final ChannelStream channel0 = new ChannelStream(); protected final ChannelStream channel1 = new ChannelStream(); protected final byte[] samples = new byte[2048]; // More than enough samples for a frame protected int generatedSamples = 0; + protected int frameSamples = 0; private int samplesPerFrame = 0; private AudioMonitor monitor; diff --git a/javatari/src/org/javatari/atari/tia/audio/AudioMonoGenerator.java b/javatari/src/org/javatari/atari/tia/audio/AudioMonoGenerator.java index 897964e..6abdd06 100644 --- a/javatari/src/org/javatari/atari/tia/audio/AudioMonoGenerator.java +++ b/javatari/src/org/javatari/atari/tia/audio/AudioMonoGenerator.java @@ -18,10 +18,17 @@ protected void generateNextSamples(int quant) { } samples[generatedSamples++] = (byte) (mixedSample * MAX_AMPLITUDE * 127); + frameSamples++; } } - private float lastSample; + @Override + public void signalOff() { + lastSample = 0; + super.signalOff(); + } + + private float lastSample = 0; private static final float MAX_AMPLITUDE = Parameters.TIA_AUDIO_MAX_AMPLITUDE; diff --git a/javatari/src/org/javatari/general/av/audio/AudioMonitor.java b/javatari/src/org/javatari/general/av/audio/AudioMonitor.java index 4c174dd..6ebae16 100644 --- a/javatari/src/org/javatari/general/av/audio/AudioMonitor.java +++ b/javatari/src/org/javatari/general/av/audio/AudioMonitor.java @@ -4,7 +4,7 @@ public interface AudioMonitor { - public void nextSamples(byte[] samples, int quant); + public int nextSamples(byte[] samples, int quant); public void synchOutput(); diff --git a/javatari/src/org/javatari/main/TestStandalone.java b/javatari/src/org/javatari/main/TestStandalone.java index 1605a68..e914d6d 100644 --- a/javatari/src/org/javatari/main/TestStandalone.java +++ b/javatari/src/org/javatari/main/TestStandalone.java @@ -35,5 +35,9 @@ public static void main(String[] args) { }}).start(); } + + // TODO Test Java7 + // TODO Monitor optimizations + // TODO Keyboard Input Components and Focus } diff --git a/javatari/src/org/javatari/parameters/Parameters.java b/javatari/src/org/javatari/parameters/Parameters.java index 2675ee6..c803465 100644 --- a/javatari/src/org/javatari/parameters/Parameters.java +++ b/javatari/src/org/javatari/parameters/Parameters.java @@ -337,11 +337,11 @@ public static void setCartridgeLabelColors(String colorsSpec) { public static boolean TIA_SYNC_WITH_AUDIO_MONITOR = false; public static boolean TIA_SYNC_WITH_VIDEO_MONITOR = false; - public static int TIA_AUDIO_SAMPLE_RATE = 31430; // A little less than TIA Scanline frequency * 2 = 31440 + public static int TIA_AUDIO_SAMPLE_RATE = 31440; // A little less than TIA Scanline frequency * 2 = 31440 public static float TIA_AUDIO_MAX_AMPLITUDE = 0.5f; public static double VIDEO_NTSC_FPS = 60; - public static double VIDEO_PAL_FPS = 50.384615; + public static double VIDEO_PAL_FPS = 50.3846153846153847; public static int RAM_FRY_ZERO_BITS = 120; // Quantity of bits to change public static int RAM_FRY_ONE_BITS = 25; @@ -380,8 +380,8 @@ public static void setCartridgeLabelColors(String colorsSpec) { public static double SPEAKER_DEFAULT_FPS = -1; // 0 = External Synch, -1 = Auto FPS (On Demand) public static int SPEAKER_INPUT_BUFFER_SIZE = 1536; // In frames (samples) public static int SPEAKER_OUTPUT_BUFFER_SIZE = 1024; // In frames (samples) - public static int SPEAKER_OUTPUT_BUFFER_FULL_SLEEP_TIME = 5; // In milliseconds - public static int SPEAKER_NO_DATA_SLEEP_TIME = 10; // In milliseconds + public static int SPEAKER_OUTPUT_BUFFER_FULL_SLEEP_TIME = 6; // In milliseconds + public static int SPEAKER_NO_DATA_SLEEP_TIME = 6; // In milliseconds public static int SPEAKER_ADDED_THREAD_PRIORITY = 0; public static boolean MULTIPLAYER_UI = true; diff --git a/javatari/src/org/javatari/pc/screen/DesktopScreenWindow.java b/javatari/src/org/javatari/pc/screen/DesktopScreenWindow.java index 1289063..9bca183 100644 --- a/javatari/src/org/javatari/pc/screen/DesktopScreenWindow.java +++ b/javatari/src/org/javatari/pc/screen/DesktopScreenWindow.java @@ -302,13 +302,15 @@ public void canvasSetRenderingMode() { new ImageCapabilities(true), new ImageCapabilities(true), Monitor.PAGE_FLIPPING ? FlipContents.BACKGROUND : null ); - // First try with vSync option Class extBufCapClass = null; + try { + // Creates ExtendedBufferCapabilities via reflection to avoid problems with AccessControl + extBufCapClass = Class.forName("sun.java2d.pipe.hw.ExtendedBufferCapabilities"); + } catch (Exception ex) {} + // First try with vSync option if (Monitor.BUFFER_VSYNC != -1) try { - // TODO Extract extBufCapClass creation to alwaus display granted VSYNC state at the end // Creates ExtendedBufferCapabilities via reflection to avoid problems with AccessControl - extBufCapClass = Class.forName("sun.java2d.pipe.hw.ExtendedBufferCapabilities"); Class vSyncTypeClass = Class.forName("sun.java2d.pipe.hw.ExtendedBufferCapabilities$VSyncType"); Constructor extBufCapConstructor = extBufCapClass.getConstructor( new Class[] { BufferCapabilities.class, vSyncTypeClass } diff --git a/javatari/src/org/javatari/pc/speaker/Speaker.java b/javatari/src/org/javatari/pc/speaker/Speaker.java index 56b4caf..ac8d429 100644 --- a/javatari/src/org/javatari/pc/speaker/Speaker.java +++ b/javatari/src/org/javatari/pc/speaker/Speaker.java @@ -2,7 +2,6 @@ package org.javatari.pc.speaker; - import java.nio.ByteBuffer; import javax.sound.sampled.AudioFormat; @@ -26,6 +25,7 @@ public void connect(AudioSignal signal) { // Must be powered off to connect a si public void powerOn(){ if (!triedToGetLine) getLine(); if (dataLine == null) return; + currOutputBufferPosition = 0; dataLine.start(); clock.go(); } @@ -35,6 +35,7 @@ public void powerOff(){ clock.pause(); dataLine.flush(); dataLine.stop(); + currOutputBufferPosition = 0; } public void destroy() { @@ -45,19 +46,23 @@ public void destroy() { } @Override - public synchronized void nextSamples(byte[] buffer, int quant) { - if (dataLine == null) return; + public synchronized int nextSamples(byte[] buffer, int quant) { + if (dataLine == null) return -1; if (buffer == null) { // Signal is off dataLine.flush(); - return; + return -1; } // Drop samples that don't fit the input buffer available capacity int ava = inputBuffer.remaining(); if (ava > quant) ava = quant; - // else - // System.out.println(">>>> DROPPED: " + (quant - ava)); + else + if (ava < quant) System.out.println(">>>> DROPPED: " + quant + " - " + ava + " = " + (quant - ava)); inputBuffer.put(buffer, 0, ava); +// if (currOutputBufferPosition < 400) +// return 20; +// else + return -1; } @Override @@ -101,23 +106,27 @@ private synchronized int getFromInputBuffer(byte[] buffer, int quant) { private void refresh() { if (dataLine == null) return; int ava = dataLine.available(); // this is a little expensive... :-( + + currOutputBufferPosition = OUTPUT_BUFFER_SIZE - ava; + // System.out.println(">> Out: " + currOutputBufferPosition + "\tIn: " + inputBuffer.position()); + if (ava == 0) { - if (OUTPUT_BUFFER_FULL_SLEEP_TIME > 0 && FPS < 0) { - // System.out.println("Buffer Full, sleeping..."); + // System.out.println("+ OutputBuffer FULL"); + if (OUTPUT_BUFFER_FULL_SLEEP_TIME > 0 && FPS < 0) try { Thread.sleep(OUTPUT_BUFFER_FULL_SLEEP_TIME, 0); } catch (InterruptedException e) { } - } return; } int data = getFromInputBuffer(tempBuffer, ava); - // System.out.println(ava + ", " + data + ", " + inputBuffer.remaining()); if (data == 0) { - if (NO_DATA_SLEEP_TIME > 0 && FPS < 0) { - // System.out.println("NO DATA, sleeping..."); + // System.out.println("- InputBuffer EMPTY, OutputBuffer: " + ava); + if (NO_DATA_SLEEP_TIME > 0 && FPS < 0) try { Thread.sleep(NO_DATA_SLEEP_TIME, 0); } catch (InterruptedException e) { } - } return; } + // System.out.println(">> " + ava + ", data avail: " + data + ", InputBuffer: " + inputBuffer.remaining()); dataLine.write(tempBuffer, 0, data); + if (FPS < 0) + try { Thread.sleep(OUTPUT_BUFFER_FULL_SLEEP_TIME, 0); } catch (InterruptedException e) { } } @@ -127,6 +136,7 @@ private void refresh() { private ByteBuffer inputBuffer; private byte[] tempBuffer; private boolean triedToGetLine = false; + private int currOutputBufferPosition; private final AudioFormat AUDIO_FORMAT = new AudioFormat(SAMPLE_RATE, 8, 1, true, false);