package com.jbidwatcher.util.services; /* * Copyright (c) 2000-2007, CyberFOX Software, Inc. All Rights Reserved. * * Developed by mrs (Morgan Schweers) */ import javazoom.jl.player.advanced.*; import com.jbidwatcher.util.Constants; import com.jbidwatcher.util.queue.SuperQueue; import com.jbidwatcher.util.queue.MessageQueue; import com.jbidwatcher.util.queue.MQFactory; import com.jbidwatcher.util.config.JConfig; import java.io.BufferedInputStream; import java.io.InputStream; import java.net.URL; import java.util.HashMap; import java.util.Map; public class AudioPlayer implements MessageQueue.Listener { private final Map<Integer, AdvancedPlayer> lastPlayer; private Integer track; private static int MAX_AUDIO_CLIP = 10; private AudioPlayer() { track = 0; lastPlayer = new HashMap<Integer, AdvancedPlayer>(); } public void messageAction(Object deQ) { final String s=(String)deQ; if(JConfig.queryConfiguration("sound.max_clip") != null) { MAX_AUDIO_CLIP = Integer.parseInt(JConfig.queryConfiguration("sound.max_clip")); } // Format is 'STOP #' where '#' is the track number to stop. if (s.startsWith("STOP")) { String stopTrackStr = s.substring(5); Integer stopTrack = Integer.parseInt(stopTrackStr); synchronized (lastPlayer) { if(lastPlayer.get(stopTrack) != null) { lastPlayer.get(stopTrack).stop(); } } return; } track++; SuperQueue sq = SuperQueue.getInstance(); long now = System.currentTimeMillis(); sq.preQueue("STOP " + track, "sfx", now + (Constants.ONE_SECOND * MAX_AUDIO_CLIP)); final Integer current_track = track; // Play the stream we've chosen. new Thread(new Runnable() { public void run() { InputStream fin; // Try to figure out the stream to play. try { URL playme = JConfig.getResource(s); fin = playme.openStream(); } catch (Exception badResource) { fin = JConfig.bestSource(JConfig.class.getClassLoader(), s); } try { BufferedInputStream bin = new BufferedInputStream(fin); final AdvancedPlayer p = new AdvancedPlayer(bin); lastPlayer.put(current_track, p); // Mark it so we won't call stop if the playback already completed. p.setPlayBackListener(new PlaybackListener() { @Override public void playbackStarted(PlaybackEvent playbackEvent) { } @Override public void playbackFinished(PlaybackEvent playbackEvent) { synchronized (lastPlayer) { lastPlayer.remove(current_track); } } }); // This may block until it's done. p.play(); } catch (Exception mp3Exception) { JConfig.log().handleException("Failed to play.", mp3Exception); synchronized (lastPlayer) { lastPlayer.remove(current_track); } } } }).start(); } public static void start() { MQFactory.getConcrete("sfx").registerListener(new AudioPlayer()); } }