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.player.IPlayer;
11 import org.rpi.player.events.EventBase;
12 import org.rpi.player.events.EventFinishedCurrentTrack;
13 import org.rpi.player.events.EventMuteChanged;
14 import org.rpi.player.events.EventPlayListPlayingTrackID;
15 import org.rpi.player.events.EventStatusChanged;
16 import org.rpi.player.events.EventTrackChanged;
17 import org.rpi.player.events.EventUpdateTrackMetaText;
18 import org.rpi.player.events.EventVolumeChanged;
19 import org.rpi.playlist.CustomTrack;
20 import org.rpi.radio.parsers.FileParser;
21
22 public class MPDPlayer extends Observable implements IPlayer, Observer {
23
24 private static Logger log = Logger.getLogger(MPDPlayer.class);
25 HashMap<String, CustomTrack> tracks = new HashMap<String, CustomTrack>();
26
27 private TCPConnector tcp = null;
28 private CustomTrack current_track = null;
29 private String current_status = "";
30 private long current_volume = 100;
31 private long mute_volume = 100;
32 private boolean bMute = false;
33 private boolean bStopRequest = false;
34
35 public MPDPlayer() {
36 tcp = new TCPConnector(this);
37 tcp.addObserver(this);
38 List<String> param = new ArrayList<String>();
39 param.add("1");
40 tcp.sendCommand(tcp.createCommand("consume", param));
41 }
42
43 @Override
44 public void preLoadTrack(CustomTrack track) {
45 log.debug("PreLoad Next Track: " + track.getUri());
46 List<String> params = new ArrayList<String>();
47 String url = checkURL(track.getUri());
48 params.add(url);
49 params.add("1");
50 HashMap<String, String> res = tcp.sendCommand(tcp.createCommand("addid", params));
51 if (res.containsKey("Id")) {
52 tracks.put(res.get("Id"), track);
53 }
54 }
55
56 @Override
57 public void loaded() {
58
59
60 }
61
62 @Override
63 public boolean playTrack(CustomTrack track, long volume, boolean mute) {
64 current_track = track;
65 EventStatusChanged ev = new EventStatusChanged();
66 ev.setStatus("Buffering");
67 fireEvent(ev);
68 List<String> commands = new ArrayList<String>();
69 commands.add(tcp.createCommand("clear"));
70 List<String> params = new ArrayList<String>();
71 String url = checkURL(track.getUri());
72 params.add(url);
73 params.add("0");
74 commands.add(tcp.createCommand("addid", params));
75 params.clear();
76 params.add("0");
77 commands.add(tcp.createCommand("play", params));
78 HashMap<String, String> res = tcp.sendCommand(tcp.createCommandList(commands));
79 tracks.clear();
80 if (res.containsKey("Id")) {
81 tracks.put(res.get("Id"), track);
82 }
83 log.debug("ADD TO PLAYLIST" + res.toString());
84 return true;
85 }
86
87 @Override
88 public void openFile(CustomTrack track) {
89
90
91 }
92
93 @Override
94 public void pause(boolean bPause) {
95 List<String> params = new ArrayList<String>();
96 if (bPause) {
97 params.add("1");
98 } else {
99 params.add("0");
100 }
101 tcp.sendCommand(tcp.createCommand("pause", params));
102 }
103
104 @Override
105 public void resume() {
106 pause(false);
107 }
108
109 @Override
110 public void stop() {
111 bStopRequest = true;
112 tcp.sendCommand(tcp.createCommand("stop"));
113
114 }
115
116 @Override
117 public void destroy() {
118 tcp.destroy();
119
120 }
121
122 @Override
123 public void setMute(boolean mute) {
124 bMute = mute;
125 if (mute) {
126 mute_volume = current_volume;
127 setVolumeInternal(0);
128 } else {
129 if (mute_volume == 100) {
130 setVolumeInternal(99);
131 }
132 setVolumeInternal(mute_volume);
133 }
134
135 }
136
137 private void setVolumeInternal(long volume) {
138 List<String> params = new ArrayList<String>();
139 params.add("" + volume);
140 tcp.sendCommand(tcp.createCommand("setvol", params));
141 }
142
143 @Override
144 public void setVolume(long volume) {
145 if (!bMute) {
146 setVolumeInternal(volume);
147 }
148 }
149
150 @Override
151 public void seekAbsolute(long seconds) {
152 List<String> params = new ArrayList<String>();
153 params.add("0");
154 params.add("" + seconds);
155 tcp.sendCommand(tcp.createCommand("seek", params));
156 }
157
158 @Override
159 public void startTrack() {
160
161
162 }
163
164 @Override
165 public boolean isPlaying() {
166 if (current_status.equalsIgnoreCase("PLAYING") || current_status.equalsIgnoreCase("PAUSED")) {
167 return true;
168 }
169 return false;
170 }
171
172 @Override
173 public String getUniqueId() {
174
175 return null;
176 }
177
178 public synchronized void setStatus(String value) {
179 log.warn("DONT DO ANYTHING");
180 }
181
182
183
184
185
186
187
188 public synchronized void updateInfo(String artist, String title) {
189 EventUpdateTrackMetaText ev = new EventUpdateTrackMetaText();
190 ev.setArtist(artist);
191 ev.setTitle(title);
192 fireEvent(ev);
193 }
194
195 public synchronized void fireEvent(EventBase ev) {
196 if (ev instanceof EventVolumeChanged) {
197 EventVolumeChanged e = (EventVolumeChanged) ev;
198 current_volume = e.getVolume();
199 }
200 setChanged();
201 notifyObservers(ev);
202 }
203
204 @Override
205 public void update(Observable arg0, Object obj) {
206 EventBase e = (EventBase) obj;
207 switch (e.getType()) {
208 case EVENTTRACKCHANGED:
209 EventTrackChanged ev = (EventTrackChanged) e;
210 if (tracks.containsKey(ev.getMPD_id())) {
211 CustomTrack t = tracks.get(ev.getMPD_id());
212 removeTrack(ev.getMPD_id());
213 ev.setTrack(t);
214 fireEvent(ev);
215 EventPlayListPlayingTrackID ep = new EventPlayListPlayingTrackID();
216 ep.setId(t.getId());
217 fireEvent(ep);
218 }
219 break;
220 case EVENTCURRENTTRACKFINISHING:
221 fireEvent(e);
222 break;
223 case EVENTSTATUSCHANGED:
224 EventStatusChanged es = (EventStatusChanged) e;
225 log.debug("Status Changed: " + es.getStatus());
226 current_status = es.getStatus();
227 es.setTrack(current_track);
228 if (es.getStatus().equalsIgnoreCase("STOPPED")) {
229 if (!bStopRequest) {
230 bStopRequest = false;
231 EventFinishedCurrentTrack efc = new EventFinishedCurrentTrack();
232 fireEvent(efc);
233 }
234 }
235 else
236 {
237
238 }
239 fireEvent(es);
240 break;
241 case EVENTVOLUMECHANGED:
242 if (!bMute) {
243
244 fireEvent(e);
245 }
246 break;
247 default:
248
249 fireEvent(e);
250 }
251
252 }
253
254 private void removeTrack(String track_id) {
255 try {
256 if (tracks.containsKey(track_id)) {
257 tracks.remove(track_id);
258 }
259 } catch (Exception e) {
260 log.error("Error Remvoing Track: " + track_id, e);
261 }
262 }
263
264
265
266
267
268
269
270 private String checkURL(String url) {
271 FileParser fp = new FileParser();
272 return fp.getURL(url);
273 }
274
275 }