summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorlordjaxom <lordjaxom>2005-03-24 21:31:38 +0000
committerlordjaxom <lordjaxom>2005-03-24 21:31:38 +0000
commit183de0e401637f73a4f8afd10e38cb3f17a6a0f3 (patch)
treef9aac20a4c08afe30985edb68ca9ac5b7e6e889d /server
parent3aa01282662a5907cc283a151bba8a939672a065 (diff)
downloadvdr-plugin-streamdev-183de0e401637f73a4f8afd10e38cb3f17a6a0f3.tar.gz
vdr-plugin-streamdev-183de0e401637f73a4f8afd10e38cb3f17a6a0f3.tar.bz2
- streamer now gets stopped when connection terminates unexpectedly
- fixed recursive delete in streamer
Diffstat (limited to 'server')
-rw-r--r--server/connection.c8
-rw-r--r--server/streamer.c34
2 files changed, 28 insertions, 14 deletions
diff --git a/server/connection.c b/server/connection.c
index 1011aa9..762d184 100644
--- a/server/connection.c
+++ b/server/connection.c
@@ -1,5 +1,5 @@
/*
- * $Id: connection.c,v 1.2 2005/02/08 17:22:35 lordjaxom Exp $
+ * $Id: connection.c,v 1.3 2005/03/24 21:31:38 lordjaxom Exp $
*/
#include "server/connection.h"
@@ -130,10 +130,10 @@ cDevice *cServerConnection::GetDevice(const cChannel *Channel, int Priority) {
// maybe a device would be free if THIS connection did turn off its streams?
Dprintf(" * trying again...\n");
const cChannel *current = Channels.GetByNumber(cDevice::CurrentChannel());
- isyslog("streamdev-server: Detaching current receiver");
- Detach();
+ //isyslog("streamdev-server: Detaching current receiver");
+ //Detach(); XXX+
device = cDevice::GetDevice(Channel, Priority);
- Attach();
+ //Attach(); XXX+
Dprintf(" * Found following device: %p (%d)\n", device,
device ? device->CardIndex() + 1 : 0);
if (device == cDevice::ActualDevice())
diff --git a/server/streamer.c b/server/streamer.c
index a6afea8..bfc0203 100644
--- a/server/streamer.c
+++ b/server/streamer.c
@@ -1,5 +1,5 @@
/*
- * $Id: streamer.c,v 1.8 2005/02/11 17:02:22 lordjaxom Exp $
+ * $Id: streamer.c,v 1.9 2005/03/24 21:31:38 lordjaxom Exp $
*/
#include <vdr/ringbuffer.h>
@@ -11,6 +11,7 @@
#include "server/suspend.h"
#include "server/setup.h"
#include "tools/socket.h"
+#include "tools/select.h"
#include "common.h"
// --- cStreamdevWriter -------------------------------------------------------
@@ -25,12 +26,14 @@ cStreamdevWriter::cStreamdevWriter(cTBSocket *Socket, cStreamdevStreamer *Stream
cStreamdevWriter::~cStreamdevWriter()
{
+ Dprintf("destructing writer\n");
m_Active = false;
Cancel(3);
}
void cStreamdevWriter::Action(void)
{
+ cTBSelect sel;
Dprintf("Writer start\n");
int max = 0;
m_Active = true;
@@ -39,17 +42,28 @@ void cStreamdevWriter::Action(void)
uchar *block = m_Streamer->Get(count);
if (block) {
- if (!m_Socket->TimedWrite(block, count, 2000)) {
+ sel.Clear();
+ sel.Add(*m_Socket, true);
+ if (sel.Select(500) == -1) {
esyslog("ERROR: streamdev-server: couldn't send data: %m");
break;
}
- if (count > max)
- max = count;
- m_Streamer->Del(count);
+
+ if (sel.CanWrite(*m_Socket)) {
+ int written;
+ if ((written = m_Socket->Write(block, count)) == -1) {
+ esyslog("ERROR: streamdev-server: couldn't send data: %m");
+ break;
+ }
+ if (count > max)
+ max = count;
+ m_Streamer->Del(written);
+ }
}
}
m_Active = false;
Dprintf("Max. Transmit Blocksize was: %d\n", max);
+ m_Streamer->Stop();
}
// --- cStreamdevStreamer -----------------------------------------------------
@@ -70,9 +84,7 @@ cStreamdevStreamer::cStreamdevStreamer(const char *Name):
cStreamdevStreamer::~cStreamdevStreamer()
{
Dprintf("Desctructing streamer\n");
- Stop();
delete m_RingBuffer;
- delete m_Writer;
delete m_SendBuffer;
}
@@ -100,9 +112,11 @@ void cStreamdevStreamer::Stop(void)
m_Active = false;
Cancel(3);
}
- Detach();
- DELETENULL(m_Writer);
- m_Running = false;
+ if (m_Running) {
+ Detach();
+ m_Running = false;
+ DELETENULL(m_Writer);
+ }
}
void cStreamdevStreamer::Action(void)