From f3245a4245a7438e7453054ab51504a5c02c77c9 Mon Sep 17 00:00:00 2001 From: Brendan Robert Date: Thu, 18 Sep 2014 19:24:45 -0500 Subject: [PATCH] I think I finally have speaker playback that doesn't sound too skippy. Yay. --- src/main/java/jace/apple2e/Speaker.java | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/jace/apple2e/Speaker.java b/src/main/java/jace/apple2e/Speaker.java index cd439d4..9625de0 100644 --- a/src/main/java/jace/apple2e/Speaker.java +++ b/src/main/java/jace/apple2e/Speaker.java @@ -99,8 +99,6 @@ public class Speaker extends Device { // Number of samples available in output stream before playback happens (avoid extra blocking) // static int MIN_PLAYBACK_BUFFER = BUFFER_SIZE / 2; static int MIN_PLAYBACK_BUFFER = 64; - // Number of samples in buffer to wait until playback (avoid underrun) - private int MIN_SAMPLE_PLAYBACK = 64; /** * Playback volume (should be < 1423) */ @@ -110,7 +108,7 @@ public class Speaker extends Device { * Number of idle cycles until speaker playback is deactivated */ @ConfigurableField(name = "Idle cycles before sleep", shortName = "idle") - public static int MAX_IDLE_CYCLES = 100000; + public static int MAX_IDLE_CYCLES = 2000000; /** * Java sound output */ @@ -189,11 +187,16 @@ public class Speaker extends Device { */ @Override public void resume() { + if (sdl != null && isRunning()) return; System.out.println("Resuming speaker sound"); sdl = null; try { - sdl = computer.getMotherboard().mixer.getLine(this); + sdl = computer.getMotherboard().mixer.getLine(this); sdl.start(); + counter = 0; + idleCycles = 0; + level = 0; + bufferPos = 0; setRun(true); playbackTimer = new Timer(); playbackTimer.scheduleAtFixedRate(new TimerTask() { @@ -201,16 +204,10 @@ public class Speaker extends Device { public void run() { playCurrentBuffer(); } - }, 25, 50); + }, 10, 30); } catch (LineUnavailableException ex) { System.out.println("ERROR: Could not output sound: " + ex.getMessage()); } - if (sdl != null) { - counter = 0; - idleCycles = 0; - level = 0; - bufferPos = 0; - } } public void playCurrentBuffer() { @@ -224,7 +221,6 @@ public class Speaker extends Device { } secondaryBuffer = buffer; sdl.write(buffer, 0, len); - sdl.start(); } /** @@ -310,15 +306,13 @@ public class Speaker extends Device { if (primaryBuffer != null && secondaryBuffer != null) { return; } - BUFFER_SIZE = 10000 * (SoundMixer.BITS >> 3); - MIN_SAMPLE_PLAYBACK = SoundMixer.BITS * 8; + BUFFER_SIZE = 20000 * (SoundMixer.BITS >> 3); primaryBuffer = new byte[BUFFER_SIZE]; secondaryBuffer = new byte[BUFFER_SIZE]; } @Override public void attach() { - reconfigure(); configureListener(); resume(); }