]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Stream end detection
authorChris Tallon <chris@vomp.tv>
Tue, 6 May 2008 21:00:37 +0000 (21:00 +0000)
committerChris Tallon <chris@vomp.tv>
Tue, 6 May 2008 21:00:37 +0000 (21:00 +0000)
playerliveradio.cc
playerliveradio.h
playerlivetv.cc
playerlivetv.h
vdr.cc
vdr.h
vdrresponsepacket.cc
vdrresponsepacket.h

index cafd5392b91f7970d0847819e06dc72cebe72388..7a271126bce19524aaf57a3a4d8f6d4f9ad3ce22 100644 (file)
@@ -148,7 +148,7 @@ void PlayerLiveRadio::call(void* caller)
 
 // -----------------------------------
 
-void PlayerLiveRadio::streamReceive(void* data, ULONG len)
+void PlayerLiveRadio::streamReceive(ULONG flag, void* data, ULONG len)
 {
   if (streamChunks.size() < 11)
   {
index 97e29fbf21e9350279ed18373d187833351653ba..abf91451ddc66483e185577b51b73a9bf2c55b88 100644 (file)
@@ -68,7 +68,7 @@ class PlayerLiveRadio : public PlayerLive, public Thread_TYPE, public Callback,
 
     void call(void*); // for callback interface
 
-    virtual void streamReceive(void*, ULONG); // stream receiver interface
+    virtual void streamReceive(ULONG, void*, ULONG); // stream receiver interface
     
     // Player events
 
index 16fef2dde88a9742aa22e406702437dc288e9724..982bf6d85f80282d466fd64f2ad5e1e96c641585 100644 (file)
@@ -210,8 +210,14 @@ void PlayerLiveTV::call(void* caller)
 
 // -----------------------------------
 
-void PlayerLiveTV::streamReceive(void* data, ULONG len)
+void PlayerLiveTV::streamReceive(ULONG flag, void* data, ULONG len)
 {
+  // Flag:
+  // 0 = normal stream packet
+  // 1 = stream end
+
+  logger->log("PlayerLiveTV", Log::DEBUG, "Received a streamchunk from VDR, flag = %lu", flag);
+
   if (streamChunks.size() < 11)
   {
     StreamChunk s;
index c06a55b8fdce1def2b7f6152975a98bf6b6230db..c82e37d99b23c3dba953248cea9bc95af2c7ebe6 100644 (file)
@@ -70,7 +70,7 @@ class PlayerLiveTV : public PlayerLive, public Thread_TYPE, public Callback, pub
 
     void call(void*); // for callback interface
 
-    virtual void streamReceive(void*, ULONG); // stream receiver interface
+    virtual void streamReceive(ULONG, void*, ULONG); // stream receiver interface
     
     // Player events
 
diff --git a/vdr.cc b/vdr.cc
index 1c1fe83de74e1c313833c25b2e50a0879501202f..33632e8727b9ef5e46495a195bc9b2be0f8be2af 100644 (file)
--- a/vdr.cc
+++ b/vdr.cc
@@ -43,6 +43,7 @@ VDR::VDR()
   connected = false;
   maxChannelNumber = 0;
   channelNumberWidth = 1;
+  TEMP_SINGLE_VDR_PR = NULL;
 }
 
 VDR::~VDR()
@@ -190,6 +191,7 @@ void VDR::threadMethod()
   UCHAR* userData;
 
   ULONG streamID;
+  ULONG flag;
 
   VDR_ResponsePacket* vresp;
   
@@ -236,6 +238,10 @@ void VDR::threadMethod()
     {
       if (!tcp->readData((UCHAR*)&streamID, sizeof(ULONG))) break;
       streamID = ntohl(streamID);
+
+      if (!tcp->readData((UCHAR*)&flag, sizeof(ULONG))) break;
+      flag = ntohl(flag);
+
       if (!tcp->readData((UCHAR*)&userDataLength, sizeof(ULONG))) break; 
       userDataLength = ntohl(userDataLength);
       if (userDataLength > 0)
@@ -248,8 +254,8 @@ void VDR::threadMethod()
       {
         userData = NULL;
       }
-      vresp->setStream(streamID, userData, userDataLength);
-      Log::getInstance()->log("VDR", Log::DEBUG, "Rxd a stream packet, streamID=%lu, len=%lu", streamID, userDataLength);
+      vresp->setStream(streamID, flag, userData, userDataLength);
+      Log::getInstance()->log("VDR", Log::DEBUG, "Rxd a stream packet, streamID=%lu, flag=%lu, len=%lu", streamID, flag, userDataLength);
     }
     else
     {
@@ -355,7 +361,7 @@ bool VDR_PacketReceiver::call(void* userTag)
   {
     // It's a stream packet.
     VDR_ResponsePacket* vresp = (VDR_ResponsePacket*)userTag;
-    streamReceiver->streamReceive(vresp->getUserData(), vresp->getUserDataLength());
+    streamReceiver->streamReceive(vresp->getFlag(), vresp->getUserData(), vresp->getUserDataLength());
     delete vresp;
     return false;
   }
@@ -554,11 +560,12 @@ int VDR::streamChannel(ULONG number, StreamReceiver* tstreamReceiver)
   if (!vrp.addULONG(number)) return 0;
   
   
-  VDR_PacketReceiver* vdrpr = new VDR_PacketReceiver(); // FIXME - leaked
+  VDR_PacketReceiver* vdrpr = new VDR_PacketReceiver();
   vdrpr->receiverChannel = VDR::CHANNEL_STREAM;
   vdrpr->streamID = vrp.getSerial();
   vdrpr->streamReceiver = tstreamReceiver;
   edRegister(vdrpr);
+  TEMP_SINGLE_VDR_PR = vdrpr;
   
   VDR_ResponsePacket* vresp = RequestResponse(&vrp);
   if (vresp->noResponse())
@@ -580,6 +587,10 @@ int VDR::stopStreaming()
   VDR_RequestPacket vrp;
   if (!vrp.init(VDR_STOPSTREAMING, true, 0)) return 0;
 
+  edUnregister(TEMP_SINGLE_VDR_PR);
+  delete TEMP_SINGLE_VDR_PR;
+  TEMP_SINGLE_VDR_PR = NULL;
+
   VDR_ResponsePacket* vresp = RequestResponse(&vrp);
   if (vresp->noResponse()) { delete vresp; return 0; }
   
diff --git a/vdr.h b/vdr.h
index eca8b6f12daf4f95cc5a4d9618838e67437a7f91..26c5b60b5a79337ffb5416aca0a37d52740f5c07 100644 (file)
--- a/vdr.h
+++ b/vdr.h
@@ -80,7 +80,7 @@ class RecMan;
 class StreamReceiver
 {
   public:
-    virtual void streamReceive(void*, ULONG)=0;
+    virtual void streamReceive(ULONG, void*, ULONG)=0;
 };
 
 class VDR_PacketReceiver : public EDReceiver // implementation in vdr.cc
@@ -209,6 +209,8 @@ class VDR : public Thread_TYPE, public EventDispatcher
     bool connected;
     ULONG maxChannelNumber;
     ULONG channelNumberWidth;
+    
+    VDR_PacketReceiver* TEMP_SINGLE_VDR_PR;
 
     const static ULONG VDR_LOGIN               = 1;
     const static ULONG VDR_GETRECORDINGLIST    = 2;
index b1966679e6f17cf821690a818b09879e9d0da16a..c7a077e6e33b7046dc4edec417a9a2d1cb8ec7f3 100644 (file)
@@ -34,6 +34,8 @@ VDR_ResponsePacket::VDR_ResponsePacket()
   
   requestID = 0;
   streamID = 0;
+  
+  flag = 0;
 }
 
 VDR_ResponsePacket::~VDR_ResponsePacket()
@@ -51,10 +53,11 @@ void VDR_ResponsePacket::setResponse(ULONG trequestID, UCHAR* tuserData, ULONG t
   userDataLength = tuserDataLength;
 }
 
-void VDR_ResponsePacket::setStream(ULONG tstreamID, UCHAR* tuserData, ULONG tuserDataLength)
+void VDR_ResponsePacket::setStream(ULONG tstreamID, ULONG tflag, UCHAR* tuserData, ULONG tuserDataLength)
 {
   channelID = VDR::CHANNEL_STREAM;
   streamID = tstreamID;
+  flag = tflag;
   userData = tuserData;
   userDataLength = tuserDataLength;
 }
index 0b0baab68c44d7c646fa1ae18cd5eb1e4c839df3..3d8d5f35a874205fe5e8746e1afc0c78af12e417 100644 (file)
@@ -39,7 +39,7 @@ class VDR_ResponsePacket
     ~VDR_ResponsePacket();
     
     void setResponse(ULONG requestID, UCHAR* packet, ULONG packetLength);
-    void setStream(ULONG streamID, UCHAR* packet, ULONG packetLength);
+    void setStream(ULONG streamID, ULONG flag, UCHAR* packet, ULONG packetLength);
      
     bool noResponse() { return (userData == NULL); };
     int  serverError();
@@ -48,6 +48,7 @@ class VDR_ResponsePacket
     ULONG getChannelID() { return channelID; }
     ULONG getRequestID() { return requestID; }
     ULONG getStreamID() { return streamID; }
+    ULONG getFlag() { return flag; }
     
     char*  extractString();
     UCHAR  extractUCHAR();
@@ -71,6 +72,8 @@ class VDR_ResponsePacket
     
     ULONG requestID;
     ULONG streamID;
+    
+    ULONG flag; // stream only
         
     bool ownBlock;
 };