X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2FPlayAudioFunction.java;h=2ac71e93b6e38bbbaab727aa1a6d7d421c4a117a;hp=0e14d7c9ad1f9f6c9f4df9f761b7c466838b751d;hb=4d5796d02a15808311c09448d79e6e7d1de9d636;hpb=f1b92378a792131ac8fb33a869405851d5b2d1f7 diff --git a/tim/prune/function/PlayAudioFunction.java b/tim/prune/function/PlayAudioFunction.java index 0e14d7c..2ac71e9 100644 --- a/tim/prune/function/PlayAudioFunction.java +++ b/tim/prune/function/PlayAudioFunction.java @@ -1,8 +1,12 @@ package tim.prune.function; +import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; + import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; @@ -58,39 +62,34 @@ public class PlayAudioFunction extends GenericFunction implements Runnable { // First choice is to play using java played = playClip(audio); - // Second choice is to try the Desktop library from java 6, if available + // If this didn't work, then try to play the file another way if (!played) { - try { - Class d = Class.forName("java.awt.Desktop"); - d.getDeclaredMethod("open", new Class[] {File.class}).invoke( - d.getDeclaredMethod("getDesktop").invoke(null), new Object[] {audioFile}); - //above code mimics: Desktop.getDesktop().open(audioFile); - played = true; - } - catch (Exception ignore) { - played = false; - } + played = playAudioFile(audioFile); } - // If the Desktop call failed, need to try backup methods + } + else if (audioFile == null && audio.getByteData() != null) + { + // Try to play audio clip using byte array + played = playClip(audio); + // If this didn't work, then need to copy the byte data to a file and play it from there if (!played) { - // If system looks like a Mac, try open command - String osName = System.getProperty("os.name").toLowerCase(); - boolean isMacOsx = osName.indexOf("mac os") >= 0 || osName.indexOf("darwin") >= 0; - if (isMacOsx) { - String[] command = new String[] {"open", audioFile.getAbsolutePath()}; - try { - Runtime.getRuntime().exec(command); - played = true; - } - catch (IOException ioe) {} + try + { + String suffix = getSuffix(audio.getName()); + File tempFile = File.createTempFile("gpsaudio", suffix); + tempFile.deleteOnExit(); + // Copy byte data to this file + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tempFile)); + bos.write(audio.getByteData(), 0, audio.getByteData().length); + bos.close(); + played = playAudioFile(tempFile); + } + catch (IOException ignore) { + System.err.println("Error: " + ignore.getClass().getName() + " - " + ignore.getMessage()); } } } - else if (audioFile == null && audio.getByteData() != null) { - // Try to play audio clip using byte array (can't use Desktop or Runtime) - played = playClip(audio); - } if (!played) { // If still not worked, show error message @@ -134,6 +133,54 @@ public class PlayAudioFunction extends GenericFunction implements Runnable return success; } + /** + * Try to play the specified audio file + * @param inFile file to play + * @return true if play was successful + */ + private boolean playAudioFile(File inFile) + { + boolean played = false; + // Try the Desktop library from java 6, if available + if (!played) + { + try + { + Class d = Class.forName("java.awt.Desktop"); + d.getDeclaredMethod("open", new Class[] {File.class}).invoke( + d.getDeclaredMethod("getDesktop").invoke(null), new Object[] {inFile}); + //above code mimics: Desktop.getDesktop().open(audioFile); + played = true; + } + catch (InvocationTargetException e) { + System.err.println("ITE: " + e.getCause().getClass().getName() + " - " + e.getCause().getMessage()); + played = false; + } + catch (Exception ignore) { + System.err.println(ignore.getClass().getName() + " - " + ignore.getMessage()); + played = false; + } + } + + // If the Desktop call failed, need to try backup methods + if (!played) + { + // If system looks like a Mac, try the open command + String osName = System.getProperty("os.name").toLowerCase(); + boolean isMacOsx = osName.indexOf("mac os") >= 0 || osName.indexOf("darwin") >= 0; + if (isMacOsx) + { + String[] command = new String[] {"open", inFile.getAbsolutePath()}; + try { + Runtime.getRuntime().exec(command); + played = true; + } + catch (IOException ioe) {} + } + } + return played; + } + /** * Try to stop a currently playing clip */ @@ -163,4 +210,16 @@ public class PlayAudioFunction extends GenericFunction implements Runnable } return percent; } + + /** + * @param inName name of audio file + * @return suffix (rest of name after the dot) - expect mp3, wav, ogg + */ + private static final String getSuffix(String inName) + { + if (inName == null || inName.equals("")) {return ".tmp";} + final int dotPos = inName.lastIndexOf('.'); + if (dotPos < 0) {return inName;} // no dot found + return inName.substring(dotPos); + } }