diff --git a/HISTORY b/HISTORY index 639ee35..9e91388 100644 --- a/HISTORY +++ b/HISTORY @@ -7,12 +7,15 @@ VDR Plugin 'streamdev' Revision History anonymous user) - New special meaning "show current channel" when channel 0 is requested. 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 option has been added. - 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 - With VDR 1.7.25 priorities down to -99 will be used. Please update "Minimum Priority" in streamdev-client setup. diff --git a/common.h b/common.h index 2092de6..45f99c4 100644 --- a/common.h +++ b/common.h @@ -49,13 +49,6 @@ enum eStreamType { st_Count }; -enum eSuspendMode { - smOffer, - smAlways, - smNever, - sm_Count -}; - enum eSocketId { siLive, siReplay, diff --git a/server/connection.c b/server/connection.c index b6df6fd..9c7ae31 100644 --- a/server/connection.c +++ b/server/connection.c @@ -14,71 +14,6 @@ #include #include -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): cTBSocket(Type), @@ -87,14 +22,13 @@ cServerConnection::cServerConnection(const char *Protocol, int Type): m_Pending(false), m_ReadBytes(0), m_WriteBytes(0), - m_WriteIndex(0) + m_WriteIndex(0), + m_SwitchTo(NULL) { - m_SwitchLive = new cSwitchLive(); } cServerConnection::~cServerConnection() { - delete m_SwitchLive; } const cChannel* cServerConnection::ChannelFromString(const char *String, int *Apid, int *Dpid) { @@ -264,99 +198,6 @@ bool cServerConnection::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) { return device == cTransferControl::ReceiverDevice() || @@ -367,59 +208,40 @@ cDevice *cServerConnection::GetDevice(const cChannel *Channel, int Priority) { // turn off the streams of this connection Detach(); - // This call may detach receivers of the device it returns + 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) { // can't switch - continue the current stream 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()); } + else if (!device->IsTunedToTransponder(Channel) && UsedByLiveTV(device)) { + // switched away live TV + m_SwitchTo = Channel; + } return device; } bool cServerConnection::ProvidesChannel(const cChannel *Channel, int Priority) { - cDevice *device = CheckDevice(Channel, Priority, false); - if (!device || (StreamdevServerSetup.SuspendMode != smAlways - && !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); - } + cDevice *device = cDevice::GetDevice(Channel, Priority, false, true); + if (!device) + dsyslog("streamdev: No device provides channel %d (%s) at priority %d", Channel->Number(), Channel->Name(), Priority); return device; } 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 diff --git a/server/connection.h b/server/connection.h index 3c6d9a3..0d51da8 100644 --- a/server/connection.h +++ b/server/connection.h @@ -15,7 +15,6 @@ typedef std::pair tStrStr; class cChannel; class cDevice; -class cSwitchLive; /* Basic capabilities of a straight text-based protocol, most functions virtual to support more complicated protocols */ @@ -34,7 +33,8 @@ private: uint m_WriteBytes; 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; diff --git a/server/connectionHTTP.c b/server/connectionHTTP.c index 695b6ee..63eb22e 100644 --- a/server/connectionHTTP.c +++ b/server/connectionHTTP.c @@ -150,11 +150,11 @@ bool cConnectionHTTP::ProcessRequest(void) return Respond("%s", true, m_ChannelList->HttpHeader().c_str()); else if (m_Channel != NULL) { cDevice *device = NULL; - if (ProvidesChannel(m_Channel, 0)) - device = GetDevice(m_Channel, 0); + if (ProvidesChannel(m_Channel, StreamdevServerSetup.HTTPPriority)) + device = GetDevice(m_Channel, StreamdevServerSetup.HTTPPriority); if (device != NULL) { 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)) { m_LiveStreamer->SetDevice(device); if (!SetDSCP()) diff --git a/server/connectionIGMP.c b/server/connectionIGMP.c index 328fe44..1f8f3d8 100644 --- a/server/connectionIGMP.c +++ b/server/connectionIGMP.c @@ -43,11 +43,11 @@ bool cConnectionIGMP::SetChannel(cChannel *Channel, in_addr_t Dst) void cConnectionIGMP::Welcome() { cDevice *device = NULL; - if (ProvidesChannel(m_Channel, 0)) - device = GetDevice(m_Channel, 0); + if (ProvidesChannel(m_Channel, StreamdevServerSetup.IGMPPriority)) + device = GetDevice(m_Channel, StreamdevServerSetup.IGMPPriority); if (device != NULL) { 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)) { m_LiveStreamer->SetDevice(device); if (!SetDSCP()) diff --git a/server/connectionVTP.c b/server/connectionVTP.c index 9053d0f..930b4fa 100644 --- a/server/connectionVTP.c +++ b/server/connectionVTP.c @@ -733,6 +733,7 @@ cConnectionVTP::cConnectionVTP(void): m_DataSocket(NULL), m_LastCommand(NULL), m_StreamType(stTSPIDS), + m_ClientVersion(0), m_FiltersSupport(false), m_RecPlayer(NULL), m_TuneChannel(NULL), @@ -773,7 +774,7 @@ bool cConnectionVTP::Abort(void) const 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) @@ -827,6 +828,7 @@ bool cConnectionVTP::Command(char *Cmd) } 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, "PORT") == 0) return CmdPORT(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); } +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) { const cChannel *chan; @@ -914,6 +927,10 @@ bool cConnectionVTP::CmdPROV(char *Opts) if ((chan = ChannelFromString(Opts)) == NULL) 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); if (ProvidesChannel(chan, prio)) { @@ -921,10 +938,20 @@ bool cConnectionVTP::CmdPROV(char *Opts) m_TunePriority = prio; return Respond(220, "Channel available"); } - else { - m_TuneChannel = NULL; - return Respond(560, "Channel not available"); + // 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; + return Respond(560, "Channel not available"); } bool cConnectionVTP::CmdPORT(char *Opts) @@ -1286,10 +1313,9 @@ bool cConnectionVTP::CmdQUIT(void) bool cConnectionVTP::CmdSUSP(void) { - if (StreamdevServerSetup.SuspendMode == smAlways || cSuspendCtl::IsActive()) + if (cSuspendCtl::IsActive()) return Respond(220, "Server is suspended"); - else if (StreamdevServerSetup.SuspendMode == smOffer - && StreamdevServerSetup.AllowSuspend) { + else if (StreamdevServerSetup.AllowSuspend) { cControl::Launch(new cSuspendCtl); cControl::Attach(); return Respond(220, "Server is suspended"); diff --git a/server/connectionVTP.h b/server/connectionVTP.h index 5a5f4b2..bca5ef1 100644 --- a/server/connectionVTP.h +++ b/server/connectionVTP.h @@ -28,6 +28,7 @@ private: char *m_LastCommand; eStreamType m_StreamType; + unsigned int m_ClientVersion; bool m_FiltersSupport; bool m_LoopPrevention; RecPlayer *m_RecPlayer; @@ -62,6 +63,7 @@ public: virtual bool Command(char *Cmd); bool CmdCAPS(char *Opts); + bool CmdVERS(char *Opts); bool CmdPROV(char *Opts); bool CmdPORT(char *Opts); bool CmdREAD(char *Opts); diff --git a/server/menu.c b/server/menu.c index 28b25f8..d51825e 100644 --- a/server/menu.c +++ b/server/menu.c @@ -24,7 +24,7 @@ cStreamdevServerMenu::~cStreamdevServerMenu() { } 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() { @@ -47,7 +47,7 @@ eOSState cStreamdevServerMenu::Disconnect() { } eOSState cStreamdevServerMenu::Suspend() { - if (StreamdevServerSetup.SuspendMode == smOffer && !cSuspendCtl::IsActive()) { + if (!cSuspendCtl::IsActive()) { cControl::Launch(new cSuspendCtl); return osBack; } diff --git a/server/po/de_DE.po b/server/po/de_DE.po index ccc8a7a..37fa078 100644 --- a/server/po/de_DE.po +++ b/server/po/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: Frank Schmirler \n" "Language-Team: German \n" @@ -31,15 +31,6 @@ msgstr "Trennen" msgid "Suspend" msgstr "Pausieren" -msgid "Offer suspend mode" -msgstr "Pausieren anbieten" - -msgid "Always suspended" -msgstr "Immer pausiert" - -msgid "Never suspended" -msgstr "Nie pausiert" - msgid "Common Settings" msgstr "Allgemeines" @@ -49,12 +40,6 @@ msgstr "Hauptmen msgid "Maximum Number of Clients" msgstr "Maximalanzahl an Clients" -msgid "Suspend behaviour" -msgstr "Pausierverhalten" - -msgid "Client may suspend" -msgstr "Client darf pausieren" - msgid "VDR-to-VDR Server" msgstr "VDR-zu-VDR Server" @@ -67,6 +52,12 @@ msgstr "Port des VDR-zu-VDR Servers" msgid "Bind to IP" msgstr "Binde an IP" +msgid "Legacy Client Priority" +msgstr "Prioritt fr alte Clients" + +msgid "Client may suspend" +msgstr "Client darf pausieren" + msgid "Loop Prevention" msgstr "Schleifen verhindern" @@ -79,6 +70,9 @@ msgstr "HTTP Server starten" msgid "HTTP Server Port" msgstr "Port des HTTP Servers" +msgid "Priority" +msgstr "Prioritt" + msgid "HTTP Streamtype" msgstr "HTTP Streamtyp" diff --git a/server/po/es_ES.po b/server/po/es_ES.po index 94edc70..28842c6 100644 --- a/server/po/es_ES.po +++ b/server/po/es_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: Javier Bradineras \n" "Language-Team: Spanish \n" @@ -31,15 +31,6 @@ msgstr "" msgid "Suspend" msgstr "Suspender" -msgid "Offer suspend mode" -msgstr "Ofrecer modo de suspensin" - -msgid "Always suspended" -msgstr "Siempre suspendido" - -msgid "Never suspended" -msgstr "Nunca suspendido" - msgid "Common Settings" msgstr "Configuracin comn" @@ -49,12 +40,6 @@ msgstr "" msgid "Maximum Number of Clients" msgstr "Numero mximo de clientes" -msgid "Suspend behaviour" -msgstr "Comportamiento de la suspensin" - -msgid "Client may suspend" -msgstr "Permitir suspender al cliente" - msgid "VDR-to-VDR Server" msgstr "Servidor VDR-a-VDR" @@ -67,6 +52,12 @@ msgstr "Puerto del Servidor VDR-a-VDR" msgid "Bind to IP" msgstr "IP asociada" +msgid "Legacy Client Priority" +msgstr "" + +msgid "Client may suspend" +msgstr "Permitir suspender al cliente" + msgid "Loop Prevention" msgstr "" @@ -79,6 +70,9 @@ msgstr "Iniciar Servidor HTTP" msgid "HTTP Server Port" msgstr "Puerto del Servidor HTTP" +msgid "Priority" +msgstr "" + msgid "HTTP Streamtype" msgstr "Tipo de flujo HTTP" diff --git a/server/po/fi_FI.po b/server/po/fi_FI.po index 0daabaf..97fd47c 100644 --- a/server/po/fi_FI.po +++ b/server/po/fi_FI.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: Rolf Ahrenberg\n" "Language-Team: Finnish \n" @@ -31,15 +31,6 @@ msgstr "Katkaise" msgid "Suspend" msgstr "Pysäytä" -msgid "Offer suspend mode" -msgstr "tyrkytä" - -msgid "Always suspended" -msgstr "aina" - -msgid "Never suspended" -msgstr "ei koskaan" - msgid "Common Settings" msgstr "Yleiset asetukset" @@ -49,12 +40,6 @@ msgstr "Piilota valinta päävalikosta" msgid "Maximum Number of Clients" 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" msgstr "VDR-palvelin" @@ -67,6 +52,12 @@ msgstr "VDR-palvelimen portti" msgid "Bind to IP" msgstr "Sido osoitteeseen" +msgid "Legacy Client Priority" +msgstr "" + +msgid "Client may suspend" +msgstr "Asiakas saa pysäyttää palvelimen" + msgid "Loop Prevention" msgstr "Estä asiakaslaitesilmukat" @@ -79,6 +70,9 @@ msgstr "Käynnistä HTTP-palvelin" msgid "HTTP Server Port" msgstr "HTTP-palvelimen portti" +msgid "Priority" +msgstr "" + msgid "HTTP Streamtype" msgstr "HTTP-lähetysmuoto" diff --git a/server/po/fr_FR.po b/server/po/fr_FR.po index cb0bd08..7d9128b 100644 --- a/server/po/fr_FR.po +++ b/server/po/fr_FR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: micky979 \n" "Language-Team: French \n" @@ -31,15 +31,6 @@ msgstr "" msgid "Suspend" 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" msgstr "Paramtres communs" @@ -49,12 +40,6 @@ msgstr "" msgid "Maximum Number of 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" msgstr "VDR-to-VDR Serveur" @@ -67,6 +52,12 @@ msgstr "Port du serveur VDR-to-VDR" msgid "Bind to IP" msgstr "Attacher aux IP" +msgid "Legacy Client Priority" +msgstr "" + +msgid "Client may suspend" +msgstr "Le client peut suspendre" + msgid "Loop Prevention" msgstr "" @@ -79,6 +70,9 @@ msgstr "D msgid "HTTP Server Port" msgstr "Port du serveur HTTP" +msgid "Priority" +msgstr "" + msgid "HTTP Streamtype" msgstr "Type de Streaming HTTP" diff --git a/server/po/it_IT.po b/server/po/it_IT.po index 49dea65..cb00f29 100644 --- a/server/po/it_IT.po +++ b/server/po/it_IT.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: Diego Pierotto \n" "Language-Team: Italian \n" @@ -33,15 +33,6 @@ msgstr "" msgid "Suspend" 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" msgstr "Impostazioni comuni" @@ -51,12 +42,6 @@ msgstr "Nascondi voce menu principale" msgid "Maximum Number of Clients" 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" msgstr "Server VDR-a-VDR" @@ -69,6 +54,12 @@ msgstr "Porta Server VDR-a-VDR" msgid "Bind to IP" msgstr "IP associati" +msgid "Legacy Client Priority" +msgstr "" + +msgid "Client may suspend" +msgstr "Permetti sospensione al Client" + msgid "Loop Prevention" msgstr "" @@ -81,6 +72,9 @@ msgstr "Avvia Server HTTP" msgid "HTTP Server Port" msgstr "Porta Server HTTP" +msgid "Priority" +msgstr "" + msgid "HTTP Streamtype" msgstr "Tipo flusso HTTP" diff --git a/server/po/lt_LT.po b/server/po/lt_LT.po index c2ef086..1af7c75 100644 --- a/server/po/lt_LT.po +++ b/server/po/lt_LT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: Valdemaras Pipiras \n" "Language-Team: Lithuanian \n" @@ -31,15 +31,6 @@ msgstr "" msgid "Suspend" 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" msgstr "Bendri nustatymai" @@ -49,12 +40,6 @@ msgstr "" msgid "Maximum Number of Clients" msgstr "Maksimalus klientų skaičius" -msgid "Suspend behaviour" -msgstr "Pristabdyti veikimą" - -msgid "Client may suspend" -msgstr "Klientas gali pristabdyti" - msgid "VDR-to-VDR Server" msgstr "VDR-su-VDR Serveris" @@ -67,6 +52,12 @@ msgstr "VDR-su-VDR Serverio portas" msgid "Bind to IP" msgstr "Pririšti IP" +msgid "Legacy Client Priority" +msgstr "" + +msgid "Client may suspend" +msgstr "Klientas gali pristabdyti" + msgid "Loop Prevention" msgstr "" @@ -79,6 +70,9 @@ msgstr "Paleisti HTTP serverį" msgid "HTTP Server Port" msgstr "HTTP serverio portas" +msgid "Priority" +msgstr "" + msgid "HTTP Streamtype" msgstr "HTTP transliavimo tipas" diff --git a/server/po/ru_RU.po b/server/po/ru_RU.po index 3e277e8..3fdf5c7 100644 --- a/server/po/ru_RU.po +++ b/server/po/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev 0.5.0\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: Oleg Roitburd \n" "Language-Team: Russian \n" @@ -31,15 +31,6 @@ msgstr "" msgid "Suspend" msgstr "" -msgid "Offer suspend mode" -msgstr " " - -msgid "Always suspended" -msgstr " " - -msgid "Never suspended" -msgstr " " - msgid "Common Settings" msgstr "" @@ -49,12 +40,6 @@ msgstr "" msgid "Maximum Number of Clients" msgstr ". " -msgid "Suspend behaviour" -msgstr " " - -msgid "Client may suspend" -msgstr " " - msgid "VDR-to-VDR Server" msgstr "VDR-to-VDR " @@ -67,6 +52,12 @@ msgstr "VDR-to-VDR msgid "Bind to IP" msgstr " IP" +msgid "Legacy Client Priority" +msgstr "" + +msgid "Client may suspend" +msgstr " " + msgid "Loop Prevention" msgstr "" @@ -79,6 +70,9 @@ msgstr " msgid "HTTP Server Port" msgstr "HTTP " +msgid "Priority" +msgstr "" + msgid "HTTP Streamtype" msgstr " HTTP " diff --git a/server/po/sk_SK.po b/server/po/sk_SK.po index 431a876..8c2a152 100644 --- a/server/po/sk_SK.po +++ b/server/po/sk_SK.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: streamdev_SK\n" "Report-Msgid-Bugs-To: \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" "Last-Translator: Milan Hrala \n" "Language-Team: Slovak \n" @@ -33,15 +33,6 @@ msgstr "" msgid "Suspend" msgstr "Pozastavenie" -msgid "Offer suspend mode" -msgstr "Vber remu pozastavenia" - -msgid "Always suspended" -msgstr "Vdy pozastavi" - -msgid "Never suspended" -msgstr "Nikdy nepozastavi" - msgid "Common Settings" msgstr "Veobecn nastavenia" @@ -51,12 +42,6 @@ msgstr "Schova msgid "Maximum Number of Clients" msgstr "Maximly poet klientov" -msgid "Suspend behaviour" -msgstr "Sprvanie preruenia" - -msgid "Client may suspend" -msgstr "Klient me pozastavi" - msgid "VDR-to-VDR Server" msgstr "VDR-do-VDR server" @@ -69,6 +54,12 @@ msgstr "Port serveru pre VDR-do-VDR" msgid "Bind to IP" msgstr "viaza na IP" +msgid "Legacy Client Priority" +msgstr "" + +msgid "Client may suspend" +msgstr "Klient me pozastavi" + msgid "Loop Prevention" msgstr "" @@ -81,6 +72,9 @@ msgstr "Spusti msgid "HTTP Server Port" msgstr "Port serveru HTTP" +msgid "Priority" +msgstr "" + msgid "HTTP Streamtype" msgstr "typ prdu HTTP" diff --git a/server/setup.c b/server/setup.c index 381b8d8..862c917 100644 --- a/server/setup.c +++ b/server/setup.c @@ -14,14 +14,16 @@ cStreamdevServerSetup::cStreamdevServerSetup(void) { MaxClients = 5; StartVTPServer = true; VTPServerPort = 2004; + VTPPriority = 0; LoopPrevention = false; StartHTTPServer = true; HTTPServerPort = 3000; + HTTPPriority = 0; HTTPStreamType = stTS; StartIGMPServer = false; IGMPClientPort = 1234; + IGMPPriority = 0; IGMPStreamType = stTS; - SuspendMode = smAlways; AllowSuspend = false; strcpy(VTPBindIP, "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, "StartServer") == 0) StartVTPServer = 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, "LoopPrevention") == 0) LoopPrevention = atoi(Value); else if (strcmp(Name, "StartHTTPServer") == 0) StartHTTPServer = 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, "HTTPBindIP") == 0) strcpy(HTTPBindIP, Value); else if (strcmp(Name, "StartIGMPServer") == 0) StartIGMPServer = 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, "IGMPBindIP") == 0) strcpy(IGMPBindIP, Value); - else if (strcmp(Name, "SuspendMode") == 0) SuspendMode = atoi(Value); else if (strcmp(Name, "AllowSuspend") == 0) AllowSuspend = atoi(Value); else return false; return true; @@ -57,12 +61,6 @@ const char* cStreamdevServerMenuSetupPage::StreamTypes[st_Count - 1] = { "EXT" }; -const char* cStreamdevServerMenuSetupPage::SuspendModes[sm_Count] = { - trNOOP("Offer suspend mode"), - trNOOP("Always suspended"), - trNOOP("Never suspended") -}; - cStreamdevServerMenuSetupPage::cStreamdevServerMenuSetupPage(void) { m_NewSetup = StreamdevServerSetup; @@ -73,37 +71,35 @@ cStreamdevServerMenuSetupPage::~cStreamdevServerMenuSetupPage() { } 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(); Clear(); AddCategory (tr("Common Settings")); 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 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")); 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 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)) Add(new cMenuEditBoolItem(tr("Loop Prevention"), &m_NewSetup.LoopPrevention)); AddCategory (tr("HTTP Server")); Add(new cMenuEditBoolItem(tr("Start HTTP Server"), &m_NewSetup.StartHTTPServer)); 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 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")); Add(new cMenuEditBoolItem(tr("Start IGMP Server"), &m_NewSetup.StartIGMPServer)); 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 cMenuEditIntItem (tr("Priority"), &m_NewSetup.IGMPPriority, MINPRIORITY, MAXPRIORITY)); + Add(new cMenuEditStraItem(tr("Multicast Streamtype"), &m_NewSetup.IGMPStreamType, st_Count - 1, StreamTypes)); SetCurrent(Get(current)); Display(); } @@ -138,16 +134,18 @@ void cStreamdevServerMenuSetupPage::Store(void) { SetupStore("StartServer", m_NewSetup.StartVTPServer); SetupStore("ServerPort", m_NewSetup.VTPServerPort); SetupStore("VTPBindIP", m_NewSetup.VTPBindIP); + SetupStore("VTPPriority", m_NewSetup.VTPPriority); SetupStore("LoopPrevention", m_NewSetup.LoopPrevention); SetupStore("StartHTTPServer", m_NewSetup.StartHTTPServer); SetupStore("HTTPServerPort", m_NewSetup.HTTPServerPort); - SetupStore("HTTPStreamType", m_NewSetup.HTTPStreamType); SetupStore("HTTPBindIP", m_NewSetup.HTTPBindIP); + SetupStore("HTTPPriority", m_NewSetup.HTTPPriority); + SetupStore("HTTPStreamType", m_NewSetup.HTTPStreamType); SetupStore("StartIGMPServer", m_NewSetup.StartIGMPServer); SetupStore("IGMPClientPort", m_NewSetup.IGMPClientPort); - SetupStore("IGMPStreamType", m_NewSetup.IGMPStreamType); 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); StreamdevServerSetup = m_NewSetup; @@ -155,11 +153,3 @@ void cStreamdevServerMenuSetupPage::Store(void) { if (restart) 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; -} diff --git a/server/setup.h b/server/setup.h index 4b5eb50..aa66378 100644 --- a/server/setup.h +++ b/server/setup.h @@ -17,17 +17,19 @@ struct cStreamdevServerSetup { int StartVTPServer; int VTPServerPort; char VTPBindIP[20]; + int VTPPriority; + int AllowSuspend; int LoopPrevention; int StartHTTPServer; int HTTPServerPort; + int HTTPPriority; int HTTPStreamType; char HTTPBindIP[20]; int StartIGMPServer; int IGMPClientPort; + int IGMPPriority; int IGMPStreamType; char IGMPBindIP[20]; - int SuspendMode; - int AllowSuspend; }; extern cStreamdevServerSetup StreamdevServerSetup; @@ -35,14 +37,12 @@ extern cStreamdevServerSetup StreamdevServerSetup; class cStreamdevServerMenuSetupPage: public cMenuSetupPage { private: static const char* StreamTypes[]; - static const char* SuspendModes[]; cStreamdevServerSetup m_NewSetup; void AddCategory(const char *Title); void Set(); protected: virtual void Store(void); - virtual eOSState ProcessKey(eKeys Key); public: cStreamdevServerMenuSetupPage(void);