package org.buzztroll.mud; import java.applet.Applet; import java.applet.AudioClip; import java.net.URL; import javax.swing.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.sound.sampled.*; class PlayMessageTransformer extends MessageTransformer { protected String matchString; protected int position; protected String url; protected Clip clip; protected static Object sem = new Object(); protected static PlayQueue queue; public PlayMessageTransformer() { } public PlayMessageTransformer(String match, int pos, String url) { this.position = pos; this.matchString = match; this.url = url; } public DisplayMessage transform(DisplayMessage msg) { if(stringMatch(this.position, msg.getString(), this.matchString)) { try { if (clip == null) { AudioInputStream stream = AudioSystem.getAudioInputStream(new URL(url)); AudioFormat format = stream.getFormat(); // Create the clip DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), ((int)stream.getFrameLength()*format.getFrameSize())); clip = (Clip) AudioSystem.getLine(info); clip.addLineListener(new LineListener() { public void update(LineEvent event) { LineEvent.Type type = event.getType(); if (type == LineEvent.Type.STOP) { synchronized(sem) { sem.notify(); } } } }); // This method does not return until the audio file is completely loaded clip.open(stream); } } catch (Exception e) { e.printStackTrace(); return msg; } if (queue == null) { queue = new PlayQueue(); queue.start(); } queue.queue(clip); /* try { File sf = new File( try { AudioClip au = Applet.newAudioClip(new URL(url)); au.play(); } catch (Exception e) { e.printStackTrace(); } */ } return msg; } public JComponent getRendererComponent() { StringBuffer buf = new StringBuffer(); buf.append("Play '").append(this.url); buf.append("' sound when message "); if(this.position == CONTAINS) { buf.append("contains "); } else if(this.position == ENDS_WITH) { buf.append("ends with "); } else if(position == STARTS_WITH) { buf.append("starts with "); } buf.append("'").append(this.matchString).append("'"); JLabel jl = new JLabel(buf.toString()); return jl; } public Element createDoc(Document doc) throws Exception { Element base = doc.createElement("play"); base.setAttribute("match", this.matchString); base.setAttribute("position", new Integer(position).toString()); base.setAttribute("url", this.url); return base; } public void parse(Element base) { this.matchString = base.getAttribute("match"); this.url = base.getAttribute("url"); this.position = new Integer(base.getAttribute("position")).intValue(); System.out.println(this.matchString + ":" + this.url +":"+this.position); } class PlayQueue extends Queue { public void execute(Object tmp) { Clip clip = (Clip)tmp; clip.setFramePosition(0); clip.start(); synchronized(sem) { try { sem.wait(); } catch (Exception e) { } } } } }