Replaced server-side suspend modes with priority based precedence handling

This commit is contained in:
Frank Schmirler 2012-03-31 16:19:44 +02:00
parent ae634538f8
commit c3ac597623
19 changed files with 173 additions and 385 deletions

View File

@ -7,12 +7,15 @@ VDR Plugin 'streamdev' Revision History
anonymous user) anonymous user)
- New special meaning "show current channel" when channel 0 is requested. - New special meaning "show current channel" when channel 0 is requested.
Applies to HTTP streaming only (thanks to Rolf Ahrenberg) Applies to HTTP streaming only (thanks to Rolf Ahrenberg)
- Added streamdev-client support for upcoming streamdev-server versions
with purely priority driven precedence.
- API change of VDR 1.7.26: "avoid device" is no longer available
- Fixed ProvidesChannel() on client always returning true since the new timeout - Fixed ProvidesChannel() on client always returning true since the new timeout
option has been added. option has been added.
- Updated Finnish translation (thanks to Rolf Ahrenberg) - Updated Finnish translation (thanks to Rolf Ahrenberg)
- Replaced server-side suspend modes with priority based precedence handling
- Client-side priority handling for VDR >= 1.7.25 and servers running VTP > 1.0
- Introduced VTP protocol version numbering for easier compatibility handling
between different client and server versions. The server includes the protocol
version in its greeting string, the client reports its version with the new
command "VERS".
- Dropped compatibility of streamdev-server with VDR < 1.7.25 - Dropped compatibility of streamdev-server with VDR < 1.7.25
- With VDR 1.7.25 priorities down to -99 will be used. Please update - With VDR 1.7.25 priorities down to -99 will be used. Please update
"Minimum Priority" in streamdev-client setup. "Minimum Priority" in streamdev-client setup.

View File

@ -49,13 +49,6 @@ enum eStreamType {
st_Count st_Count
}; };
enum eSuspendMode {
smOffer,
smAlways,
smNever,
sm_Count
};
enum eSocketId { enum eSocketId {
siLive, siLive,
siReplay, siReplay,

View File

@ -14,71 +14,6 @@
#include <stdarg.h> #include <stdarg.h>
#include <errno.h> #include <errno.h>
class cSwitchLive {
private:
cMutex mutex;
cCondWait switched;
cDevice *device;
const cChannel *channel;
public:
cDevice* Switch(cDevice *Device, const cChannel *Channel);
void Switch(void);
cSwitchLive(void);
};
cSwitchLive::cSwitchLive(): device(NULL), channel(NULL)
{
}
cDevice* cSwitchLive::Switch(cDevice *Device, const cChannel *Channel)
{
mutex.Lock();
device = Device;
channel = Channel;
mutex.Unlock();
switched.Wait();
return device;
}
void cSwitchLive::Switch(void)
{
mutex.Lock();
if (channel && device) {
#if APIVERSNUM >= 10726
cChannel *current = Channels.GetByNumber(cDevice::CurrentChannel());
cDevice *newdev = cServerConnection::CheckDevice(current, 0, true, device);
if (!newdev) {
if (StreamdevServerSetup.SuspendMode == smAlways) {
Channels.SwitchTo(channel->Number());
Skins.Message(mtInfo, tr("Streaming active"));
}
else {
esyslog("streamdev: Can't receive channel %d (%s) from device %d. Moving live TV to other device failed (PrimaryDevice=%d, ActualDevice=%d)", channel->Number(), channel->Name(), device->CardIndex(), cDevice::PrimaryDevice()->CardIndex(), cDevice::ActualDevice()->CardIndex());
device = NULL;
}
}
else {
newdev->SwitchChannel(current, true);
}
#else
cDevice::SetAvoidDevice(device);
if (!Channels.SwitchTo(cDevice::CurrentChannel())) {
if (StreamdevServerSetup.SuspendMode == smAlways) {
Channels.SwitchTo(channel->Number());
Skins.Message(mtInfo, tr("Streaming active"));
}
else {
esyslog("streamdev: Can't receive channel %d (%s) from device %d. Moving live TV to other device failed (PrimaryDevice=%d, ActualDevice=%d)", channel->Number(), channel->Name(), device->CardIndex(), cDevice::PrimaryDevice()->CardIndex(), cDevice::ActualDevice()->CardIndex());
device = NULL;
}
}
#endif
// make sure we don't come in here next time
channel = NULL;
switched.Signal();
}
mutex.Unlock();
}
cServerConnection::cServerConnection(const char *Protocol, int Type): cServerConnection::cServerConnection(const char *Protocol, int Type):
cTBSocket(Type), cTBSocket(Type),
@ -87,14 +22,13 @@ cServerConnection::cServerConnection(const char *Protocol, int Type):
m_Pending(false), m_Pending(false),
m_ReadBytes(0), m_ReadBytes(0),
m_WriteBytes(0), m_WriteBytes(0),
m_WriteIndex(0) m_WriteIndex(0),
m_SwitchTo(NULL)
{ {
m_SwitchLive = new cSwitchLive();
} }
cServerConnection::~cServerConnection() cServerConnection::~cServerConnection()
{ {
delete m_SwitchLive;
} }
const cChannel* cServerConnection::ChannelFromString(const char *String, int *Apid, int *Dpid) { const cChannel* cServerConnection::ChannelFromString(const char *String, int *Apid, int *Dpid) {
@ -264,99 +198,6 @@ bool cServerConnection::Close()
return cTBSocket::Close(); return cTBSocket::Close();
} }
static int GetClippedNumProvidedSystems(int AvailableBits, cDevice *Device)
{
int MaxNumProvidedSystems = (1 << AvailableBits) - 1;
int NumProvidedSystems = Device->NumProvidedSystems();
if (NumProvidedSystems > MaxNumProvidedSystems) {
esyslog("ERROR: device %d supports %d modulation systems but cDevice::GetDevice() currently only supports %d delivery systems which should be fixed", Device->CardIndex() + 1, NumProvidedSystems, MaxNumProvidedSystems);
NumProvidedSystems = MaxNumProvidedSystems;
}
else if (NumProvidedSystems <= 0) {
esyslog("ERROR: device %d reported an invalid number (%d) of supported delivery systems - assuming 1", Device->CardIndex() + 1, NumProvidedSystems);
NumProvidedSystems = 1;
}
return NumProvidedSystems;
}
/*
* copy of cDevice::GetDevice(...) but without side effects (not detaching receivers)
*/
cDevice* cServerConnection::CheckDevice(const cChannel *Channel, int Priority, bool LiveView, const cDevice *AvoidDevice)
{
//cDevice *AvoidDevice = avoidDevice;
//avoidDevice = NULL;
// Collect the current priorities of all CAM slots that can decrypt the channel:
int NumCamSlots = CamSlots.Count();
int SlotPriority[NumCamSlots];
int NumUsableSlots = 0;
if (Channel->Ca() >= CA_ENCRYPTED_MIN) {
for (cCamSlot *CamSlot = CamSlots.First(); CamSlot; CamSlot = CamSlots.Next(CamSlot)) {
SlotPriority[CamSlot->Index()] = MAXPRIORITY + 1; // assumes it can't be used
if (CamSlot->ModuleStatus() == msReady) {
if (CamSlot->ProvidesCa(Channel->Caids())) {
if (!ChannelCamRelations.CamChecked(Channel->GetChannelID(), CamSlot->SlotNumber())) {
SlotPriority[CamSlot->Index()] = CamSlot->Priority();
NumUsableSlots++;
}
}
}
}
if (!NumUsableSlots)
return NULL; // no CAM is able to decrypt this channel
}
cDevice *d = NULL;
//cCamSlot *s = NULL;
uint32_t Impact = 0xFFFFFFFF; // we're looking for a device with the least impact
for (int j = 0; j < NumCamSlots || !NumUsableSlots; j++) {
if (NumUsableSlots && SlotPriority[j] > MAXPRIORITY)
continue; // there is no CAM available in this slot
for (int i = 0; i < cDevice::NumDevices(); i++) {
cDevice *device = cDevice::GetDevice(i);
if (device == AvoidDevice)
continue; // we've been asked to skip this device
if (Channel->Ca() && Channel->Ca() <= CA_DVB_MAX && Channel->Ca() != device->CardIndex() + 1)
continue; // a specific card was requested, but not this one
if (NumUsableSlots && !CamSlots.Get(j)->Assign(device, true))
continue; // CAM slot can't be used with this device
bool ndr;
if (device->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job
if (NumUsableSlots && device->CamSlot() && device->CamSlot() != CamSlots.Get(j))
ndr = true; // using a different CAM slot requires detaching receivers
// Put together an integer number that reflects the "impact" using
// this device would have on the overall system. Each condition is represented
// by one bit in the number (or several bits, if the condition is actually
// a numeric value). The sequence in which the conditions are listed corresponds
// to their individual severity, where the one listed first will make the most
// difference, because it results in the most significant bit of the result.
uint32_t imp = 0;
imp <<= 1; imp |= LiveView ? !device->IsPrimaryDevice() || ndr : 0; // prefer the primary device for live viewing if we don't need to detach existing receivers
imp <<= 1; imp |= !device->Receiving() && (device != cTransferControl::ReceiverDevice() || device->IsPrimaryDevice()) || ndr; // use receiving devices if we don't need to detach existing receivers, but avoid primary device in local transfer mode
imp <<= 1; imp |= device->Receiving(); // avoid devices that are receiving
imp <<= 4; imp |= GetClippedNumProvidedSystems(4, device) - 1; // avoid cards which support multiple delivery systems
imp <<= 1; imp |= device == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device
imp <<= 8; imp |= min(max(device->Priority() + MAXPRIORITY, 0), 0xFF); // use the device with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF); // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers
imp <<= 1; imp |= NumUsableSlots ? 0 : device->HasCi(); // avoid cards with Common Interface for FTA channels
imp <<= 1; imp |= device->AvoidRecording(); // avoid SD full featured cards
imp <<= 1; imp |= NumUsableSlots ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), j + 1) : 0; // prefer CAMs that are known to decrypt this channel
imp <<= 1; imp |= device->IsPrimaryDevice(); // avoid the primary device
if (imp < Impact) {
// This device has less impact than any previous one, so we take it.
Impact = imp;
d = device;
}
}
}
if (!NumUsableSlots)
break; // no CAM necessary, so just one loop over the devices
}
return d;
}
bool cServerConnection::UsedByLiveTV(cDevice *device) bool cServerConnection::UsedByLiveTV(cDevice *device)
{ {
return device == cTransferControl::ReceiverDevice() || return device == cTransferControl::ReceiverDevice() ||
@ -367,59 +208,40 @@ cDevice *cServerConnection::GetDevice(const cChannel *Channel, int Priority)
{ {
// turn off the streams of this connection // turn off the streams of this connection
Detach(); Detach();
// This call may detach receivers of the device it returns
cDevice *device = cDevice::GetDevice(Channel, Priority, false); cDevice *device = cDevice::GetDevice(Channel, Priority, false);
if (device && !device->IsTunedToTransponder(Channel)
&& UsedByLiveTV(device)) {
// now we would have to switch away live tv...let's see if live tv
// can be handled by another device
device = m_SwitchLive->Switch(device, Channel);
}
if (!device) { if (!device) {
// can't switch - continue the current stream // can't switch - continue the current stream
Attach(); Attach();
dsyslog("streamdev: GetDevice failed for channel %d (%s) at priority %d (PrimaryDevice=%d, ActualDevice=%d)", Channel->Number(), Channel->Name(), Priority, cDevice::PrimaryDevice()->CardIndex(), cDevice::ActualDevice()->CardIndex()); dsyslog("streamdev: GetDevice failed for channel %d (%s) at priority %d (PrimaryDevice=%d, ActualDevice=%d)", Channel->Number(), Channel->Name(), Priority, cDevice::PrimaryDevice()->CardIndex(), cDevice::ActualDevice()->CardIndex());
} }
else if (!device->IsTunedToTransponder(Channel) && UsedByLiveTV(device)) {
// switched away live TV
m_SwitchTo = Channel;
}
return device; return device;
} }
bool cServerConnection::ProvidesChannel(const cChannel *Channel, int Priority) bool cServerConnection::ProvidesChannel(const cChannel *Channel, int Priority)
{ {
cDevice *device = CheckDevice(Channel, Priority, false); cDevice *device = cDevice::GetDevice(Channel, Priority, false, true);
if (!device || (StreamdevServerSetup.SuspendMode != smAlways if (!device)
&& !device->IsTunedToTransponder(Channel)
&& UsedByLiveTV(device))) {
// no device available or the device is in use for live TV and suspend mode doesn't allow us to switch it:
// maybe a device would be free if THIS connection did turn off its streams?
Detach();
device = CheckDevice(Channel, Priority, false);
Attach();
if (device && StreamdevServerSetup.SuspendMode != smAlways
&& !device->IsTunedToTransponder(Channel)
&& UsedByLiveTV(device)) {
// now we would have to switch away live tv...let's see if live tv
// can be handled by another device
const cChannel *current = Channels.GetByNumber(cDevice::CurrentChannel());
cDevice *newdev = current ? CheckDevice(current, 0, true, device) : NULL;
if (newdev) {
dsyslog("streamdev: Providing channel %d (%s) at priority %d requires moving live TV to device %d (PrimaryDevice=%d, ActualDevice=%d)", Channel->Number(), Channel->Name(), Priority, newdev->CardIndex(), cDevice::PrimaryDevice()->CardIndex(), cDevice::ActualDevice()->CardIndex());
}
else {
device = NULL;
dsyslog("streamdev: Not providing channel %d (%s) at priority %d - live TV not suspended", Channel->Number(), Channel->Name(), Priority);
}
}
else if (!device)
dsyslog("streamdev: No device provides channel %d (%s) at priority %d", Channel->Number(), Channel->Name(), Priority); dsyslog("streamdev: No device provides channel %d (%s) at priority %d", Channel->Number(), Channel->Name(), Priority);
}
return device; return device;
} }
void cServerConnection::MainThreadHook() void cServerConnection::MainThreadHook()
{ {
m_SwitchLive->Switch(); if (m_SwitchTo)
{
// switched away live TV. Try previous channel on other device first
if (!Channels.SwitchTo(cDevice::CurrentChannel())) {
// switch to streamdev channel otherwise
Channels.SwitchTo(m_SwitchTo->Number());
Skins.Message(mtInfo, tr("Streaming active"));
}
m_SwitchTo = NULL;
}
} }
cString cServerConnection::ToText() const cString cServerConnection::ToText() const

View File

@ -15,7 +15,6 @@ typedef std::pair<std::string,std::string> tStrStr;
class cChannel; class cChannel;
class cDevice; class cDevice;
class cSwitchLive;
/* Basic capabilities of a straight text-based protocol, most functions /* Basic capabilities of a straight text-based protocol, most functions
virtual to support more complicated protocols */ virtual to support more complicated protocols */
@ -34,7 +33,8 @@ private:
uint m_WriteBytes; uint m_WriteBytes;
uint m_WriteIndex; uint m_WriteIndex;
cSwitchLive *m_SwitchLive; /* Set to this connection's current channel when live TV was interrupted */
const cChannel *m_SwitchTo;
tStrStrMap m_Headers; tStrStrMap m_Headers;

View File

@ -150,11 +150,11 @@ bool cConnectionHTTP::ProcessRequest(void)
return Respond("%s", true, m_ChannelList->HttpHeader().c_str()); return Respond("%s", true, m_ChannelList->HttpHeader().c_str());
else if (m_Channel != NULL) { else if (m_Channel != NULL) {
cDevice *device = NULL; cDevice *device = NULL;
if (ProvidesChannel(m_Channel, 0)) if (ProvidesChannel(m_Channel, StreamdevServerSetup.HTTPPriority))
device = GetDevice(m_Channel, 0); device = GetDevice(m_Channel, StreamdevServerSetup.HTTPPriority);
if (device != NULL) { if (device != NULL) {
device->SwitchChannel(m_Channel, false); device->SwitchChannel(m_Channel, false);
m_LiveStreamer = new cStreamdevLiveStreamer(0, this); m_LiveStreamer = new cStreamdevLiveStreamer(StreamdevServerSetup.HTTPPriority, this);
if (m_LiveStreamer->SetChannel(m_Channel, m_StreamType, m_Apid[0] ? m_Apid : NULL, m_Dpid[0] ? m_Dpid : NULL)) { if (m_LiveStreamer->SetChannel(m_Channel, m_StreamType, m_Apid[0] ? m_Apid : NULL, m_Dpid[0] ? m_Dpid : NULL)) {
m_LiveStreamer->SetDevice(device); m_LiveStreamer->SetDevice(device);
if (!SetDSCP()) if (!SetDSCP())

View File

@ -43,11 +43,11 @@ bool cConnectionIGMP::SetChannel(cChannel *Channel, in_addr_t Dst)
void cConnectionIGMP::Welcome() void cConnectionIGMP::Welcome()
{ {
cDevice *device = NULL; cDevice *device = NULL;
if (ProvidesChannel(m_Channel, 0)) if (ProvidesChannel(m_Channel, StreamdevServerSetup.IGMPPriority))
device = GetDevice(m_Channel, 0); device = GetDevice(m_Channel, StreamdevServerSetup.IGMPPriority);
if (device != NULL) { if (device != NULL) {
device->SwitchChannel(m_Channel, false); device->SwitchChannel(m_Channel, false);
m_LiveStreamer = new cStreamdevLiveStreamer(0, this); m_LiveStreamer = new cStreamdevLiveStreamer(StreamdevServerSetup.IGMPPriority, this);
if (m_LiveStreamer->SetChannel(m_Channel, m_StreamType)) { if (m_LiveStreamer->SetChannel(m_Channel, m_StreamType)) {
m_LiveStreamer->SetDevice(device); m_LiveStreamer->SetDevice(device);
if (!SetDSCP()) if (!SetDSCP())

View File

@ -733,6 +733,7 @@ cConnectionVTP::cConnectionVTP(void):
m_DataSocket(NULL), m_DataSocket(NULL),
m_LastCommand(NULL), m_LastCommand(NULL),
m_StreamType(stTSPIDS), m_StreamType(stTSPIDS),
m_ClientVersion(0),
m_FiltersSupport(false), m_FiltersSupport(false),
m_RecPlayer(NULL), m_RecPlayer(NULL),
m_TuneChannel(NULL), m_TuneChannel(NULL),
@ -773,7 +774,7 @@ bool cConnectionVTP::Abort(void) const
void cConnectionVTP::Welcome(void) void cConnectionVTP::Welcome(void)
{ {
Respond(220, "Welcome to Video Disk Recorder (VTP)"); Respond(220, "VTP/1.0 Welcome to Video Disk Recorder");
} }
void cConnectionVTP::Reject(void) void cConnectionVTP::Reject(void)
@ -827,6 +828,7 @@ bool cConnectionVTP::Command(char *Cmd)
} }
if (strcasecmp(Cmd, "CAPS") == 0) return CmdCAPS(param); if (strcasecmp(Cmd, "CAPS") == 0) return CmdCAPS(param);
else if (strcasecmp(Cmd, "VERS") == 0) return CmdVERS(param);
else if (strcasecmp(Cmd, "PROV") == 0) return CmdPROV(param); else if (strcasecmp(Cmd, "PROV") == 0) return CmdPROV(param);
else if (strcasecmp(Cmd, "PORT") == 0) return CmdPORT(param); else if (strcasecmp(Cmd, "PORT") == 0) return CmdPORT(param);
else if (strcasecmp(Cmd, "READ") == 0) return CmdREAD(param); else if (strcasecmp(Cmd, "READ") == 0) return CmdREAD(param);
@ -900,6 +902,17 @@ bool cConnectionVTP::CmdCAPS(char *Opts)
return Respond(561, "Capability \"%s\" not known", Opts); return Respond(561, "Capability \"%s\" not known", Opts);
} }
bool cConnectionVTP::CmdVERS(char *Opts)
{
unsigned int major, minor;
if (sscanf(Opts, " %u.%u", &major, &minor) != 2)
return Respond(501, "Use: VERS version (with version in format major.minor)");
m_ClientVersion = major * 100 + minor;
m_FiltersSupport = true;
return Respond(220, "Protocol version %u.%u accepted", major, minor);
}
bool cConnectionVTP::CmdPROV(char *Opts) bool cConnectionVTP::CmdPROV(char *Opts)
{ {
const cChannel *chan; const cChannel *chan;
@ -914,6 +927,10 @@ bool cConnectionVTP::CmdPROV(char *Opts)
if ((chan = ChannelFromString(Opts)) == NULL) if ((chan = ChannelFromString(Opts)) == NULL)
return Respond(550, "Undefined channel \"%s\"", Opts); return Respond(550, "Undefined channel \"%s\"", Opts);
// legacy clients use priority 0 even if live TV has priority
if (m_ClientVersion == 0 && prio == 0)
prio = StreamdevServerSetup.VTPPriority;
LOOP_PREVENTION(chan); LOOP_PREVENTION(chan);
if (ProvidesChannel(chan, prio)) { if (ProvidesChannel(chan, prio)) {
@ -921,10 +938,20 @@ bool cConnectionVTP::CmdPROV(char *Opts)
m_TunePriority = prio; m_TunePriority = prio;
return Respond(220, "Channel available"); return Respond(220, "Channel available");
} }
else { // legacy clients didn't lower priority when switching channels,
// so get our own receiver temporarily out of the way
if (m_ClientVersion == 0) {
Detach();
bool provided = ProvidesChannel(chan, prio);
Attach();
if (provided) {
m_TuneChannel = chan;
m_TunePriority = prio;
return Respond(220, "Channel available");
}
}
m_TuneChannel = NULL; m_TuneChannel = NULL;
return Respond(560, "Channel not available"); return Respond(560, "Channel not available");
}
} }
bool cConnectionVTP::CmdPORT(char *Opts) bool cConnectionVTP::CmdPORT(char *Opts)
@ -1286,10 +1313,9 @@ bool cConnectionVTP::CmdQUIT(void)
bool cConnectionVTP::CmdSUSP(void) bool cConnectionVTP::CmdSUSP(void)
{ {
if (StreamdevServerSetup.SuspendMode == smAlways || cSuspendCtl::IsActive()) if (cSuspendCtl::IsActive())
return Respond(220, "Server is suspended"); return Respond(220, "Server is suspended");
else if (StreamdevServerSetup.SuspendMode == smOffer else if (StreamdevServerSetup.AllowSuspend) {
&& StreamdevServerSetup.AllowSuspend) {
cControl::Launch(new cSuspendCtl); cControl::Launch(new cSuspendCtl);
cControl::Attach(); cControl::Attach();
return Respond(220, "Server is suspended"); return Respond(220, "Server is suspended");

View File

@ -28,6 +28,7 @@ private:
char *m_LastCommand; char *m_LastCommand;
eStreamType m_StreamType; eStreamType m_StreamType;
unsigned int m_ClientVersion;
bool m_FiltersSupport; bool m_FiltersSupport;
bool m_LoopPrevention; bool m_LoopPrevention;
RecPlayer *m_RecPlayer; RecPlayer *m_RecPlayer;
@ -62,6 +63,7 @@ public:
virtual bool Command(char *Cmd); virtual bool Command(char *Cmd);
bool CmdCAPS(char *Opts); bool CmdCAPS(char *Opts);
bool CmdVERS(char *Opts);
bool CmdPROV(char *Opts); bool CmdPROV(char *Opts);
bool CmdPORT(char *Opts); bool CmdPORT(char *Opts);
bool CmdREAD(char *Opts); bool CmdREAD(char *Opts);

View File

@ -24,7 +24,7 @@ cStreamdevServerMenu::~cStreamdevServerMenu() {
} }
void cStreamdevServerMenu::SetHelpKeys() { void cStreamdevServerMenu::SetHelpKeys() {
SetHelp(Count() ? tr("Disconnect") : NULL, NULL, NULL, StreamdevServerSetup.SuspendMode == smOffer ? tr("Suspend") : NULL); SetHelp(Count() ? tr("Disconnect") : NULL, NULL, NULL, tr("Suspend"));
} }
eOSState cStreamdevServerMenu::Disconnect() { eOSState cStreamdevServerMenu::Disconnect() {
@ -47,7 +47,7 @@ eOSState cStreamdevServerMenu::Disconnect() {
} }
eOSState cStreamdevServerMenu::Suspend() { eOSState cStreamdevServerMenu::Suspend() {
if (StreamdevServerSetup.SuspendMode == smOffer && !cSuspendCtl::IsActive()) { if (!cSuspendCtl::IsActive()) {
cControl::Launch(new cSuspendCtl); cControl::Launch(new cSuspendCtl);
return osBack; return osBack;
} }

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev 0.5.0\n" "Project-Id-Version: streamdev 0.5.0\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2008-03-30 02:11+0200\n" "PO-Revision-Date: 2008-03-30 02:11+0200\n"
"Last-Translator: Frank Schmirler <vdrdev@schmirler.de>\n" "Last-Translator: Frank Schmirler <vdrdev@schmirler.de>\n"
"Language-Team: German <vdr@linuxtv.org>\n" "Language-Team: German <vdr@linuxtv.org>\n"
@ -31,15 +31,6 @@ msgstr "Trennen"
msgid "Suspend" msgid "Suspend"
msgstr "Pausieren" msgstr "Pausieren"
msgid "Offer suspend mode"
msgstr "Pausieren anbieten"
msgid "Always suspended"
msgstr "Immer pausiert"
msgid "Never suspended"
msgstr "Nie pausiert"
msgid "Common Settings" msgid "Common Settings"
msgstr "Allgemeines" msgstr "Allgemeines"
@ -49,12 +40,6 @@ msgstr "Hauptmen
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "Maximalanzahl an Clients" msgstr "Maximalanzahl an Clients"
msgid "Suspend behaviour"
msgstr "Pausierverhalten"
msgid "Client may suspend"
msgstr "Client darf pausieren"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "VDR-zu-VDR Server" msgstr "VDR-zu-VDR Server"
@ -67,6 +52,12 @@ msgstr "Port des VDR-zu-VDR Servers"
msgid "Bind to IP" msgid "Bind to IP"
msgstr "Binde an IP" msgstr "Binde an IP"
msgid "Legacy Client Priority"
msgstr "Priorität für alte Clients"
msgid "Client may suspend"
msgstr "Client darf pausieren"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "Schleifen verhindern" msgstr "Schleifen verhindern"
@ -79,6 +70,9 @@ msgstr "HTTP Server starten"
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "Port des HTTP Servers" msgstr "Port des HTTP Servers"
msgid "Priority"
msgstr "Priorität"
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "HTTP Streamtyp" msgstr "HTTP Streamtyp"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev 0.5.0\n" "Project-Id-Version: streamdev 0.5.0\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2010-06-19 03:58+0100\n" "PO-Revision-Date: 2010-06-19 03:58+0100\n"
"Last-Translator: Javier Bradineras <jbradi@hotmail.com>\n" "Last-Translator: Javier Bradineras <jbradi@hotmail.com>\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n" "Language-Team: Spanish <vdr@linuxtv.org>\n"
@ -31,15 +31,6 @@ msgstr ""
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
msgid "Offer suspend mode"
msgstr "Ofrecer modo de suspensión"
msgid "Always suspended"
msgstr "Siempre suspendido"
msgid "Never suspended"
msgstr "Nunca suspendido"
msgid "Common Settings" msgid "Common Settings"
msgstr "Configuración común" msgstr "Configuración común"
@ -49,12 +40,6 @@ msgstr ""
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "Numero máximo de clientes" msgstr "Numero máximo de clientes"
msgid "Suspend behaviour"
msgstr "Comportamiento de la suspensión"
msgid "Client may suspend"
msgstr "Permitir suspender al cliente"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "Servidor VDR-a-VDR" msgstr "Servidor VDR-a-VDR"
@ -67,6 +52,12 @@ msgstr "Puerto del Servidor VDR-a-VDR"
msgid "Bind to IP" msgid "Bind to IP"
msgstr "IP asociada" msgstr "IP asociada"
msgid "Legacy Client Priority"
msgstr ""
msgid "Client may suspend"
msgstr "Permitir suspender al cliente"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "" msgstr ""
@ -79,6 +70,9 @@ msgstr "Iniciar Servidor HTTP"
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "Puerto del Servidor HTTP" msgstr "Puerto del Servidor HTTP"
msgid "Priority"
msgstr ""
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "Tipo de flujo HTTP" msgstr "Tipo de flujo HTTP"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev 0.5.0\n" "Project-Id-Version: streamdev 0.5.0\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2008-03-30 02:11+0200\n" "PO-Revision-Date: 2008-03-30 02:11+0200\n"
"Last-Translator: Rolf Ahrenberg\n" "Last-Translator: Rolf Ahrenberg\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n" "Language-Team: Finnish <vdr@linuxtv.org>\n"
@ -31,15 +31,6 @@ msgstr "Katkaise"
msgid "Suspend" msgid "Suspend"
msgstr "Pysäytä" msgstr "Pysäytä"
msgid "Offer suspend mode"
msgstr "tyrkytä"
msgid "Always suspended"
msgstr "aina"
msgid "Never suspended"
msgstr "ei koskaan"
msgid "Common Settings" msgid "Common Settings"
msgstr "Yleiset asetukset" msgstr "Yleiset asetukset"
@ -49,12 +40,6 @@ msgstr "Piilota valinta päävalikosta"
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "Suurin sallittu asiakkaiden määrä" msgstr "Suurin sallittu asiakkaiden määrä"
msgid "Suspend behaviour"
msgstr "Pysäytystoiminto"
msgid "Client may suspend"
msgstr "Asiakas saa pysäyttää palvelimen"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "VDR-palvelin" msgstr "VDR-palvelin"
@ -67,6 +52,12 @@ msgstr "VDR-palvelimen portti"
msgid "Bind to IP" msgid "Bind to IP"
msgstr "Sido osoitteeseen" msgstr "Sido osoitteeseen"
msgid "Legacy Client Priority"
msgstr ""
msgid "Client may suspend"
msgstr "Asiakas saa pysäyttää palvelimen"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "Estä asiakaslaitesilmukat" msgstr "Estä asiakaslaitesilmukat"
@ -79,6 +70,9 @@ msgstr "Käynnistä HTTP-palvelin"
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "HTTP-palvelimen portti" msgstr "HTTP-palvelimen portti"
msgid "Priority"
msgstr ""
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "HTTP-lähetysmuoto" msgstr "HTTP-lähetysmuoto"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev 0.5.0\n" "Project-Id-Version: streamdev 0.5.0\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2008-03-30 02:11+0200\n" "PO-Revision-Date: 2008-03-30 02:11+0200\n"
"Last-Translator: micky979 <micky979@free.fr>\n" "Last-Translator: micky979 <micky979@free.fr>\n"
"Language-Team: French <vdr@linuxtv.org>\n" "Language-Team: French <vdr@linuxtv.org>\n"
@ -31,15 +31,6 @@ msgstr ""
msgid "Suspend" msgid "Suspend"
msgstr "Suspendre" msgstr "Suspendre"
msgid "Offer suspend mode"
msgstr "Offrir le mode suspendre"
msgid "Always suspended"
msgstr "Toujours suspendre"
msgid "Never suspended"
msgstr "Jamais suspendre"
msgid "Common Settings" msgid "Common Settings"
msgstr "Paramètres communs" msgstr "Paramètres communs"
@ -49,12 +40,6 @@ msgstr ""
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "Nombre maximun de clients" msgstr "Nombre maximun de clients"
msgid "Suspend behaviour"
msgstr "Suspendre"
msgid "Client may suspend"
msgstr "Le client peut suspendre"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "VDR-to-VDR Serveur" msgstr "VDR-to-VDR Serveur"
@ -67,6 +52,12 @@ msgstr "Port du serveur VDR-to-VDR"
msgid "Bind to IP" msgid "Bind to IP"
msgstr "Attacher aux IP" msgstr "Attacher aux IP"
msgid "Legacy Client Priority"
msgstr ""
msgid "Client may suspend"
msgstr "Le client peut suspendre"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "" msgstr ""
@ -79,6 +70,9 @@ msgstr "D
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "Port du serveur HTTP" msgstr "Port du serveur HTTP"
msgid "Priority"
msgstr ""
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "Type de Streaming HTTP" msgstr "Type de Streaming HTTP"

View File

@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev 0.5.0\n" "Project-Id-Version: streamdev 0.5.0\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2010-06-19 03:58+0100\n" "PO-Revision-Date: 2010-06-19 03:58+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n" "Language-Team: Italian <vdr@linuxtv.org>\n"
@ -33,15 +33,6 @@ msgstr ""
msgid "Suspend" msgid "Suspend"
msgstr "Sospendi" msgstr "Sospendi"
msgid "Offer suspend mode"
msgstr "Offri mod. sospensione"
msgid "Always suspended"
msgstr "Sempre sospeso"
msgid "Never suspended"
msgstr "Mai sospeso"
msgid "Common Settings" msgid "Common Settings"
msgstr "Impostazioni comuni" msgstr "Impostazioni comuni"
@ -51,12 +42,6 @@ msgstr "Nascondi voce menu principale"
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "Numero massimo di Client" msgstr "Numero massimo di Client"
msgid "Suspend behaviour"
msgstr "Tipo sospensione"
msgid "Client may suspend"
msgstr "Permetti sospensione al Client"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "Server VDR-a-VDR" msgstr "Server VDR-a-VDR"
@ -69,6 +54,12 @@ msgstr "Porta Server VDR-a-VDR"
msgid "Bind to IP" msgid "Bind to IP"
msgstr "IP associati" msgstr "IP associati"
msgid "Legacy Client Priority"
msgstr ""
msgid "Client may suspend"
msgstr "Permetti sospensione al Client"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "" msgstr ""
@ -81,6 +72,9 @@ msgstr "Avvia Server HTTP"
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "Porta Server HTTP" msgstr "Porta Server HTTP"
msgid "Priority"
msgstr ""
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "Tipo flusso HTTP" msgstr "Tipo flusso HTTP"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev 0.5.0\n" "Project-Id-Version: streamdev 0.5.0\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2009-11-26 21:57+0200\n" "PO-Revision-Date: 2009-11-26 21:57+0200\n"
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n" "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: Lithuanian <vdr@linuxtv.org>\n" "Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@ -31,15 +31,6 @@ msgstr ""
msgid "Suspend" msgid "Suspend"
msgstr "Pristabdyti" msgstr "Pristabdyti"
msgid "Offer suspend mode"
msgstr "Klausti dėl sustabdymo"
msgid "Always suspended"
msgstr "Visada stabdyti"
msgid "Never suspended"
msgstr "Niekada nestabdyti"
msgid "Common Settings" msgid "Common Settings"
msgstr "Bendri nustatymai" msgstr "Bendri nustatymai"
@ -49,12 +40,6 @@ msgstr ""
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "Maksimalus klientų skaičius" msgstr "Maksimalus klientų skaičius"
msgid "Suspend behaviour"
msgstr "Pristabdyti veikimą"
msgid "Client may suspend"
msgstr "Klientas gali pristabdyti"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "VDR-su-VDR Serveris" msgstr "VDR-su-VDR Serveris"
@ -67,6 +52,12 @@ msgstr "VDR-su-VDR Serverio portas"
msgid "Bind to IP" msgid "Bind to IP"
msgstr "Pririšti IP" msgstr "Pririšti IP"
msgid "Legacy Client Priority"
msgstr ""
msgid "Client may suspend"
msgstr "Klientas gali pristabdyti"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "" msgstr ""
@ -79,6 +70,9 @@ msgstr "Paleisti HTTP serverį"
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "HTTP serverio portas" msgstr "HTTP serverio portas"
msgid "Priority"
msgstr ""
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "HTTP transliavimo tipas" msgstr "HTTP transliavimo tipas"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev 0.5.0\n" "Project-Id-Version: streamdev 0.5.0\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2008-06-26 15:36+0100\n" "PO-Revision-Date: 2008-06-26 15:36+0100\n"
"Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n" "Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n" "Language-Team: Russian <vdr@linuxtv.org>\n"
@ -31,15 +31,6 @@ msgstr ""
msgid "Suspend" msgid "Suspend"
msgstr "¾áâÐÝÞÒÚÐ" msgstr "¾áâÐÝÞÒÚÐ"
msgid "Offer suspend mode"
msgstr "Предлагать остановку"
msgid "Always suspended"
msgstr "Всегда остановлен"
msgid "Never suspended"
msgstr "Никогда не остановлен"
msgid "Common Settings" msgid "Common Settings"
msgstr "½ÐáâàÞÙÚØ" msgstr "½ÐáâàÞÙÚØ"
@ -49,12 +40,6 @@ msgstr ""
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "¼ÐÚá. ÚÞÛØçÕáâÒÞ ÚÛØÕÝâÞÒ" msgstr "¼ÐÚá. ÚÞÛØçÕáâÒÞ ÚÛØÕÝâÞÒ"
msgid "Suspend behaviour"
msgstr "Поведение остановки"
msgid "Client may suspend"
msgstr "Клиент может останавливать"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "VDR-to-VDR áÕàÒÕà" msgstr "VDR-to-VDR áÕàÒÕà"
@ -67,6 +52,12 @@ msgstr "VDR-to-VDR
msgid "Bind to IP" msgid "Bind to IP"
msgstr "¿àØáÞÕÔØÝØâìáï Ú IP" msgstr "¿àØáÞÕÔØÝØâìáï Ú IP"
msgid "Legacy Client Priority"
msgstr ""
msgid "Client may suspend"
msgstr "ºÛØÕÝâ ÜÞÖÕâ ÞáâÐÝÐÒÛØÒÐâì"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "" msgstr ""
@ -79,6 +70,9 @@ msgstr "
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "HTTP áÕàÒÕà ¿Þàâ" msgstr "HTTP áÕàÒÕà ¿Þàâ"
msgid "Priority"
msgstr ""
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "ÂØß HTTP ßÞâÞÚÐ" msgstr "ÂØß HTTP ßÞâÞÚÐ"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: streamdev_SK\n" "Project-Id-Version: streamdev_SK\n"
"Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n" "Report-Msgid-Bugs-To: <http://www.vdr-developer.org/mantisbt/>\n"
"POT-Creation-Date: 2011-12-11 11:25+0100\n" "POT-Creation-Date: 2012-03-31 15:06+0200\n"
"PO-Revision-Date: 2011-12-11 11:25+0100\n" "PO-Revision-Date: 2011-12-11 11:25+0100\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n" "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <hrala.milan@gmail.com>\n" "Language-Team: Slovak <hrala.milan@gmail.com>\n"
@ -33,15 +33,6 @@ msgstr ""
msgid "Suspend" msgid "Suspend"
msgstr "Pozastavenie" msgstr "Pozastavenie"
msgid "Offer suspend mode"
msgstr "Výber re¾ímu pozastavenia"
msgid "Always suspended"
msgstr "V¾dy pozastavi»"
msgid "Never suspended"
msgstr "Nikdy nepozastavi»"
msgid "Common Settings" msgid "Common Settings"
msgstr "V¹eobecné nastavenia" msgstr "V¹eobecné nastavenia"
@ -51,12 +42,6 @@ msgstr "Schova
msgid "Maximum Number of Clients" msgid "Maximum Number of Clients"
msgstr "Maximály poèet klientov" msgstr "Maximály poèet klientov"
msgid "Suspend behaviour"
msgstr "Správanie preru¹enia"
msgid "Client may suspend"
msgstr "Klient mô¾e pozastavi»"
msgid "VDR-to-VDR Server" msgid "VDR-to-VDR Server"
msgstr "VDR-do-VDR server" msgstr "VDR-do-VDR server"
@ -69,6 +54,12 @@ msgstr "Port serveru pre VDR-do-VDR"
msgid "Bind to IP" msgid "Bind to IP"
msgstr "viaza» na IP" msgstr "viaza» na IP"
msgid "Legacy Client Priority"
msgstr ""
msgid "Client may suspend"
msgstr "Klient mô¾e pozastavi»"
msgid "Loop Prevention" msgid "Loop Prevention"
msgstr "" msgstr ""
@ -81,6 +72,9 @@ msgstr "Spusti
msgid "HTTP Server Port" msgid "HTTP Server Port"
msgstr "Port serveru HTTP" msgstr "Port serveru HTTP"
msgid "Priority"
msgstr ""
msgid "HTTP Streamtype" msgid "HTTP Streamtype"
msgstr "typ prúdu HTTP" msgstr "typ prúdu HTTP"

View File

@ -14,14 +14,16 @@ cStreamdevServerSetup::cStreamdevServerSetup(void) {
MaxClients = 5; MaxClients = 5;
StartVTPServer = true; StartVTPServer = true;
VTPServerPort = 2004; VTPServerPort = 2004;
VTPPriority = 0;
LoopPrevention = false; LoopPrevention = false;
StartHTTPServer = true; StartHTTPServer = true;
HTTPServerPort = 3000; HTTPServerPort = 3000;
HTTPPriority = 0;
HTTPStreamType = stTS; HTTPStreamType = stTS;
StartIGMPServer = false; StartIGMPServer = false;
IGMPClientPort = 1234; IGMPClientPort = 1234;
IGMPPriority = 0;
IGMPStreamType = stTS; IGMPStreamType = stTS;
SuspendMode = smAlways;
AllowSuspend = false; AllowSuspend = false;
strcpy(VTPBindIP, "0.0.0.0"); strcpy(VTPBindIP, "0.0.0.0");
strcpy(HTTPBindIP, "0.0.0.0"); strcpy(HTTPBindIP, "0.0.0.0");
@ -33,17 +35,19 @@ bool cStreamdevServerSetup::SetupParse(const char *Name, const char *Value) {
else if (strcmp(Name, "MaxClients") == 0) MaxClients = atoi(Value); else if (strcmp(Name, "MaxClients") == 0) MaxClients = atoi(Value);
else if (strcmp(Name, "StartServer") == 0) StartVTPServer = atoi(Value); else if (strcmp(Name, "StartServer") == 0) StartVTPServer = atoi(Value);
else if (strcmp(Name, "ServerPort") == 0) VTPServerPort = atoi(Value); else if (strcmp(Name, "ServerPort") == 0) VTPServerPort = atoi(Value);
else if (strcmp(Name, "VTPPriority") == 0) VTPPriority = atoi(Value);
else if (strcmp(Name, "VTPBindIP") == 0) strcpy(VTPBindIP, Value); else if (strcmp(Name, "VTPBindIP") == 0) strcpy(VTPBindIP, Value);
else if (strcmp(Name, "LoopPrevention") == 0) LoopPrevention = atoi(Value); else if (strcmp(Name, "LoopPrevention") == 0) LoopPrevention = atoi(Value);
else if (strcmp(Name, "StartHTTPServer") == 0) StartHTTPServer = atoi(Value); else if (strcmp(Name, "StartHTTPServer") == 0) StartHTTPServer = atoi(Value);
else if (strcmp(Name, "HTTPServerPort") == 0) HTTPServerPort = atoi(Value); else if (strcmp(Name, "HTTPServerPort") == 0) HTTPServerPort = atoi(Value);
else if (strcmp(Name, "HTTPPriority") == 0) HTTPPriority = atoi(Value);
else if (strcmp(Name, "HTTPStreamType") == 0) HTTPStreamType = atoi(Value); else if (strcmp(Name, "HTTPStreamType") == 0) HTTPStreamType = atoi(Value);
else if (strcmp(Name, "HTTPBindIP") == 0) strcpy(HTTPBindIP, Value); else if (strcmp(Name, "HTTPBindIP") == 0) strcpy(HTTPBindIP, Value);
else if (strcmp(Name, "StartIGMPServer") == 0) StartIGMPServer = atoi(Value); else if (strcmp(Name, "StartIGMPServer") == 0) StartIGMPServer = atoi(Value);
else if (strcmp(Name, "IGMPClientPort") == 0) IGMPClientPort = atoi(Value); else if (strcmp(Name, "IGMPClientPort") == 0) IGMPClientPort = atoi(Value);
else if (strcmp(Name, "IGMPPriority") == 0) IGMPPriority = atoi(Value);
else if (strcmp(Name, "IGMPStreamType") == 0) IGMPStreamType = atoi(Value); else if (strcmp(Name, "IGMPStreamType") == 0) IGMPStreamType = atoi(Value);
else if (strcmp(Name, "IGMPBindIP") == 0) strcpy(IGMPBindIP, Value); else if (strcmp(Name, "IGMPBindIP") == 0) strcpy(IGMPBindIP, Value);
else if (strcmp(Name, "SuspendMode") == 0) SuspendMode = atoi(Value);
else if (strcmp(Name, "AllowSuspend") == 0) AllowSuspend = atoi(Value); else if (strcmp(Name, "AllowSuspend") == 0) AllowSuspend = atoi(Value);
else return false; else return false;
return true; return true;
@ -57,12 +61,6 @@ const char* cStreamdevServerMenuSetupPage::StreamTypes[st_Count - 1] = {
"EXT" "EXT"
}; };
const char* cStreamdevServerMenuSetupPage::SuspendModes[sm_Count] = {
trNOOP("Offer suspend mode"),
trNOOP("Always suspended"),
trNOOP("Never suspended")
};
cStreamdevServerMenuSetupPage::cStreamdevServerMenuSetupPage(void) { cStreamdevServerMenuSetupPage::cStreamdevServerMenuSetupPage(void) {
m_NewSetup = StreamdevServerSetup; m_NewSetup = StreamdevServerSetup;
@ -73,37 +71,35 @@ cStreamdevServerMenuSetupPage::~cStreamdevServerMenuSetupPage() {
} }
void cStreamdevServerMenuSetupPage::Set(void) { void cStreamdevServerMenuSetupPage::Set(void) {
static const char* modes[sm_Count];
for (int i = 0; i < sm_Count; i++)
modes[i] = tr(SuspendModes[i]);
int current = Current(); int current = Current();
Clear(); Clear();
AddCategory (tr("Common Settings")); AddCategory (tr("Common Settings"));
Add(new cMenuEditBoolItem(tr("Hide Mainmenu Entry"), &m_NewSetup.HideMenuEntry)); Add(new cMenuEditBoolItem(tr("Hide Mainmenu Entry"), &m_NewSetup.HideMenuEntry));
Add(new cMenuEditIntItem (tr("Maximum Number of Clients"), &m_NewSetup.MaxClients, 0, 100)); Add(new cMenuEditIntItem (tr("Maximum Number of Clients"), &m_NewSetup.MaxClients, 0, 100));
Add(new cMenuEditStraItem(tr("Suspend behaviour"), &m_NewSetup.SuspendMode, sm_Count, modes));
if (m_NewSetup.SuspendMode == smOffer)
Add(new cMenuEditBoolItem(tr("Client may suspend"), &m_NewSetup.AllowSuspend));
AddCategory (tr("VDR-to-VDR Server")); AddCategory (tr("VDR-to-VDR Server"));
Add(new cMenuEditBoolItem(tr("Start VDR-to-VDR Server"), &m_NewSetup.StartVTPServer)); Add(new cMenuEditBoolItem(tr("Start VDR-to-VDR Server"), &m_NewSetup.StartVTPServer));
Add(new cMenuEditIntItem (tr("VDR-to-VDR Server Port"), &m_NewSetup.VTPServerPort, 0, 65535)); Add(new cMenuEditIntItem (tr("VDR-to-VDR Server Port"), &m_NewSetup.VTPServerPort, 0, 65535));
Add(new cMenuEditIpItem (tr("Bind to IP"), m_NewSetup.VTPBindIP)); Add(new cMenuEditIpItem (tr("Bind to IP"), m_NewSetup.VTPBindIP));
Add(new cMenuEditIntItem (tr("Legacy Client Priority"), &m_NewSetup.VTPPriority, MINPRIORITY, MAXPRIORITY));
Add(new cMenuEditBoolItem(tr("Client may suspend"), &m_NewSetup.AllowSuspend));
if (cPluginManager::CallFirstService(LOOP_PREVENTION_SERVICE)) if (cPluginManager::CallFirstService(LOOP_PREVENTION_SERVICE))
Add(new cMenuEditBoolItem(tr("Loop Prevention"), &m_NewSetup.LoopPrevention)); Add(new cMenuEditBoolItem(tr("Loop Prevention"), &m_NewSetup.LoopPrevention));
AddCategory (tr("HTTP Server")); AddCategory (tr("HTTP Server"));
Add(new cMenuEditBoolItem(tr("Start HTTP Server"), &m_NewSetup.StartHTTPServer)); Add(new cMenuEditBoolItem(tr("Start HTTP Server"), &m_NewSetup.StartHTTPServer));
Add(new cMenuEditIntItem (tr("HTTP Server Port"), &m_NewSetup.HTTPServerPort, 0, 65535)); Add(new cMenuEditIntItem (tr("HTTP Server Port"), &m_NewSetup.HTTPServerPort, 0, 65535));
Add(new cMenuEditStraItem(tr("HTTP Streamtype"), &m_NewSetup.HTTPStreamType, st_Count - 1, StreamTypes));
Add(new cMenuEditIpItem (tr("Bind to IP"), m_NewSetup.HTTPBindIP)); Add(new cMenuEditIpItem (tr("Bind to IP"), m_NewSetup.HTTPBindIP));
Add(new cMenuEditIntItem (tr("Priority"), &m_NewSetup.HTTPPriority, MINPRIORITY, MAXPRIORITY));
Add(new cMenuEditStraItem(tr("HTTP Streamtype"), &m_NewSetup.HTTPStreamType, st_Count - 1, StreamTypes));
AddCategory (tr("Multicast Streaming Server")); AddCategory (tr("Multicast Streaming Server"));
Add(new cMenuEditBoolItem(tr("Start IGMP Server"), &m_NewSetup.StartIGMPServer)); Add(new cMenuEditBoolItem(tr("Start IGMP Server"), &m_NewSetup.StartIGMPServer));
Add(new cMenuEditIntItem (tr("Multicast Client Port"), &m_NewSetup.IGMPClientPort, 0, 65535)); Add(new cMenuEditIntItem (tr("Multicast Client Port"), &m_NewSetup.IGMPClientPort, 0, 65535));
Add(new cMenuEditStraItem(tr("Multicast Streamtype"), &m_NewSetup.IGMPStreamType, st_Count - 1, StreamTypes));
Add(new cMenuEditIpItem (tr("Bind to IP"), m_NewSetup.IGMPBindIP)); Add(new cMenuEditIpItem (tr("Bind to IP"), m_NewSetup.IGMPBindIP));
Add(new cMenuEditIntItem (tr("Priority"), &m_NewSetup.IGMPPriority, MINPRIORITY, MAXPRIORITY));
Add(new cMenuEditStraItem(tr("Multicast Streamtype"), &m_NewSetup.IGMPStreamType, st_Count - 1, StreamTypes));
SetCurrent(Get(current)); SetCurrent(Get(current));
Display(); Display();
} }
@ -138,16 +134,18 @@ void cStreamdevServerMenuSetupPage::Store(void) {
SetupStore("StartServer", m_NewSetup.StartVTPServer); SetupStore("StartServer", m_NewSetup.StartVTPServer);
SetupStore("ServerPort", m_NewSetup.VTPServerPort); SetupStore("ServerPort", m_NewSetup.VTPServerPort);
SetupStore("VTPBindIP", m_NewSetup.VTPBindIP); SetupStore("VTPBindIP", m_NewSetup.VTPBindIP);
SetupStore("VTPPriority", m_NewSetup.VTPPriority);
SetupStore("LoopPrevention", m_NewSetup.LoopPrevention); SetupStore("LoopPrevention", m_NewSetup.LoopPrevention);
SetupStore("StartHTTPServer", m_NewSetup.StartHTTPServer); SetupStore("StartHTTPServer", m_NewSetup.StartHTTPServer);
SetupStore("HTTPServerPort", m_NewSetup.HTTPServerPort); SetupStore("HTTPServerPort", m_NewSetup.HTTPServerPort);
SetupStore("HTTPStreamType", m_NewSetup.HTTPStreamType);
SetupStore("HTTPBindIP", m_NewSetup.HTTPBindIP); SetupStore("HTTPBindIP", m_NewSetup.HTTPBindIP);
SetupStore("HTTPPriority", m_NewSetup.HTTPPriority);
SetupStore("HTTPStreamType", m_NewSetup.HTTPStreamType);
SetupStore("StartIGMPServer", m_NewSetup.StartIGMPServer); SetupStore("StartIGMPServer", m_NewSetup.StartIGMPServer);
SetupStore("IGMPClientPort", m_NewSetup.IGMPClientPort); SetupStore("IGMPClientPort", m_NewSetup.IGMPClientPort);
SetupStore("IGMPStreamType", m_NewSetup.IGMPStreamType);
SetupStore("IGMPBindIP", m_NewSetup.IGMPBindIP); SetupStore("IGMPBindIP", m_NewSetup.IGMPBindIP);
SetupStore("SuspendMode", m_NewSetup.SuspendMode); SetupStore("IGMPPriority", m_NewSetup.IGMPPriority);
SetupStore("IGMPStreamType", m_NewSetup.IGMPStreamType);
SetupStore("AllowSuspend", m_NewSetup.AllowSuspend); SetupStore("AllowSuspend", m_NewSetup.AllowSuspend);
StreamdevServerSetup = m_NewSetup; StreamdevServerSetup = m_NewSetup;
@ -155,11 +153,3 @@ void cStreamdevServerMenuSetupPage::Store(void) {
if (restart) if (restart)
cStreamdevServer::Initialize(); cStreamdevServer::Initialize();
} }
eOSState cStreamdevServerMenuSetupPage::ProcessKey(eKeys Key) {
int oldMode = m_NewSetup.SuspendMode;
eOSState state = cMenuSetupPage::ProcessKey(Key);
if (oldMode != m_NewSetup.SuspendMode)
Set();
return state;
}

View File

@ -17,17 +17,19 @@ struct cStreamdevServerSetup {
int StartVTPServer; int StartVTPServer;
int VTPServerPort; int VTPServerPort;
char VTPBindIP[20]; char VTPBindIP[20];
int VTPPriority;
int AllowSuspend;
int LoopPrevention; int LoopPrevention;
int StartHTTPServer; int StartHTTPServer;
int HTTPServerPort; int HTTPServerPort;
int HTTPPriority;
int HTTPStreamType; int HTTPStreamType;
char HTTPBindIP[20]; char HTTPBindIP[20];
int StartIGMPServer; int StartIGMPServer;
int IGMPClientPort; int IGMPClientPort;
int IGMPPriority;
int IGMPStreamType; int IGMPStreamType;
char IGMPBindIP[20]; char IGMPBindIP[20];
int SuspendMode;
int AllowSuspend;
}; };
extern cStreamdevServerSetup StreamdevServerSetup; extern cStreamdevServerSetup StreamdevServerSetup;
@ -35,14 +37,12 @@ extern cStreamdevServerSetup StreamdevServerSetup;
class cStreamdevServerMenuSetupPage: public cMenuSetupPage { class cStreamdevServerMenuSetupPage: public cMenuSetupPage {
private: private:
static const char* StreamTypes[]; static const char* StreamTypes[];
static const char* SuspendModes[];
cStreamdevServerSetup m_NewSetup; cStreamdevServerSetup m_NewSetup;
void AddCategory(const char *Title); void AddCategory(const char *Title);
void Set(); void Set();
protected: protected:
virtual void Store(void); virtual void Store(void);
virtual eOSState ProcessKey(eKeys Key);
public: public:
cStreamdevServerMenuSetupPage(void); cStreamdevServerMenuSetupPage(void);