View Javadoc

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  		// TODO Auto-generated method stub
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  		// TODO Auto-generated method stub
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 		// TODO Auto-generated method stub
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 		// TODO Auto-generated method stub
175 		return null;
176 	}
177 
178 	public synchronized void setStatus(String value) {
179 		log.warn("DONT DO ANYTHING");
180 	}
181 
182 	/***
183 	 * Used by the ICY info to update the track being played on the Radio
184 	 * 
185 	 * @param artist
186 	 * @param title
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 				// If we are not on Mute forward the change of volume
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 	 * MPD Player will not play .pls,.m3u or .asx so we check here first
266 	 * 
267 	 * @param url
268 	 * @return
269 	 */
270 	private String checkURL(String url) {
271 		FileParser fp = new FileParser();
272 		return fp.getURL(url);
273 	}
274 
275 }