aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/AntSoundPlayer.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/AntSoundPlayer.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/AntSoundPlayer.java251
1 files changed, 251 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/AntSoundPlayer.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/AntSoundPlayer.java
new file mode 100644
index 00000000..7988bc60
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/AntSoundPlayer.java
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.tools.ant.taskdefs.optional.sound;
+
+// ant includes
+import java.io.File;
+import java.io.IOException;
+
+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.Line;
+import javax.sound.sampled.LineEvent;
+import javax.sound.sampled.LineListener;
+import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.UnsupportedAudioFileException;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Project;
+
+
+
+/**
+ * This class is designed to be used by any AntTask that requires audio output.
+ *
+ * It implements the BuildListener interface to listen for BuildEvents
+ * and could be easily extended to provide audio output upon any
+ * specific build events occurring.
+ *
+ * I have only tested this with .WAV and .AIFF sound file formats. Both seem to work fine.
+ *
+ */
+
+public class AntSoundPlayer implements LineListener, BuildListener {
+
+ private File fileSuccess = null;
+ private int loopsSuccess = 0;
+ private Long durationSuccess = null;
+
+ private File fileFail = null;
+ private int loopsFail = 0;
+ private Long durationFail = null;
+
+ /** Constructor for AntSoundPlayer. */
+ public AntSoundPlayer() {
+ }
+
+ /**
+ * @param file the location of the audio file to be played when the
+ * build is successful
+ * @param loops the number of times the file should be played when
+ * the build is successful
+ * @param duration the number of milliseconds the file should be
+ * played when the build is successful
+ */
+ public void addBuildSuccessfulSound(File file, int loops, Long duration) {
+ this.fileSuccess = file;
+ this.loopsSuccess = loops;
+ this.durationSuccess = duration;
+ }
+
+
+ /**
+ * @param fileFail the location of the audio file to be played
+ * when the build fails
+ * @param loopsFail the number of times the file should be played
+ * when the build is fails
+ * @param durationFail the number of milliseconds the file should be
+ * played when the build fails
+ */
+ public void addBuildFailedSound(File fileFail, int loopsFail, Long durationFail) {
+ this.fileFail = fileFail;
+ this.loopsFail = loopsFail;
+ this.durationFail = durationFail;
+ }
+
+ /**
+ * Plays the file for duration milliseconds or loops.
+ */
+ private void play(Project project, File file, int loops, Long duration) {
+
+ Clip audioClip = null;
+
+ AudioInputStream audioInputStream = null;
+
+
+ try {
+ audioInputStream = AudioSystem.getAudioInputStream(file);
+ } catch (UnsupportedAudioFileException uafe) {
+ project.log("Audio format is not yet supported: "
+ + uafe.getMessage());
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+
+ if (audioInputStream != null) {
+ AudioFormat format = audioInputStream.getFormat();
+ DataLine.Info info = new DataLine.Info(Clip.class, format,
+ AudioSystem.NOT_SPECIFIED);
+ try {
+ audioClip = (Clip) AudioSystem.getLine(info);
+ audioClip.addLineListener(this);
+ audioClip.open(audioInputStream);
+ } catch (LineUnavailableException e) {
+ project.log("The sound device is currently unavailable");
+ return;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ if (duration != null) {
+ playClip(audioClip, duration.longValue());
+ } else {
+ playClip(audioClip, loops);
+ }
+ audioClip.drain();
+ audioClip.close();
+ } else {
+ project.log("Can't get data from file " + file.getName());
+ }
+ }
+
+ private void playClip(Clip clip, int loops) {
+
+ clip.loop(loops);
+ do {
+ try {
+ long timeLeft =
+ (clip.getMicrosecondLength() - clip.getMicrosecondPosition())
+ / 1000;
+ if (timeLeft > 0) {
+ Thread.sleep(timeLeft);
+ }
+ } catch (InterruptedException e) {
+ break;
+ }
+ } while (clip.isRunning());
+
+ if (clip.isRunning()) {
+ clip.stop();
+ }
+ }
+
+ private void playClip(Clip clip, long duration) {
+ clip.loop(Clip.LOOP_CONTINUOUSLY);
+ try {
+ Thread.sleep(duration);
+ } catch (InterruptedException e) {
+ // Ignore Exception
+ }
+ clip.stop();
+ }
+
+ /**
+ * This is implemented to listen for any line events and closes the
+ * clip if required.
+ * @param event the line event to follow
+ */
+ public void update(LineEvent event) {
+ if (event.getType().equals(LineEvent.Type.STOP)) {
+ Line line = event.getLine();
+ line.close();
+ }
+ }
+
+
+ /**
+ * Fired before any targets are started.
+ * @param event ignored
+ */
+ public void buildStarted(BuildEvent event) {
+ }
+
+ /**
+ * Fired after the last target has finished. This event
+ * will still be thrown if an error occurred during the build.
+ * @param event the build finished event.
+ * @see BuildEvent#getException()
+ */
+ public void buildFinished(BuildEvent event) {
+ if (event.getException() == null && fileSuccess != null) {
+ // build successful!
+ play(event.getProject(), fileSuccess, loopsSuccess, durationSuccess);
+ } else if (event.getException() != null && fileFail != null) {
+ play(event.getProject(), fileFail, loopsFail, durationFail);
+ }
+ }
+
+ /**
+ * Fired when a target is started.
+ * @param event ignored.
+ * @see BuildEvent#getTarget()
+ */
+ public void targetStarted(BuildEvent event) {
+ }
+
+ /**
+ * Fired when a target has finished. This event will
+ * still be thrown if an error occurred during the build.
+ * @param event ignored.
+ * @see BuildEvent#getException()
+ */
+ public void targetFinished(BuildEvent event) {
+ }
+
+ /**
+ * Fired when a task is started.
+ * @param event ignored.
+ * @see BuildEvent#getTask()
+ */
+ public void taskStarted(BuildEvent event) {
+ }
+
+ /**
+ * Fired when a task has finished. This event will still
+ * be throw if an error occurred during the build.
+ * @param event ignored.
+ * @see BuildEvent#getException()
+ */
+ public void taskFinished(BuildEvent event) {
+ }
+
+ /**
+ * Fired whenever a message is logged.
+ * @param event the build event
+ * @see BuildEvent#getMessage()
+ * @see BuildEvent#getPriority()
+ */
+ public void messageLogged(BuildEvent event) {
+ }
+}
+