From 3f17073fec1517c2553745e86536cfd6726153f3 Mon Sep 17 00:00:00 2001 From: mdb Date: Sun, 3 Mar 2002 17:21:29 +0000 Subject: [PATCH] Added mechanism for reporting the "playing" state of the music server. Automatically query the playing state after requesting a command that is likely to modify it. git-svn-id: https://samskivert.googlecode.com/svn/trunk@632 6335cc39-0255-0410-8fd6-9bcaacd3b74c --- .../src/java/robodj/util/ServerControl.java | 99 ++++++++++++++++++- 1 file changed, 96 insertions(+), 3 deletions(-) diff --git a/projects/robodj/src/java/robodj/util/ServerControl.java b/projects/robodj/src/java/robodj/util/ServerControl.java index 57ea277a..b429969c 100644 --- a/projects/robodj/src/java/robodj/util/ServerControl.java +++ b/projects/robodj/src/java/robodj/util/ServerControl.java @@ -1,5 +1,5 @@ // -// $Id: ServerControl.java,v 1.4 2002/02/22 08:37:34 mdb Exp $ +// $Id: ServerControl.java,v 1.5 2002/03/03 17:21:29 mdb Exp $ package robodj.util; @@ -7,6 +7,9 @@ import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.StringTokenizer; +import javax.swing.SwingUtilities; + +import com.samskivert.util.StringUtil; import robodj.Log; @@ -15,7 +18,24 @@ import robodj.Log; * network interface. */ public class ServerControl + implements Runnable { + /** + * Used to report changes to the playing song. + */ + public static interface PlayingListener + { + /** + * Called when the playing song is known to have changed to the + * specified songid. + * + * @param songid the id of the song that's playing or -1 if + * nothing is playing. + * @param paused true if the music daemon is paused. + */ + public void playingUpdated (int songid, boolean paused); + } + public ServerControl (String host, int port) throws IOException { @@ -27,19 +47,32 @@ public class ServerControl _out = new PrintWriter(_conn.getOutputStream()); } + public void addPlayingListener (PlayingListener listener) + { + _listeners.add(listener); + } + + public void removePlayingListener (PlayingListener listener) + { + _listeners.remove(listener); + } + public void pause () { sendCommand("PAUSE"); + refreshPlaying(); } public void play () { sendCommand("PLAY"); + refreshPlaying(); } public void stop () { sendCommand("STOP"); + refreshPlaying(); } public void clear () @@ -47,9 +80,16 @@ public class ServerControl sendCommand("CLEAR"); } + public void back () + { + sendCommand("BACK"); + refreshPlaying(); + } + public void skip () { sendCommand("SKIP"); + refreshPlaying(); } public void append (int eid, int sid, String trackPath) @@ -60,21 +100,48 @@ public class ServerControl public void remove (int sid) { sendCommand("REMOVE " + sid); + refreshPlaying(); } public void removeGroup (int sid, int count) { sendCommand("REMOVEGRP " + sid + " " + count); + refreshPlaying(); } public void skipto (int sid) { sendCommand("SKIPTO " + sid); + refreshPlaying(); } - public String getPlaying () + public int getPlaying () { - return sendCommand("PLAYING"); + refreshPlaying(); + return _playingSongId; + } + + public void refreshPlaying () + { + String playing = sendCommand("PLAYING"); + + // figure out if we're paused + _paused = (playing.indexOf("paused") != -1); + + // figure out what song is playing + playing = StringUtil.split(playing, ":")[1].trim(); + _playingSongId = -1; + if (!playing.equals("")) { + try { + _playingSongId = Integer.parseInt(playing); + } catch (NumberFormatException nfe) { + Log.warning("Unable to parse currently playing id '" + + playing + "'."); + } + } + + // let our listeners know about the new info + SwingUtilities.invokeLater(this); } public String[] getPlaylist () @@ -114,6 +181,22 @@ public class ServerControl return plist; } + public void run () + { + // notify our playing listeners + for (int i = 0; i < _listeners.size(); i++) { + PlayingListener listener = (PlayingListener)_listeners.get(i); + try { + listener.playingUpdated(_playingSongId, _paused); + } catch (Exception e) { + Log.warning("PlayingListener choked during update " + + "[listener=" + listener + + ", songid=" + _playingSongId + "]."); + Log.logStackTrace(e); + } + } + } + protected String sendCommand (String command) { try { @@ -133,4 +216,14 @@ public class ServerControl protected Socket _conn; protected PrintWriter _out; protected BufferedReader _in; + + /** A list of entities that are informed when the playing song + * changes. */ + protected ArrayList _listeners = new ArrayList(); + + /** The most recently fetched playing song id. */ + protected int _playingSongId; + + /** The most recently fetched paused state. */ + protected boolean _paused; }