summaryrefslogtreecommitdiff
path: root/client/device.c
diff options
context:
space:
mode:
authorFrank Schmirler <schmirl@puter.linogate.de>2010-12-02 08:53:01 +0100
committerFrank Schmirler <schmirl@puter.linogate.de>2010-12-02 08:53:01 +0100
commit5e30711bfdb28085234a5ef6da4f4e44305ac3e4 (patch)
treed15809d23eeeed7fda55d9450b1af7c99d6eb5d6 /client/device.c
downloadvdr-plugin-streamdev-5e30711bfdb28085234a5ef6da4f4e44305ac3e4.tar.gz
vdr-plugin-streamdev-5e30711bfdb28085234a5ef6da4f4e44305ac3e4.tar.bz2
Snapshot 2007-03-20
Diffstat (limited to 'client/device.c')
-rw-r--r--client/device.c188
1 files changed, 188 insertions, 0 deletions
diff --git a/client/device.c b/client/device.c
new file mode 100644
index 0000000..a2e4580
--- /dev/null
+++ b/client/device.c
@@ -0,0 +1,188 @@
+/*
+ * $Id: device.c,v 1.8 2007/01/15 12:15:12 schmirl Exp $
+ */
+
+#include "client/device.h"
+#include "client/setup.h"
+#include "client/assembler.h"
+#include "client/filter.h"
+
+#include "tools/select.h"
+
+#include <vdr/channels.h>
+#include <vdr/ringbuffer.h>
+#include <vdr/eit.h>
+#include <vdr/timers.h>
+
+#include <time.h>
+#include <iostream>
+
+using namespace std;
+
+#define VIDEOBUFSIZE MEGABYTE(3)
+
+cStreamdevDevice *cStreamdevDevice::m_Device = NULL;
+
+cStreamdevDevice::cStreamdevDevice(void) {
+ m_Channel = NULL;
+ m_TSBuffer = NULL;
+ m_Assembler = NULL;
+
+#if VDRVERSNUM < 10300
+# if defined(HAVE_AUTOPID)
+ (void)new cSIProcessor(new cSectionsScanner(""));
+# else
+ (void)new cSIProcessor("");
+# endif
+ cSIProcessor::Read();
+#else
+ m_Filters = new cStreamdevFilters;
+ StartSectionHandler();
+ cSchedules::Read();
+#endif
+
+ m_Device = this;
+
+ if (StreamdevClientSetup.SyncEPG)
+ ClientSocket.SynchronizeEPG();
+}
+
+cStreamdevDevice::~cStreamdevDevice() {
+ Dprintf("Device gets destructed\n");
+ m_Device = NULL;
+ delete m_TSBuffer;
+ delete m_Assembler;
+#if VDRVERSNUM >= 10300
+ delete m_Filters;
+#endif
+}
+
+bool cStreamdevDevice::ProvidesSource(int Source) const {
+ Dprintf("ProvidesSource, Source=%d\n", Source);
+ return false;
+}
+
+bool cStreamdevDevice::ProvidesTransponder(const cChannel *Channel) const
+{
+ Dprintf("ProvidesTransponder\n");
+ return false;
+}
+
+bool cStreamdevDevice::ProvidesChannel(const cChannel *Channel, int Priority,
+ bool *NeedsDetachReceivers) const {
+ bool res = false;
+ bool prio = Priority < 0 || Priority > this->Priority();
+ bool ndr = false;
+ Dprintf("ProvidesChannel, Channel=%s, Prio=%d\n", Channel->Name(), Priority);
+
+ if (ClientSocket.DataSocket(siLive) != NULL
+ && TRANSPONDER(Channel, m_Channel))
+ res = true;
+ else {
+ res = prio && ClientSocket.ProvidesChannel(Channel, Priority);
+ ndr = true;
+ }
+
+ if (NeedsDetachReceivers)
+ *NeedsDetachReceivers = ndr;
+ Dprintf("prov res = %d, ndr = %d\n", res, ndr);
+ return res;
+}
+
+bool cStreamdevDevice::SetChannelDevice(const cChannel *Channel,
+ bool LiveView) {
+ Dprintf("SetChannelDevice Channel: %s, LiveView: %s\n", Channel->Name(),
+ LiveView ? "true" : "false");
+
+ if (LiveView)
+ return false;
+
+ if (ClientSocket.DataSocket(siLive) != NULL
+ && TRANSPONDER(Channel, m_Channel))
+ return true;
+
+#if VDRVERSNUM < 10338
+ DetachAll(pidHandles[ptAudio].pid);
+ DetachAll(pidHandles[ptVideo].pid);
+ DetachAll(pidHandles[ptPcr].pid);
+ DetachAll(pidHandles[ptTeletext].pid);
+ DelPid(pidHandles[ptAudio].pid);
+ DelPid(pidHandles[ptVideo].pid);
+ DelPid(pidHandles[ptPcr].pid, ptPcr);
+ DelPid(pidHandles[ptTeletext].pid);
+ DelPid(pidHandles[ptDolby].pid);
+#else
+ DetachAllReceivers();
+#endif
+ m_Channel = Channel;
+ bool r = ClientSocket.SetChannelDevice(m_Channel);
+ Dprintf("setchanneldevice r=%d\n", r);
+ return r;
+}
+
+bool cStreamdevDevice::SetPid(cPidHandle *Handle, int Type, bool On) {
+ Dprintf("SetPid, Pid=%d, Type=%d, On=%d, used=%d\n", Handle->pid, Type, On,
+ Handle->used);
+ if (Handle->pid && (On || !Handle->used))
+ return ClientSocket.SetPid(Handle->pid, On);
+ return true;
+}
+
+bool cStreamdevDevice::OpenDvr(void) {
+ Dprintf("OpenDvr\n");
+ CloseDvr();
+ if (ClientSocket.CreateDataConnection(siLive)) {
+ //m_Assembler = new cStreamdevAssembler(ClientSocket.DataSocket(siLive));
+ //m_TSBuffer = new cTSBuffer(m_Assembler->ReadPipe(), MEGABYTE(2), CardIndex() + 1);
+ m_TSBuffer = new cTSBuffer(*ClientSocket.DataSocket(siLive), MEGABYTE(2), CardIndex() + 1);
+ Dprintf("waiting\n");
+ //m_Assembler->WaitForFill();
+ Dprintf("resuming\n");
+ return true;
+ }
+ return false;
+}
+
+void cStreamdevDevice::CloseDvr(void) {
+ Dprintf("CloseDvr\n");
+
+ //DELETENULL(m_Assembler);
+ DELETENULL(m_TSBuffer);
+ ClientSocket.CloseDvr();
+}
+
+bool cStreamdevDevice::GetTSPacket(uchar *&Data) {
+ if (m_TSBuffer) {
+ Data = m_TSBuffer->Get();
+ return true;
+ }
+ return false;
+}
+
+#if VDRVERSNUM >= 10300
+int cStreamdevDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask) {
+ Dprintf("OpenFilter\n");
+ if (StreamdevClientSetup.StreamFilters
+ && ClientSocket.SetFilter(Pid, Tid, Mask, true)) {
+ return m_Filters->OpenFilter(Pid, Tid, Mask);
+ } else
+ return -1;
+}
+#endif
+
+bool cStreamdevDevice::Init(void) {
+ if (m_Device == NULL && StreamdevClientSetup.StartClient)
+ new cStreamdevDevice;
+ return true;
+}
+
+bool cStreamdevDevice::ReInit(void) {
+ ClientSocket.Quit();
+ ClientSocket.Reset();
+ if (m_Device != NULL) {
+ DELETENULL(m_Device->m_TSBuffer);
+ DELETENULL(m_Device->m_Assembler);
+ }
+ return StreamdevClientSetup.StartClient ? Init() : true;
+}
+