summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorFrank Schmirler <vdr@schmirler.de>2012-12-16 13:21:19 +0100
committerFrank Schmirler <vdr@schmirler.de>2012-12-16 13:21:19 +0100
commit186671647147d05821224f2b37b2ad70750f4548 (patch)
treea3c91dee1eb04b85563b9ccf135f90fa1a93ddba /server
parent50d249c62e8ae9c062278bf73d8edfff060cd6c7 (diff)
downloadvdr-plugin-streamdev-186671647147d05821224f2b37b2ad70750f4548.tar.gz
vdr-plugin-streamdev-186671647147d05821224f2b37b2ad70750f4548.tar.bz2
Close writer when streamer is finished
Diffstat (limited to 'server')
-rw-r--r--server/livefilter.c16
-rw-r--r--server/livefilter.h2
-rw-r--r--server/livestreamer.c8
-rw-r--r--server/livestreamer.h2
-rw-r--r--server/streamer.c6
-rw-r--r--server/streamer.h1
6 files changed, 34 insertions, 1 deletions
diff --git a/server/livefilter.c b/server/livefilter.c
index c707b3b..c159602 100644
--- a/server/livefilter.c
+++ b/server/livefilter.c
@@ -18,13 +18,17 @@
class cStreamdevLiveFilter: public cFilter {
private:
cStreamdevFilterStreamer *m_Streamer;
+ bool m_On;
protected:
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
+ virtual void SetStatus(bool On);
public:
cStreamdevLiveFilter(cStreamdevFilterStreamer *Streamer);
+ virtual bool IsAttached(void) const { return m_On; };
+
void Set(u_short Pid, u_char Tid, u_char Mask) {
cFilter::Set(Pid, Tid, Mask);
}
@@ -34,9 +38,16 @@ public:
};
cStreamdevLiveFilter::cStreamdevLiveFilter(cStreamdevFilterStreamer *Streamer) {
+ m_On = false;
m_Streamer = Streamer;
}
+void cStreamdevLiveFilter::SetStatus(bool On)
+{
+ m_On = On;
+ cFilter::SetStatus(On);
+}
+
void cStreamdevLiveFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
{
uchar buffer[TS_SIZE];
@@ -113,6 +124,11 @@ void cStreamdevFilterStreamer::SetDevice(cDevice *Device)
Attach();
}
+bool cStreamdevFilterStreamer::IsReceiving(void) const
+{
+ return m_Filter && m_Filter->IsAttached();
+}
+
bool cStreamdevFilterStreamer::SetFilter(u_short Pid, u_char Tid, u_char Mask, bool On)
{
Dprintf("cStreamdevFilterStreamer::SetFilter(%u,0x%x,0x%x,%s)\n", Pid, Tid, Mask, On?"On":"Off");
diff --git a/server/livefilter.h b/server/livefilter.h
index fd23931..f3e2d6d 100644
--- a/server/livefilter.h
+++ b/server/livefilter.h
@@ -26,6 +26,8 @@ public:
void SetDevice(cDevice *Device);
bool SetFilter(u_short Pid, u_char Tid, u_char Mask, bool On);
+
+ virtual bool IsReceiving(void) const;
void Receive(uchar *Data);
virtual void Attach(void);
diff --git a/server/livestreamer.c b/server/livestreamer.c
index c601573..8ae9437 100644
--- a/server/livestreamer.c
+++ b/server/livestreamer.c
@@ -449,13 +449,19 @@ cString cStreamdevLiveStreamer::ToText() const
return cString("");
}
+bool cStreamdevLiveStreamer::IsReceiving(void) const
+{
+ cThreadLock ThreadLock(m_Device);
+ return m_Receiver && m_Receiver->IsAttached();
+}
+
void cStreamdevLiveStreamer::StartReceiver(void)
{
if (m_NumPids > 0) {
Dprintf("Creating Receiver to respect changed pids\n");
cReceiver *current = m_Receiver;
- m_Receiver = new cStreamdevLiveReceiver(this, m_Channel, m_Priority, m_Pids);
cThreadLock ThreadLock(m_Device);
+ m_Receiver = new cStreamdevLiveReceiver(this, m_Channel, m_Priority, m_Pids);
if (IsRunning())
Attach();
delete current;
diff --git a/server/livestreamer.h b/server/livestreamer.h
index 4af7b11..8c7fc88 100644
--- a/server/livestreamer.h
+++ b/server/livestreamer.h
@@ -52,6 +52,8 @@ public:
cString ToText() const;
void Receive(uchar *Data, int Length);
+ virtual bool IsReceiving(void) const;
+
virtual uchar *Get(int &Count);
virtual void Del(int Count);
diff --git a/server/streamer.c b/server/streamer.c
index 9a6f43e..ad4dcc5 100644
--- a/server/streamer.c
+++ b/server/streamer.c
@@ -54,6 +54,11 @@ void cStreamdevWriter::Action(void)
if (block == NULL) {
block = m_Streamer->Get(count);
offset = 0;
+ // still no data - are we done?
+ if (block == NULL && !m_Streamer->IsReceiving() && timeout++ > 20) {
+ esyslog("streamdev-server: streamer done - writer exiting");
+ break;
+ }
}
if (block != NULL) {
@@ -100,6 +105,7 @@ void cStreamdevWriter::Action(void)
}
}
}
+ m_Socket->Close();
Dprintf("Max. Transmit Blocksize was: %d\n", max);
}
diff --git a/server/streamer.h b/server/streamer.h
index 6bc2247..74c9524 100644
--- a/server/streamer.h
+++ b/server/streamer.h
@@ -84,6 +84,7 @@ public:
virtual void Start(cTBSocket *Socket);
virtual void Stop(void);
+ virtual bool IsReceiving(void) const = 0;
bool Abort(void);
virtual uchar *Get(int &Count) { return m_SendBuffer->Get(Count); }