diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/SoundTask.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/SoundTask.java | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/SoundTask.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/SoundTask.java new file mode 100644 index 00000000..dfb6e69a --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/sound/SoundTask.java @@ -0,0 +1,193 @@ +/* + * 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; + +import java.io.File; +import java.util.Random; +import java.util.Vector; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; + +/** + * Plays a sound file at the end of the build, according to whether the build failed or succeeded. + * + * There are three attributes to be set: + * + * <code>source</code>: the location of the audio file to be played + * <code>duration</code>: play the sound file continuously until "duration" milliseconds has expired + * <code>loops</code>: the number of times the sound file should be played until stopped + * + * I have only tested this with .WAV and .AIFF sound file formats. Both seem + * to work fine. + * + * plans for the future: + * - use the midi api to define sounds (or drum beat etc) in xml and have + * Ant play them back + * + */ + +public class SoundTask extends Task { + + private BuildAlert success = null; + private BuildAlert fail = null; + + /** + * add a sound when the build succeeds + * @return a BuildAlert to be configured + */ + public BuildAlert createSuccess() { + success = new BuildAlert(); + return success; + } + + /** + * add a sound when the build fails + * @return a BuildAlert to be configured + */ + public BuildAlert createFail() { + fail = new BuildAlert(); + return fail; + } + + /** Constructor for SoundTask. */ + public SoundTask() { + } + + /** + * Initialize the task. + */ + public void init() { + } + + /** + * Execute the task. + */ + public void execute() { + + AntSoundPlayer soundPlayer = new AntSoundPlayer(); + + if (success == null) { + log("No nested success element found.", Project.MSG_WARN); + } else { + soundPlayer.addBuildSuccessfulSound(success.getSource(), + success.getLoops(), success.getDuration()); + } + + if (fail == null) { + log("No nested failure element found.", Project.MSG_WARN); + } else { + soundPlayer.addBuildFailedSound(fail.getSource(), + fail.getLoops(), fail.getDuration()); + } + + getProject().addBuildListener(soundPlayer); + + } + + /** + * A class to be extended by any BuildAlert's that require the output + * of sound. + */ + public class BuildAlert { + private File source = null; + private int loops = 0; + private Long duration = null; + + /** + * Sets the duration in milliseconds the file should be played; optional. + * @param duration the duration in milliseconds + */ + public void setDuration(Long duration) { + this.duration = duration; + } + + /** + * Sets the location of the file to get the audio; required. + * + * @param source the name of a sound-file directory or of the audio file + */ + public void setSource(File source) { + this.source = source; + } + + /** + * Sets the number of times the source file should be played; optional. + * + * @param loops the number of loops to play the source file + */ + public void setLoops(int loops) { + this.loops = loops; + } + + /** + * Gets the location of the file to get the audio. + * @return the file location + */ + public File getSource() { + File nofile = null; + // Check if source is a directory + if (source.exists()) { + if (source.isDirectory()) { + // get the list of files in the dir + String[] entries = source.list(); + Vector files = new Vector(); + for (int i = 0; i < entries.length; i++) { + File f = new File(source, entries[i]); + if (f.isFile()) { + files.addElement(f); + } + } + if (files.size() < 1) { + throw new BuildException("No files found in directory " + source); + } + int numfiles = files.size(); + // get a random number between 0 and the number of files + Random rn = new Random(); + int x = rn.nextInt(numfiles); + // set the source to the file at that location + this.source = (File) files.elementAt(x); + } + } else { + log(source + ": invalid path.", Project.MSG_WARN); + this.source = nofile; + } + return this.source; + } + + /** + * Sets the number of times the source file should be played. + * + * @return the number of loops to play the source file + */ + public int getLoops() { + return this.loops; + } + + /** + * Gets the duration in milliseconds the file should be played. + * @return the duration in milliseconds + */ + public Long getDuration() { + return this.duration; + } + } +} + |