1 package org.rpi.mpdplayer; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Observable; 7 import java.util.Observer; 8 9 import org.apache.log4j.Logger; 10 import org.rpi.config.Config; 11 import org.rpi.mplayer.TrackInfo; 12 import org.rpi.player.events.EventBase; 13 import org.rpi.player.events.EventCurrentTrackFinishing; 14 import org.rpi.player.events.EventDurationUpdate; 15 import org.rpi.player.events.EventStatusChanged; 16 import org.rpi.player.events.EventTimeUpdate; 17 import org.rpi.player.events.EventTrackChanged; 18 import org.rpi.player.events.EventUpdateTrackMetaText; 19 import org.rpi.player.events.EventVolumeChanged; 20 21 public class StatusMonitor extends Observable implements Runnable, Observer { 22 23 private static Logger log = Logger.getLogger(StatusMonitor.class); 24 25 private TCPConnector tcp = null; 26 private boolean isRunning = true; 27 private boolean sentFinishingEvent = false; 28 29 private String current_songid = ""; 30 private String current_state = ""; 31 private String current_time = ""; 32 private String current_duration = ""; 33 private String current_title = ""; 34 private String current_artist = ""; 35 private String current_volume = ""; 36 private String current_genre = ""; 37 38 private TrackInfo ti = null; 39 40 public StatusMonitor(TCPConnector tcp) { 41 this.tcp = tcp; 42 ti = new TrackInfo(); 43 ti.addObserver(this); 44 } 45 46 @Override 47 public void run() { 48 int iCount = 0; 49 while (isRunning()) { 50 List<String> commands = new ArrayList<String>(); 51 commands.add(tcp.createCommand("status")); 52 commands.add(tcp.createCommand("currentsong")); 53 boolean bSongChanged = false; 54 HashMap<String, String> res = tcp.sendCommand(tcp.createCommandList(commands)); 55 String value = ""; 56 value = res.get("songid"); 57 if (value != null && !current_songid.equalsIgnoreCase(value)) { 58 log.debug("Song Changed From : " + current_songid + " To: " + value); 59 EventTrackChanged ev = new EventTrackChanged(); 60 ev.setMPD_id(value); 61 fireEvent(ev); 62 current_songid = value; 63 sentFinishingEvent = false; 64 bSongChanged = true; 65 66 } 67 value = res.get("state"); 68 if (value != null) { 69 if (value.equalsIgnoreCase("PLAY")) { 70 value = "Playing"; 71 } else if (value.equalsIgnoreCase("STOP")) { 72 value = "Stopped"; 73 } else if (value.equalsIgnoreCase("PAUSE")) { 74 value = "Paused"; 75 } 76 if (value != null && !current_state.equalsIgnoreCase(value)) { 77 log.debug("Status Changed From : " + current_state + " To: " + value); 78 current_state = value; 79 setStatus(value); 80 } else { 81 if (bSongChanged) { 82 if (value != null) { 83 setStatus(value); 84 } 85 } 86 } 87 } 88 value = res.get("time"); 89 if (value != null) { 90 String[] splits = value.split(":"); 91 String mTime = splits[0]; 92 String mDuration = splits[1]; 93 long lDuration = 0; 94 long lTime = 0; 95 lDuration = Long.valueOf(mDuration).longValue(); 96 if (mTime != null && !current_time.equalsIgnoreCase(mTime)) { 97 EventTimeUpdate e = new EventTimeUpdate(); 98 lTime = Long.valueOf(mTime).longValue(); 99 e.setTime(lTime); 100 fireEvent(e); 101 current_time = mTime; 102 } 103 104 if (mDuration != null && !current_duration.equalsIgnoreCase(mDuration)) { 105 EventDurationUpdate e = new EventDurationUpdate(); 106 e.setDuration(lDuration); 107 fireEvent(e); 108 current_duration = mDuration; 109 } 110 111 if (lTime > 0 && lDuration > 0) { 112 if ((lDuration - lTime) < Config.mpd_preload_timer) { 113 if (!sentFinishingEvent) { 114 EventCurrentTrackFinishing ev = new EventCurrentTrackFinishing(); 115 fireEvent(ev); 116 sentFinishingEvent = true; 117 } 118 } 119 } 120 } 121 String volume = res.get("volume"); 122 if (volume != null) { 123 if (!current_volume.equalsIgnoreCase(volume)) { 124 EventVolumeChanged ev = new EventVolumeChanged(); 125 long l = Long.valueOf(volume).longValue(); 126 ev.setVolume(l); 127 fireEvent(ev); 128 current_volume = volume; 129 } 130 } 131 String full_title = res.get("Title"); 132 if (full_title != null && !current_title.equalsIgnoreCase(full_title)) { 133 EventUpdateTrackMetaText ev = new EventUpdateTrackMetaText(); 134 ev.setTitle(full_title); 135 fireEvent(ev); 136 current_title = full_title; 137 } 138 String artist = res.get("Artist"); 139 if (artist != null && !current_artist.equalsIgnoreCase(artist)) { 140 EventUpdateTrackMetaText ev = new EventUpdateTrackMetaText(); 141 ev.setTitle(artist); 142 fireEvent(ev); 143 current_artist = artist; 144 } 145 String genre = res.get("Genre"); 146 if (genre != null && !current_genre.equalsIgnoreCase(genre)) { 147 EventUpdateTrackMetaText ev = new EventUpdateTrackMetaText(); 148 ev.setTitle(genre); 149 fireEvent(ev); 150 current_genre = genre; 151 } 152 153 if (bSongChanged) { 154 ti.setUpdated(false); 155 } 156 String audio = res.get("audio"); 157 if (audio != null) { 158 if (!ti.isUpdated() || iCount > 5) { 159 160 if (iCount > 5) { 161 ti.setUpdated(false); 162 iCount = 0; 163 } 164 String[] splits = audio.split(":"); 165 try { 166 String sample = splits[0]; 167 long sr = Long.valueOf(sample).longValue(); 168 ti.setSampleRate(sr); 169 ti.setCodec(" "); 170 long duration = Long.valueOf(current_duration).longValue(); 171 ti.setDuration(duration); 172 if (splits.length > 1) { 173 String depth = splits[1]; 174 long dep = Long.valueOf(depth).longValue(); 175 ti.setBitDepth(dep); 176 ti.setCodec("" + dep + " bits"); 177 } 178 } catch (Exception e) { 179 180 } 181 } 182 183 if (res.containsKey("bitrate")) { 184 String bitrate = res.get("bitrate"); 185 try { 186 long br = Long.valueOf(bitrate).longValue(); 187 ti.setBitrate(br); 188 } catch (Exception e) { 189 190 } 191 } 192 if (ti.isSet()) { 193 ti.setUpdated(true); 194 } 195 iCount++; 196 } 197 198 try { 199 Thread.sleep(1000); 200 } catch (InterruptedException e) { 201 log.error(e); 202 } 203 } 204 205 } 206 207 208 public boolean isRunning() { 209 return isRunning; 210 } 211 212 public void setRunning(boolean isRunning) { 213 this.isRunning = isRunning; 214 } 215 216 public synchronized void setStatus(String value) { 217 EventStatusChanged ev = new EventStatusChanged(); 218 ev.setStatus(value); 219 fireEvent(ev); 220 } 221 222 private void fireEvent(EventBase ev) { 223 setChanged(); 224 notifyObservers(ev); 225 } 226 227 @Override 228 public void update(Observable o, Object evt) { 229 EventBase e = (EventBase) evt; 230 fireEvent(e); 231 } 232 }