--- a/src/ohreceiver.cxx
+++ b/src/ohreceiver.cxx
@@ -44,8 +44,7 @@
OHReceiver::OHReceiver(UpMpd *dev, const OHReceiverParams& parms)
: UpnpService(sTpProduct, sIdProduct, dev), m_dev(dev),
- m_pl(parms.pl), m_pr(parms.pr), m_httpport(parms.httpport),
- m_pm(parms.pm)
+ m_httpport(parms.httpport), m_pm(parms.pm)
{
dev->addActionMapping(this, "Play",
bind(&OHReceiver::play, this, _1, _2));
@@ -135,22 +134,21 @@
m_dev->loopWakeup();
}
-int OHReceiver::play(const SoapIncoming& sc, SoapOutgoing& data)
-{
- LOGDEB("OHReceiver::play" << endl);
+bool OHReceiver::iPlay()
+{
bool ok = false;
- if (!m_pl) {
+ if (!m_dev->m_ohpl) {
LOGERR("OHReceiver::play: no playlist service" << endl);
- return UPNP_E_INTERNAL_ERROR;
+ return false;
}
if (m_uri.empty()) {
LOGERR("OHReceiver::play: no uri" << endl);
- return UPNP_E_INTERNAL_ERROR;
+ return false;
}
if (m_metadata.empty()) {
LOGERR("OHReceiver::play: no metadata" << endl);
- return UPNP_E_INTERNAL_ERROR;
+ return false;
}
m_dev->m_mpdcli->stop();
@@ -192,12 +190,13 @@
// it gets there, which should be more or less instantaneous
int timeo = 15;
if (m_cmd->getline(line, timeo) < 0) {
- LOGERR("OHReceiver: mpd mode: sc2mpd still not ready to play after " << timeo << " seconds\n");
+ LOGERR("OHReceiver: mpd mode: sc2mpd still not ready to play after "
+ << timeo << " seconds\n");
goto out;
}
LOGDEB("OHReceiver: sc2mpd sent: " << line);
// And insert the appropriate uri in the mpd playlist
- if (!m_pl->urlMap(urlmap)) {
+ if (!m_dev->m_ohpl->urlMap(urlmap)) {
LOGERR("OHReceiver::play: urlMap() failed" <<endl);
goto out;
}
@@ -207,8 +206,8 @@
}
}
if (id == -1) {
- ok = m_pl->insertUri(0, m_httpuri, SoapHelp::xmlUnquote(m_metadata),
- &id);
+ ok = m_dev->m_ohpl->insertUri(0, m_httpuri,
+ SoapHelp::xmlUnquote(m_metadata),&id);
if (!ok) {
LOGERR("OHReceiver::play: insertUri() failed\n");
goto out;
@@ -227,7 +226,15 @@
iStop();
}
maybeWakeUp(ok);
- LOGDEB("OHReceiver::play: returning\n");
+ return ok;
+}
+
+int OHReceiver::play(const SoapIncoming& sc, SoapOutgoing& data)
+{
+ LOGDEB("OHReceiver::play" << endl);
+ bool ok = iPlay();
+ if (ok && m_dev->m_ohpr)
+ m_dev->m_ohpr->iSetSourceIndexByName("Receiver");
return ok ? UPNP_E_SUCCESS : UPNP_E_INTERNAL_ERROR;
}
@@ -242,9 +249,8 @@
unordered_map<int, string> urlmap;
// Remove our bogus URi from the playlist
- if (!m_pl->urlMap(urlmap)) {
+ if (!m_dev->m_ohpl->urlMap(urlmap)) {
LOGERR("OHReceiver::stop: urlMap() failed" <<endl);
- return false;
}
for (auto it = urlmap.begin(); it != urlmap.end(); it++) {
if (it->second == m_httpuri) {
@@ -257,36 +263,42 @@
// another CP could just set it to what it wants, but Bubble at
// least won't do a thing with the renderer as long as the source
// is set to receiver.
- if (m_pr)
- m_pr->iSetSourceIndex(0);
-
+ if (m_dev->m_ohpr)
+ m_dev->m_ohpr->iSetSourceIndexByName("Playlist");
+
+ maybeWakeUp(true);
return true;
}
int OHReceiver::stop(const SoapIncoming& sc, SoapOutgoing& data)
{
LOGDEB("OHReceiver::stop" << endl);
- bool ok = iStop();
- maybeWakeUp(ok);
- return ok ? UPNP_E_SUCCESS : UPNP_E_INTERNAL_ERROR;
-}
-
-int OHReceiver::setSender(const SoapIncoming& sc, SoapOutgoing& data)
-{
- LOGDEB("OHReceiver::setSender" << endl);
- string uri, metadata;
- bool ok = sc.get("Uri", &uri) && sc.get("Metadata", &metadata);
-
+ return iStop() ? UPNP_E_SUCCESS : UPNP_E_INTERNAL_ERROR;
+}
+
+bool OHReceiver::iSetSender(const string& uri, const string& metadata)
+{
// Only do something if data changes, and then first stop any
// current playing. We probably should not receive this if we're
// not in the stopped state, but just in case...
- if (ok && (m_uri.compare(uri) || m_metadata.compare(metadata))) {
+ if (m_uri.compare(uri) || m_metadata.compare(metadata)) {
if (m_cmd)
iStop();
m_uri = uri;
m_metadata = metadata;
LOGDEB("OHReceiver::setSender: uri [" << m_uri << "] meta [" <<
m_metadata << "]" << endl);
+ }
+ return true;
+}
+
+int OHReceiver::setSender(const SoapIncoming& sc, SoapOutgoing& data)
+{
+ LOGDEB("OHReceiver::setSender" << endl);
+ string uri, metadata;
+ bool ok = sc.get("Uri", &uri) && sc.get("Metadata", &metadata);
+ if (ok) {
+ ok = iSetSender(uri, metadata);
}
maybeWakeUp(ok);