summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorFrank Schmirler <vdr@schmirler.de>2012-04-21 22:28:58 +0200
committerFrank Schmirler <vdr@schmirler.de>2012-04-21 22:28:58 +0200
commit2e8aefd2fe424a2e5a70fc8abc7eb5187bc8dc4d (patch)
treec494e4b822fa9ed0bedb7cc3a8b8f29cff4654e3 /client
parenta1797719de296b381a18ae889294b00dd5850667 (diff)
downloadvdr-plugin-streamdev-2e8aefd2fe424a2e5a70fc8abc7eb5187bc8dc4d.tar.gz
vdr-plugin-streamdev-2e8aefd2fe424a2e5a70fc8abc7eb5187bc8dc4d.tar.bz2
Added streamdev-client support for upcoming streamdev-server versions
with purely priority driven precedence.
Diffstat (limited to 'client')
-rw-r--r--client/device.c40
-rw-r--r--client/device.h2
-rw-r--r--client/setup.c12
-rw-r--r--client/socket.c40
-rw-r--r--client/socket.h2
5 files changed, 77 insertions, 19 deletions
diff --git a/client/device.c b/client/device.c
index f82e7d5..832bc0b 100644
--- a/client/device.c
+++ b/client/device.c
@@ -19,6 +19,14 @@
using namespace std;
+#ifndef LIVEPRIORITY
+#define LIVEPRIORITY 0
+#endif
+
+#ifndef TRANSFERPRIORITY
+#define TRANSFERPRIORITY -1
+#endif
+
#define VIDEOBUFSIZE MEGABYTE(3)
cStreamdevDevice *cStreamdevDevice::m_Device = NULL;
@@ -89,7 +97,11 @@ bool cStreamdevDevice::IsTunedToTransponder(const cChannel *Channel)
bool cStreamdevDevice::ProvidesChannel(const cChannel *Channel, int Priority,
bool *NeedsDetachReceivers) const {
bool res = false;
+#if APIVERSNUM >= 10725
+ bool prio = Priority == IDLEPRIORITY || Priority >= this->Priority();
+#else
bool prio = Priority < 0 || Priority > this->Priority();
+#endif
bool ndr = false;
if (!StreamdevClientSetup.StartClient || Channel == m_DenyChannel)
@@ -114,7 +126,24 @@ bool cStreamdevDevice::ProvidesChannel(const cChannel *Channel, int Priority,
&& TRANSPONDER(Channel, m_Channel))
res = true;
else {
+ if (Priority == LIVEPRIORITY)
+ {
+ if (ClientSocket.ServerVersion() >= 100)
+ {
+ Priority = StreamdevClientSetup.LivePriority;
+ UpdatePriority(true);
+ }
+ else
+ {
+ if (StreamdevClientSetup.LivePriority >= 0)
+ Priority = StreamdevClientSetup.LivePriority;
+ }
+ }
+
res = prio && ClientSocket.ProvidesChannel(Channel, Priority);
+
+ if (ClientSocket.ServerVersion() >= 100)
+ UpdatePriority(false);
ndr = true;
}
@@ -316,14 +345,21 @@ bool cStreamdevDevice::ReInit(void) {
return StreamdevClientSetup.StartClient ? Init() : true;
}
-void cStreamdevDevice::UpdatePriority(void) {
+void cStreamdevDevice::UpdatePriority(bool SwitchingChannels) {
if (m_Device) {
m_Device->Lock();
if (m_Device->m_UpdatePriority && ClientSocket.DataSocket(siLive)) {
int Priority = m_Device->Priority();
// override TRANSFERPRIORITY (-1) with live TV priority from setup
- if (m_Device == cDevice::ActualDevice() && Priority == -1)
+ if (m_Device == cDevice::ActualDevice() && Priority == TRANSFERPRIORITY) {
Priority = StreamdevClientSetup.LivePriority;
+ // temporarily lower priority
+ if (SwitchingChannels)
+ Priority--;
+ if (Priority < 0 && ClientSocket.ServerVersion() < 100)
+ Priority = 0;
+
+ }
if (m_Device->m_Priority != Priority && ClientSocket.SetPriority(Priority))
m_Device->m_Priority = Priority;
}
diff --git a/client/device.h b/client/device.h
index 1b03c43..1a66a15 100644
--- a/client/device.h
+++ b/client/device.h
@@ -70,7 +70,7 @@ public:
virtual int SignalStrength(void) const;
virtual int SignalQuality(void) const;
- static void UpdatePriority(void);
+ static void UpdatePriority(bool SwitchingChannels = false);
static void DenyChannel(const cChannel *Channel) { m_DenyChannel = Channel; }
static bool Init(void);
static bool ReInit(void);
diff --git a/client/setup.c b/client/setup.c
index dbb2dcc..0fc9e9f 100644
--- a/client/setup.c
+++ b/client/setup.c
@@ -7,6 +7,10 @@
#include "client/setup.h"
#include "client/device.h"
+#ifndef MINPRIORITY
+#define MINPRIORITY -MAXPRIORITY
+#endif
+
cStreamdevClientSetup StreamdevClientSetup;
cStreamdevClientSetup::cStreamdevClientSetup(void) {
@@ -16,7 +20,7 @@ cStreamdevClientSetup::cStreamdevClientSetup(void) {
StreamFilters = false;
HideMenuEntry = false;
LivePriority = 0;
- MinPriority = -MAXPRIORITY;
+ MinPriority = MINPRIORITY;
MaxPriority = MAXPRIORITY;
#if APIVERSNUM >= 10700
NumProvidedSystems = 1;
@@ -55,9 +59,9 @@ cStreamdevClientMenuSetupPage::cStreamdevClientMenuSetupPage(void) {
Add(new cMenuEditIntItem (tr("Remote Port"), &m_NewSetup.RemotePort, 0, 65535));
Add(new cMenuEditIntItem (tr("Timeout (s)"), &m_NewSetup.Timeout, 1, 15));
Add(new cMenuEditBoolItem(tr("Filter Streaming"), &m_NewSetup.StreamFilters));
- Add(new cMenuEditIntItem (tr("Live TV Priority"), &m_NewSetup.LivePriority, 0, MAXPRIORITY));
- Add(new cMenuEditIntItem (tr("Minimum Priority"), &m_NewSetup.MinPriority, -MAXPRIORITY, MAXPRIORITY));
- Add(new cMenuEditIntItem (tr("Maximum Priority"), &m_NewSetup.MaxPriority, -MAXPRIORITY, MAXPRIORITY));
+ Add(new cMenuEditIntItem (tr("Live TV Priority"), &m_NewSetup.LivePriority, MINPRIORITY, MAXPRIORITY));
+ Add(new cMenuEditIntItem (tr("Minimum Priority"), &m_NewSetup.MinPriority, MINPRIORITY, MAXPRIORITY));
+ Add(new cMenuEditIntItem (tr("Maximum Priority"), &m_NewSetup.MaxPriority, MINPRIORITY, MAXPRIORITY));
#if APIVERSNUM >= 10715
Add(new cMenuEditIntItem (tr("Broadcast Systems / Cost"), &m_NewSetup.NumProvidedSystems, 1, 15));
#elif APIVERSNUM >= 10700
diff --git a/client/socket.c b/client/socket.c
index 5662716..4b58625 100644
--- a/client/socket.c
+++ b/client/socket.c
@@ -23,6 +23,7 @@ cClientSocket ClientSocket;
cClientSocket::cClientSocket(void)
{
memset(m_DataSockets, 0, sizeof(cTBSocket*) * si_Count);
+ m_ServerVersion = 0;
m_Prio = false;
m_Abort = false;
m_LastSignalUpdate = 0;
@@ -153,23 +154,38 @@ bool cClientSocket::CheckConnection(void) {
return false;
}
- if (!Command("CAPS TSPIDS", 220)) {
- Close();
- return false;
- }
+ unsigned int major, minor;
+ if (sscanf(buffer.c_str(), "%*u VTP/%u.%u", &major, &minor) == 2)
+ m_ServerVersion = major * 100 + minor;
+
+ if (m_ServerVersion == 0) {
+ if (!Command("CAPS TSPIDS", 220)) {
+ Close();
+ return false;
+ }
- const char *Filters = "";
- if(Command("CAPS FILTERS", 220))
- Filters = ",FILTERS";
+ const char *Filters = "";
+ if(Command("CAPS FILTERS", 220))
+ Filters = ",FILTERS";
- const char *Prio = "";
- if(Command("CAPS PRIO", 220)) {
- Prio = ",PRIO";
+ const char *Prio = "";
+ if(Command("CAPS PRIO", 220)) {
+ Prio = ",PRIO";
+ m_Prio = true;
+ }
+ isyslog("streamdev-client: Connected to server %s:%d using capabilities TSPIDS%s%s",
+ RemoteIp().c_str(), RemotePort(), Filters, Prio);
+ }
+ else {
+ if(!Command("VERS 1.0", 220)) {
+ Close();
+ return false;
+ }
m_Prio = true;
+ isyslog("streamdev-client: Connected to server %s:%d using protocol version %u.%u",
+ RemoteIp().c_str(), RemotePort(), major, minor);
}
- isyslog("streamdev-client: Connected to server %s:%d using capabilities TSPIDS%s%s",
- RemoteIp().c_str(), RemotePort(), Filters, Prio);
return true;
}
diff --git a/client/socket.h b/client/socket.h
index 01d7a0f..a4d4e35 100644
--- a/client/socket.h
+++ b/client/socket.h
@@ -21,6 +21,7 @@ private:
cTBSocket *m_DataSockets[si_Count];
cMutex m_Mutex;
char m_Buffer[BUFSIZ + 1]; // various uses
+ unsigned int m_ServerVersion;
bool m_Prio; // server supports command PRIO
bool m_Abort; // quit command pending
@@ -52,6 +53,7 @@ public:
bool CloseDataConnection(eSocketId Id);
bool SetChannelDevice(const cChannel *Channel);
bool SupportsPrio() { return m_Prio; }
+ unsigned int ServerVersion() { return m_ServerVersion; }
bool SetPriority(int Priority);
bool SetPid(int Pid, bool On);
bool SetFilter(ushort Pid, uchar Tid, uchar Mask, bool On);