--- a
+++ b/sc2src/songcastreceiver.h
@@ -0,0 +1,83 @@
+/* Copyright (C) 2018 J.F.Dockes
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the
+ *   Free Software Foundation, Inc.,
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef WITH_OHBUILD
+#include "Debug.h"
+#include "OhmReceiver.h"
+#else
+#include <OpenHome/OhmReceiver.h>
+#include <OpenHome/OhSongcast/Debug.h>
+#endif
+
+#include "audiodecoder.h"
+#include "chrono.h"
+#include "rcvqueue.h"
+
+using namespace OpenHome;
+using namespace OpenHome::Av;
+
+class SongcastReceiver : public IOhmReceiverDriver, public IOhmMsgProcessor {
+public:
+   SongcastReceiver(AudioEater* eater, AudioEater::Context *ctxt);
+   ~SongcastReceiver();
+
+   virtual TBool IsConnected();
+private:
+   // IOhmReceiverDriver
+   virtual void Add(OhmMsg& aMsg);
+   virtual void Timestamp(OhmMsg& aMsg);
+   virtual void Started();
+   virtual void Connected();
+   virtual void Playing();
+   virtual void Disconnected();
+   virtual void Stopped();
+
+   // IOhmMsgProcessor
+   virtual void Process(OhmMsgAudio& aMsg);
+   virtual void Process(OhmMsgTrack& aMsg);
+   virtual void Process(OhmMsgMetatext& aMsg);
+
+private:
+   // Debug, stats, etc while we get to understand the Songcast streams
+   class Observer {
+   public:
+       TBool iReset;
+       TUint iCount;
+       TUint iFrame;
+       int dumpfd;
+       Chrono chron;
+       Observer() : iReset(true), iCount(0), iFrame(0), dumpfd(-1) {
+#if 0
+           dumpfd = 
+               open("/y/av/tmp/sc2dump", O_WRONLY|O_CREAT|O_TRUNC, 0666);
+           if (dumpfd < 0) {
+               LOGERR("SongcastReceiver::Open dump file failed\n");
+           }
+#endif
+       }
+
+       void reset() {
+           iReset = true;
+       }
+
+       void process(OhmMsgAudio& aMsg);
+   };
+    Observer m_obs;
+    AudioDecoder *m_decoder{nullptr};
+    AudioEater *m_eater;
+    TBool iConnected;
+};