// -----------------------------------
-void PlayerLiveRadio::streamReceive(void* data, ULONG len)
+void PlayerLiveRadio::streamReceive(ULONG flag, void* data, ULONG len)
{
if (streamChunks.size() < 11)
{
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
// -----------------------------------
-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;
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
connected = false;
maxChannelNumber = 0;
channelNumberWidth = 1;
+ TEMP_SINGLE_VDR_PR = NULL;
}
VDR::~VDR()
UCHAR* userData;
ULONG streamID;
+ ULONG flag;
VDR_ResponsePacket* vresp;
{
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)
{
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
{
{
// 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;
}
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())
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; }
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
bool connected;
ULONG maxChannelNumber;
ULONG channelNumberWidth;
+
+ VDR_PacketReceiver* TEMP_SINGLE_VDR_PR;
const static ULONG VDR_LOGIN = 1;
const static ULONG VDR_GETRECORDINGLIST = 2;
requestID = 0;
streamID = 0;
+
+ flag = 0;
}
VDR_ResponsePacket::~VDR_ResponsePacket()
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;
}
~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();
ULONG getChannelID() { return channelID; }
ULONG getRequestID() { return requestID; }
ULONG getStreamID() { return streamID; }
+ ULONG getFlag() { return flag; }
char* extractString();
UCHAR extractUCHAR();
ULONG requestID;
ULONG streamID;
+
+ ULONG flag; // stream only
bool ownBlock;
};