--- a/src/ohreceiver.cxx
+++ b/src/ohreceiver.cxx
@@ -42,9 +42,10 @@
static const string sTpProduct("urn:av-openhome-org:service:Receiver:1");
static const string sIdProduct("urn:av-openhome-org:serviceId:Receiver");
-OHReceiver::OHReceiver(UpMpd *dev, OHPlaylist *pl, OHProduct *pr, int port)
+OHReceiver::OHReceiver(UpMpd *dev, const OHReceiverParams& parms)
: UpnpService(sTpProduct, sIdProduct, dev), m_dev(dev),
- m_pl(pl), m_pr(pr), m_httpport(port)
+ m_pl(parms.pl), m_pr(parms.pr), m_httpport(parms.httpport),
+ m_pm(parms.pm)
{
dev->addActionMapping(this, "Play",
bind(&OHReceiver::play, this, _1, _2));
@@ -68,13 +69,14 @@
bool OHReceiver::makestate(unordered_map<string, string> &st)
{
const MpdStatus &mpds = m_dev->getMpdStatusNoUpdate();
-
- if (m_cmd && mpds.state != MpdStatus::MPDS_PLAY &&
- mpds.state != MpdStatus::MPDS_PAUSE) {
- // playing was stopped through ohplaylist or
- // avtransport. I'm not sure we're supposed to let this
- // happen, but we do. Stop too.
- iStop();
+ if (m_pm == OHReceiverParams::OHRP_MPD) {
+ if (m_cmd && mpds.state != MpdStatus::MPDS_PLAY &&
+ mpds.state != MpdStatus::MPDS_PAUSE) {
+ // playing was stopped through ohplaylist or
+ // avtransport. I'm not sure we're supposed to let this
+ // happen, but we do. Stop too.
+ iStop();
+ }
}
st.clear();
@@ -149,13 +151,16 @@
unordered_map<int, string> urlmap;
string line;
- // We start the songcast command to receive the audio flux and
- // export it as HTTP, then insert http URI at the front of the
- // queue and execute next/play
+ // We start the songcast command to receive the audio flux and either
+ // export it as HTTP (then insert http URI at the front of the
+ // queue and execute next/play), or play it directly to the sound card
if (m_cmd)
m_cmd->zapChild();
m_cmd = shared_ptr<ExecCmd>(new ExecCmd());
vector<string> args;
+ if (m_pm == OHReceiverParams::OHRP_ALSA) {
+ args.push_back("-d");
+ }
args.push_back("-u");
args.push_back(m_uri);
if (!g_configfilename.empty()) {
@@ -172,33 +177,35 @@
} else {
LOGDEB("OHReceiver::play: sc2mpd pid "<< m_cmd->getChildPid()<< endl);
}
- // Wait for sc2mpd to signal ready, then play
- m_cmd->getline(line);
- LOGDEB("OHReceiver: sc2mpd sent: " << line);
-
- // And insert the appropriate uri in the mpd playlist
- if (!m_pl->urlMap(urlmap)) {
- LOGERR("OHReceiver::play: urlMap() failed" <<endl);
- goto out;
- }
- for (auto it = urlmap.begin(); it != urlmap.end(); it++) {
- if (it->second == m_httpuri) {
- id = it->first;
- }
- }
- if (id == -1) {
- ok = m_pl->insertUri(0, m_httpuri, SoapHelp::xmlUnquote(m_metadata),
- &id);
+
+ if (m_pm == OHReceiverParams::OHRP_MPD) {
+ // Wait for sc2mpd to signal ready, then play
+ m_cmd->getline(line);
+ LOGDEB("OHReceiver: sc2mpd sent: " << line);
+ // And insert the appropriate uri in the mpd playlist
+ if (!m_pl->urlMap(urlmap)) {
+ LOGERR("OHReceiver::play: urlMap() failed" <<endl);
+ goto out;
+ }
+ for (auto it = urlmap.begin(); it != urlmap.end(); it++) {
+ if (it->second == m_httpuri) {
+ id = it->first;
+ }
+ }
+ if (id == -1) {
+ ok = m_pl->insertUri(0, m_httpuri, SoapHelp::xmlUnquote(m_metadata),
+ &id);
+ if (!ok) {
+ LOGERR("OHReceiver::play: insertUri() failed\n");
+ goto out;
+ }
+ }
+
+ ok = m_dev->m_mpdcli->playId(id);
if (!ok) {
- LOGERR("OHReceiver::play: insertUri() failed\n");
+ LOGERR("OHReceiver::play: play() failed\n");
goto out;
}
- }
-
- ok = m_dev->m_mpdcli->playId(id);
- if (!ok) {
- LOGERR("OHReceiver::play: play() failed\n");
- goto out;
}
out:
@@ -206,11 +213,13 @@
iStop();
}
maybeWakeUp(ok);
+ LOGDEB("OHReceiver::play: returning\n");
return ok ? UPNP_E_SUCCESS : UPNP_E_INTERNAL_ERROR;
}
bool OHReceiver::iStop()
{
+ LOGDEB("OHReceiver::iStop()\n");
if (m_cmd) {
m_cmd->zapChild();
m_cmd = shared_ptr<ExecCmd>(0);