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 }