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.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 }