Switch to side-by-side view

--- a/upmpd/avtransport.cxx
+++ b/upmpd/avtransport.cxx
@@ -40,12 +40,13 @@
 #include "avtransport.hxx"
 #include "mpdcli.hxx"
 #include "upmpdutils.hxx"
+#include "ohplaylist.hxx"
 
 static const string sIdTransport("urn:upnp-org:serviceId:AVTransport");
 static const string sTpTransport("urn:schemas-upnp-org:service:AVTransport:1");
 
 UpMpdAVTransport::UpMpdAVTransport(UpMpd *dev)
-    : UpnpService(sTpTransport, sIdTransport, dev), m_dev(dev)
+    : UpnpService(sTpTransport, sIdTransport, dev), m_dev(dev), m_ohp(0)
 {
     m_dev->addActionMapping(this,"SetAVTransportURI", 
                             bind(&UpMpdAVTransport::setAVTransportURI, 
@@ -174,6 +175,24 @@
     status["TransportPlaySpeed"] = "1";
 
     const string& uri = mpds.currentsong.uri;
+
+    // MPD may have switched to the next track, or may be playing
+    // something else altogether if some other client told it to
+    if (!uri.compare(m_nextUri)) {
+        m_uri = m_nextUri;
+        m_curMetadata = m_nextMetadata;
+        m_nextUri.clear();
+        m_nextMetadata.clear();
+    } else if (uri.compare(m_uri)) {
+        // Someone else is controlling mpd. Maybe our own ohplaylist.
+        m_nextMetadata.clear();
+        m_nextUri.clear();
+        m_uri = uri;
+        if (!m_ohp || !m_ohp->cacheFind(uri, m_curMetadata)) {
+            m_curMetadata = didlmake(mpds.currentsong);
+        }
+    }
+
     status["CurrentTrack"] = "1";
     status["CurrentTrackURI"] = uri;
 
@@ -331,6 +350,7 @@
         m_nextUri = uri;
         m_nextMetadata = metadata;
     } else {
+        m_uri = uri;
         m_curMetadata = metadata;
         m_nextUri = "";
         m_nextMetadata = "";