This is an automated email from the git hooks/post-receive script. New commit to branch feature/7063 in repository tutti. See http://git.codelutin.com/tutti.git commit 906fd368e4b628ff8a0ca2c1aa0a75b8096fa6e7 Author: Kevin Morin <morin@codelutin.com> Date: Fri Jan 15 12:26:27 2016 +0100 correction de la lecture des voix (fixes #7063) --- .../java/fr/ifremer/tutti/ui/swing/RunTutti.java | 12 +-- .../actions/ApplySpeciesFrequencyRafaleAction.java | 4 +- .../fr/ifremer/tutti/ui/swing/util/SoundUtil.java | 93 ++++++++++++---------- .../fr/ifremer/tutti/ui/swing/SoundUtilTest.java | 2 + 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java index 724a90e..47a231c 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/RunTutti.java @@ -23,12 +23,11 @@ package fr.ifremer.tutti.ui.swing; */ import fr.ifremer.tutti.TuttiConfiguration; +import fr.ifremer.tutti.ui.swing.content.MainUI; +import fr.ifremer.tutti.ui.swing.content.MainUIHandler; import fr.ifremer.tutti.ui.swing.content.actions.StartAction; import fr.ifremer.tutti.ui.swing.update.actions.UpdateApplicationAction; import fr.ifremer.tutti.ui.swing.update.actions.UpdateReportAction; -import fr.ifremer.tutti.ui.swing.content.MainUI; -import fr.ifremer.tutti.ui.swing.content.MainUIHandler; -import fr.ifremer.tutti.ui.swing.util.SoundUtil; import fr.ifremer.tutti.ui.swing.util.TuttiExceptionHandler; import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; @@ -61,13 +60,6 @@ public class RunTutti { log.info("Starting Tutti with arguments: " + Arrays.toString(args)); } - SoundUtil.readNumber(2001, "cm"); - SoundUtil.readNumber(2001.2, "mm"); - SoundUtil.readNumber(2000.5, "cm"); - SoundUtil.readNumber(2000, "cm"); - SoundUtil.readNumber(200, "cm"); - SoundUtil.readNumber(201, "cm"); - // Create configuration TuttiConfiguration config = new TuttiConfiguration("tutti.config", args); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java index 71d4d12..4bf7da3 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/catches/species/frequency/actions/ApplySpeciesFrequencyRafaleAction.java @@ -111,13 +111,13 @@ public class ApplySpeciesFrequencyRafaleAction { ui.getTable().scrollRowToVisible(rowIndex); -// if (fromIchtyometer) { + if (fromIchtyometer) { String unit = model.getLengthStepCaracteristicUnit(); handler.showInformationMessage(t("tutti.editSpeciesFrequencies.addMeasure", step, aroundLengthStep, unit)); SoundUtil.beep(handler.getConfig().getIchtyometerDataReceptionBeepFrequency()); SoundUtil.readNumber(aroundLengthStep, unit); -// } + } JXTable logsTable = ui.getLogsTable(); SpeciesFrequencyLogsTableModel logsTableModel = (SpeciesFrequencyLogsTableModel) logsTable.getModel(); diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundUtil.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundUtil.java index fd920d7..dc5a3f8 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundUtil.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/util/SoundUtil.java @@ -7,15 +7,12 @@ import org.apache.commons.logging.LogFactory; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.Clip; +import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import javax.sound.sampled.UnsupportedAudioFileException; import java.io.IOException; -import java.io.InputStream; -import java.io.SequenceInputStream; import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** @@ -72,45 +69,64 @@ public class SoundUtil { sdl.close(); } - public static void readNumber(double number, String unit) { + public static synchronized void readNumber(final double number, final String unit) { - try { + new Thread(new Runnable() { - int thousands = (int) (number / 1000); - int hundreds = (int) (number % 1000) / 100; - int tensAndUnits = (int) number % 100; - int decimal = (int) (number * 10) % 10; + @Override + public void run() { - List<AudioInputStream> audioInputStreams = new ArrayList<>(); - long length = 0; - length += addSound(audioInputStreams, thousands, 1000); - length += addSound(audioInputStreams, hundreds, 100); - if (tensAndUnits != 0 || thousands == 0 && hundreds == 0) { - length += addSound(audioInputStreams, tensAndUnits); - } - if (decimal > 0) { - length += addSound(audioInputStreams, ","); - length += addSound(audioInputStreams, decimal); - } - length += addSound(audioInputStreams, unit); + try { - if (!audioInputStreams.isEmpty()) { + int thousands = (int) (number / 1000); + int hundreds = (int) (number % 1000) / 100; + int tensAndUnits = (int) number % 100; + int decimal = (int) (number * 10) % 10; - AudioFormat audioFormat = audioInputStreams.get(0).getFormat(); + List<AudioInputStream> audioInputStreams = new ArrayList<>(); - InputStream inputStream = new SequenceInputStream(Collections.enumeration(audioInputStreams)); + addSound(audioInputStreams, thousands, 1000); + addSound(audioInputStreams, hundreds, 100); + if (tensAndUnits != 0 || thousands == 0 && hundreds == 0) { + addSound(audioInputStreams, tensAndUnits); + } + if (decimal > 0) { + addSound(audioInputStreams, ","); + addSound(audioInputStreams, decimal); + } + addSound(audioInputStreams, unit); - Clip clip = AudioSystem.getClip(); - AudioInputStream appendedFiles = new AudioInputStream(inputStream, audioFormat, length); - clip.open(appendedFiles); - clip.start(); - } + if (!audioInputStreams.isEmpty()) { + + AudioFormat format = audioInputStreams.get(0).getFormat(); + DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); + SourceDataLine audioLine = (SourceDataLine) AudioSystem.getLine(info); + audioLine.open(format); + audioLine.start(); - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("Error while reading " + number + " " + unit, e); + byte[] bytesBuffer = new byte[4096]; + int bytesRead; + + while (!audioInputStreams.isEmpty()) { + AudioInputStream audioInputStream = audioInputStreams.remove(0); + while ((bytesRead = audioInputStream.read(bytesBuffer)) != -1) { + audioLine.write(bytesBuffer, 0, bytesRead); + } + audioInputStream.close(); + } + + audioLine.drain(); + audioLine.close(); + } + + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("Error while reading " + number + " " + unit, e); + } + } } - } + + }).start(); } protected static long addSound(List<AudioInputStream> inputStreams, int number) throws IOException, UnsupportedAudioFileException { @@ -126,9 +142,6 @@ public class SoundUtil { } AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(SoundUtil.class.getResource(SOUNDS_DIRECTORY + "/" + number + ".wav")); inputStreams.add(audioInputStream); - if (log.isDebugEnabled()) { - log.debug("--> " + audioInputStream.getFrameLength()); - } length += audioInputStream.getFrameLength(); } @@ -138,9 +151,6 @@ public class SoundUtil { } AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(SoundUtil.class.getResource(SOUNDS_DIRECTORY + "/" + suffix + ".wav")); inputStreams.add(audioInputStream); - if (log.isDebugEnabled()) { - log.debug("--> " + audioInputStream.getFrameLength()); - } length += audioInputStream.getFrameLength(); } @@ -153,9 +163,6 @@ public class SoundUtil { } AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(SoundUtil.class.getResource(SOUNDS_DIRECTORY + "/" + name + ".wav")); inputStreams.add(audioInputStream); - if (log.isDebugEnabled()) { - log.debug("--> " + audioInputStream.getFrameLength()); - } return audioInputStream.getFrameLength(); } diff --git a/tutti-ui-swing/src/test/java/fr/ifremer/tutti/ui/swing/SoundUtilTest.java b/tutti-ui-swing/src/test/java/fr/ifremer/tutti/ui/swing/SoundUtilTest.java index c299fca..f8da83a 100644 --- a/tutti-ui-swing/src/test/java/fr/ifremer/tutti/ui/swing/SoundUtilTest.java +++ b/tutti-ui-swing/src/test/java/fr/ifremer/tutti/ui/swing/SoundUtilTest.java @@ -13,6 +13,8 @@ public class SoundUtilTest { public void testSound() throws InterruptedException { SoundUtil.readNumber(1, "cm"); Thread.sleep(3000); + SoundUtil.readNumber(35, "mm"); + Thread.sleep(3000); SoundUtil.readNumber(2001, "cm"); Thread.sleep(3000); SoundUtil.readNumber(2300, "cm"); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.