mirror of
				https://github.com/rofafor/vdr-plugin-femon.git
				synced 2023-10-10 11:36:53 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 7da8cb2110 | ||
|  | e2fb9e994a | 
							
								
								
									
										18
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -176,3 +176,21 @@ VDR Plugin 'femon' Revision History | ||||
|  | ||||
| - Updated for vdr-1.3.31. | ||||
| - Added preliminary svdrp and service support. | ||||
|  | ||||
| 2005-10-04: Version 0.9.4 | ||||
|  | ||||
| - Updated for vdr-1.3.34. | ||||
| - Added Enigma theme (Thanks to Rolf Hoverath). | ||||
| - Added EgalsTry theme (Thanks to Uwe Hanke). | ||||
| - Added option to disable rounded corners. | ||||
|  | ||||
| 2005-11-13: Version 0.9.5 | ||||
|  | ||||
| - Updated for vdr-1.3.36. | ||||
| - Added french translation (Thanks to Nicolas Huillard). | ||||
| - Enabled bitrate commands via SVDRP. | ||||
| - Added new SVDRP commands. | ||||
| - Modified femon service without incrementing version number. | ||||
| - Added "Duotone" theme for 2bpp on screen displays. | ||||
| - Fixed crash bug in femonreceiver. | ||||
| - Fixed setup page bug (Thanks to Thomas G<>nther for reporting this one). | ||||
|   | ||||
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							| @@ -16,11 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).h | awk '{ pri | ||||
| ### The C++ compiler and options: | ||||
|  | ||||
| CXX      ?= g++ | ||||
| ifdef FEMON_DEBUG | ||||
| CXXFLAGS ?= -g -Wall -Woverloaded-virtual -fPIC | ||||
| else | ||||
| CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual -fPIC | ||||
| endif | ||||
| CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual | ||||
|  | ||||
| ### The directory environment: | ||||
|  | ||||
|   | ||||
							
								
								
									
										5
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								README
									
									
									
									
									
								
							| @@ -77,9 +77,8 @@ make plugins | ||||
|  | ||||
| Notes: | ||||
|  | ||||
| - The plugin supports only those DVB cards with _one_ frontend (do any cards | ||||
|   with multiple frontends even exist?), because I haven't yet figured howto do | ||||
|   it without patching the VDR core. | ||||
| - The plugin supports only those DVB cards with _one_ frontend, because I | ||||
|   haven't yet figured howto do it without patching the VDR core. | ||||
|  | ||||
| - Disable the stream analyze to speed up heavy zapping sessions. | ||||
|  | ||||
|   | ||||
							
								
								
									
										124
									
								
								femon.c
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								femon.c
									
									
									
									
									
								
							| @@ -6,6 +6,7 @@ | ||||
|  * $Id$ | ||||
|  */ | ||||
|  | ||||
| #include <vdr/remote.h> | ||||
| #include "femoncfg.h" | ||||
| #include "femoni18n.h" | ||||
| #include "femonreceiver.h" | ||||
| @@ -14,20 +15,22 @@ | ||||
| #include "femontools.h" | ||||
| #include "femon.h" | ||||
|  | ||||
| #if VDRVERSNUM && VDRVERSNUM < 10331 | ||||
| #error "You don't exist! Go away!" | ||||
| #if defined(VDRVERSNUM) && VDRVERSNUM < 10336 | ||||
| #error "You don't exist! Go away! Upgrade yourself!" | ||||
| #endif | ||||
|  | ||||
| cPluginFemon::cPluginFemon(void) | ||||
| cPluginFemon::cPluginFemon() | ||||
| { | ||||
|   // Initialize any member variables here. | ||||
|   // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL | ||||
|   // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
| } | ||||
|  | ||||
| cPluginFemon::~cPluginFemon() | ||||
| { | ||||
|   // Clean up after yourself! | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
| } | ||||
|  | ||||
| const char *cPluginFemon::CommandLineHelp(void) | ||||
| @@ -68,7 +71,8 @@ void cPluginFemon::Housekeeping(void) | ||||
| cOsdObject *cPluginFemon::MainMenuAction(void) | ||||
| { | ||||
|   // Perform the action when selected from the main VDR menu. | ||||
|   return new cFemonOsd(); | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   return cFemonOsd::Instance(true); | ||||
| } | ||||
|  | ||||
| bool cPluginFemon::SetupParse(const char *Name, const char *Value) | ||||
| @@ -80,6 +84,7 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value) | ||||
|   else if (!strcasecmp(Name, "Position"))       femonConfig.position       = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "OSDHeight"))      femonConfig.osdheight      = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "OSDOffset"))      femonConfig.osdoffset      = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "Skin"))           femonConfig.skin           = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "Theme"))          femonConfig.theme          = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "ShowCASystem"))   femonConfig.showcasystem   = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "RedLimit"))       femonConfig.redlimit       = atoi(Value); | ||||
| @@ -105,8 +110,9 @@ bool cPluginFemon::Service(const char *Id, void *Data) | ||||
|      data->fe_signal = getSignal(ndx); | ||||
|      data->fe_ber = getBER(ndx); | ||||
|      data->fe_unc = getUNC(ndx); | ||||
|      data->video_bitrate = getVideoBitrate(); | ||||
|      data->audio_bitrate = getAudioBitrate(); | ||||
|      data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0; | ||||
|      data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0; | ||||
|      data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0; | ||||
|      return true; | ||||
|      } | ||||
|  | ||||
| @@ -116,6 +122,14 @@ bool cPluginFemon::Service(const char *Id, void *Data) | ||||
| const char **cPluginFemon::SVDRPHelpPages(void) | ||||
| {  | ||||
|   static const char *HelpPages[] = { | ||||
|     "OPEN\n" | ||||
|     "    Open femon plugin.", | ||||
|     "QUIT\n" | ||||
|     "    Close femon plugin.", | ||||
|     "NEXT\n" | ||||
|     "    Switch to next possible device.", | ||||
|     "PREV\n" | ||||
|     "    Switch to previous possible device.", | ||||
|     "NAME\n" | ||||
|     "    Print the current frontend name.", | ||||
|     "STAT\n" | ||||
| @@ -129,9 +143,11 @@ const char **cPluginFemon::SVDRPHelpPages(void) | ||||
|     "UNCB\n" | ||||
|     "    Print the current uncorrcted blocks rate.", | ||||
|     "VIBR\n" | ||||
|     "    Print the current video bitrate [Mbit/s].", | ||||
|     "    Print the actual device and current video bitrate [Mbit/s].", | ||||
|     "AUBR\n" | ||||
|     "    Print the current audio bitrate [kbit/s].", | ||||
|     "    Print the actual device and current audio bitrate [kbit/s].", | ||||
|     "DDBR\n" | ||||
|     "    Print the actual device and current dolby bitrate [kbit/s].", | ||||
|     NULL | ||||
|     }; | ||||
|   return HelpPages; | ||||
| @@ -139,45 +155,89 @@ const char **cPluginFemon::SVDRPHelpPages(void) | ||||
|  | ||||
| cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) | ||||
| { | ||||
|   if (strcasecmp(Command, "NAME") == 0) { | ||||
|   if (strcasecmp(Command, "OPEN") == 0) { | ||||
|      if (!cFemonOsd::Instance()) | ||||
|         cRemote::CallPlugin("femon"); | ||||
|      return cString("Opening femon plugin"); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "QUIT") == 0) { | ||||
|      if (cFemonOsd::Instance()) | ||||
|         cRemote::Put(kBack); | ||||
|      return cString("Closing femon plugin"); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "NEXT") == 0) { | ||||
|      if (cFemonOsd::Instance()) | ||||
|         return cString::sprintf("Switching to next device: %s", cFemonOsd::Instance()->DeviceSwitch(1) ? "ok" : "failed"); | ||||
|      else | ||||
|         return cString("Cannot switch device"); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "PREV") == 0) { | ||||
|      if (cFemonOsd::Instance()) | ||||
|         return cString::sprintf("Switching to previous device: %s", cFemonOsd::Instance()->DeviceSwitch(-1) ? "ok" : "failed"); | ||||
|      else | ||||
|         return cString("Cannot switch device"); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "NAME") == 0) { | ||||
|      return getFrontendName(cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "STAT") == 0) { | ||||
|      return getFrontendStatus(cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "SGNL") == 0) { | ||||
|      return cString::sprintf("%04X", getSignal(cDevice::ActualDevice()->CardIndex())); | ||||
|      int value = getSignal(cDevice::ActualDevice()->CardIndex()); | ||||
|      return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "SNRA") == 0) { | ||||
|      return cString::sprintf("%04X", getSNR(cDevice::ActualDevice()->CardIndex())); | ||||
|      int value = getSNR(cDevice::ActualDevice()->CardIndex()); | ||||
|      return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "BERA") == 0) { | ||||
|      return cString::sprintf("%08X", getBER(cDevice::ActualDevice()->CardIndex())); | ||||
|      return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "UNCB") == 0) { | ||||
|      return cString::sprintf("%08X", getUNC(cDevice::ActualDevice()->CardIndex())); | ||||
|      return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "VIBR") == 0) { | ||||
|      return cString::sprintf("%.2f", getVideoBitrate()); | ||||
|      if (cFemonOsd::Instance()) | ||||
|         return cString::sprintf("%.2f Mbit/s on device #%d", cFemonOsd::Instance()->GetVideoBitrate(), cDevice::ActualDevice()->CardIndex()); | ||||
|      else | ||||
|         return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "AUBR") == 0) { | ||||
|      return cString::sprintf("%.0f", getAudioBitrate()); | ||||
|      if (cFemonOsd::Instance()) | ||||
|         return cString::sprintf("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetAudioBitrate(), cDevice::ActualDevice()->CardIndex()); | ||||
|      else | ||||
|         return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "DDBR") == 0) { | ||||
|      if (cFemonOsd::Instance()) | ||||
|         return cString::sprintf("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetDolbyBitrate(), cDevice::ActualDevice()->CardIndex()); | ||||
|      else | ||||
|         return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| cMenuFemonSetup::cMenuFemonSetup(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   dispmodes[eFemonModeBasic]       = tr("basic"); | ||||
|   dispmodes[eFemonModeTransponder] = tr("transponder"); | ||||
|   dispmodes[eFemonModeStream]      = tr("stream"); | ||||
|   dispmodes[eFemonModeAC3]         = tr("AC-3"); | ||||
|  | ||||
|   skins[eFemonSkinClassic]         = tr("Classic"); | ||||
|   skins[eFemonSkinElchi]           = tr("Elchi"); | ||||
|  | ||||
|   themes[eFemonThemeClassic]       = tr("Classic"); | ||||
|   themes[eFemonThemeElchi]         = tr("Elchi"); | ||||
|   themes[eFemonThemeDeepBlue]      = tr("DeepBlue"); | ||||
|   themes[eFemonThemeMoronimo]      = tr("Moronimo"); | ||||
|   themes[eFemonThemeEnigma]        = tr("Enigma"); | ||||
|   themes[eFemonThemeEgalsTry]      = tr("EgalsTry"); | ||||
|   themes[eFemonThemeDuotone]       = tr("Duotone"); | ||||
|  | ||||
|   data = femonConfig; | ||||
|   Setup(); | ||||
| } | ||||
|  | ||||
| @@ -186,20 +246,21 @@ void cMenuFemonSetup::Setup(void) | ||||
|   int current = Current(); | ||||
|  | ||||
|   Clear(); | ||||
|   Add(new cMenuEditBoolItem(  tr("Hide main menu entry"),        &femonConfig.hidemenu,       tr("no"),            tr("yes"))); | ||||
|   Add(new cMenuEditBoolItem(  tr("Use syslog output"),           &femonConfig.syslogoutput,   tr("no"),            tr("yes"))); | ||||
|   Add(new cMenuEditStraItem(  tr("Default display mode"),        &femonConfig.displaymode,    eFemonModeMaxNumber, dispmodes)); | ||||
|   Add(new cMenuEditStraItem(  tr("Theme"),                       &femonConfig.theme,          eFemonThemeMaxNumber,themes)); | ||||
|   Add(new cMenuEditBoolItem(  tr("Position"),                    &femonConfig.position,       tr("bottom"),        tr("top"))); | ||||
|   Add(new cMenuEditIntItem(   tr("Height"),                      &femonConfig.osdheight,      400,                 500)); | ||||
|   Add(new cMenuEditIntItem(   tr("Horizontal offset"),           &femonConfig.osdoffset,      -50,                 50)); | ||||
|   Add(new cMenuEditBoolItem(  tr("Show CA system"),              &femonConfig.showcasystem,   tr("no"),            tr("yes"))); | ||||
|   Add(new cMenuEditIntItem(   tr("Red limit [%]"),               &femonConfig.redlimit,       1,                   50)); | ||||
|   Add(new cMenuEditIntItem(   tr("Green limit [%]"),             &femonConfig.greenlimit,     51,                  100)); | ||||
|   Add(new cMenuEditIntItem(   tr("OSD update interval [0.1s]"),  &femonConfig.updateinterval, 1,                   100)); | ||||
|   Add(new cMenuEditBoolItem(  tr("Analyze stream"),              &femonConfig.analyzestream,  tr("no"),            tr("yes"))); | ||||
|   Add(new cMenuEditBoolItem(  tr("Hide main menu entry"),        &data.hidemenu,       tr("no"),            tr("yes"))); | ||||
|   Add(new cMenuEditBoolItem(  tr("Use syslog output"),           &data.syslogoutput,   tr("no"),            tr("yes"))); | ||||
|   Add(new cMenuEditStraItem(  tr("Default display mode"),        &data.displaymode,    eFemonModeMaxNumber, dispmodes)); | ||||
|   Add(new cMenuEditStraItem(  tr("Skin"),                        &data.skin,           eFemonSkinMaxNumber, skins)); | ||||
|   Add(new cMenuEditStraItem(  tr("Theme"),                       &data.theme,          eFemonThemeMaxNumber,themes)); | ||||
|   Add(new cMenuEditBoolItem(  tr("Position"),                    &data.position,       tr("bottom"),        tr("top"))); | ||||
|   Add(new cMenuEditIntItem(   tr("Height"),                      &data.osdheight,      400,                 500)); | ||||
|   Add(new cMenuEditIntItem(   tr("Horizontal offset"),           &data.osdoffset,      -50,                 50)); | ||||
|   Add(new cMenuEditBoolItem(  tr("Show CA system"),              &data.showcasystem,   tr("no"),            tr("yes"))); | ||||
|   Add(new cMenuEditIntItem(   tr("Red limit [%]"),               &data.redlimit,       1,                   50)); | ||||
|   Add(new cMenuEditIntItem(   tr("Green limit [%]"),             &data.greenlimit,     51,                  100)); | ||||
|   Add(new cMenuEditIntItem(   tr("OSD update interval [0.1s]"),  &data.updateinterval, 1,                   100)); | ||||
|   Add(new cMenuEditBoolItem(  tr("Analyze stream"),              &data.analyzestream,  tr("no"),            tr("yes"))); | ||||
|   if (femonConfig.analyzestream) | ||||
|      Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &femonConfig.calcinterval,   1,                   100)); | ||||
|      Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &data.calcinterval,   1,                   100)); | ||||
|  | ||||
|   SetCurrent(Get(current)); | ||||
|   Display(); | ||||
| @@ -207,9 +268,12 @@ void cMenuFemonSetup::Setup(void) | ||||
|  | ||||
| void cMenuFemonSetup::Store(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   femonConfig = data; | ||||
|   SetupStore("HideMenu",       femonConfig.hidemenu); | ||||
|   SetupStore("SyslogOutput",   femonConfig.syslogoutput); | ||||
|   SetupStore("DisplayMode",    femonConfig.displaymode); | ||||
|   SetupStore("Skin",           femonConfig.skin); | ||||
|   SetupStore("Theme",          femonConfig.theme); | ||||
|   SetupStore("Position",       femonConfig.position); | ||||
|   SetupStore("OSDHeight",      femonConfig.osdheight); | ||||
| @@ -224,11 +288,11 @@ void cMenuFemonSetup::Store(void) | ||||
|  | ||||
| eOSState cMenuFemonSetup::ProcessKey(eKeys Key) | ||||
| { | ||||
|   int oldAnalyzestream = femonConfig.analyzestream; | ||||
|   int oldAnalyzestream = data.analyzestream; | ||||
|  | ||||
|   eOSState state = cMenuSetupPage::ProcessKey(Key); | ||||
|  | ||||
|   if (Key != kNone && (femonConfig.analyzestream != oldAnalyzestream)) { | ||||
|   if (Key != kNone && (data.analyzestream != oldAnalyzestream)) { | ||||
|      Setup(); | ||||
|      } | ||||
|  | ||||
|   | ||||
							
								
								
									
										6
									
								
								femon.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								femon.h
									
									
									
									
									
								
							| @@ -11,13 +11,11 @@ | ||||
|  | ||||
| #include <vdr/plugin.h> | ||||
|  | ||||
| static const char *VERSION        = "0.9.3"; | ||||
| static const char *VERSION        = "0.9.5"; | ||||
| static const char *DESCRIPTION    = "DVB Signal Information Monitor (OSD)"; | ||||
| static const char *MAINMENUENTRY  = "Signal Information"; | ||||
|  | ||||
| class cPluginFemon : public cPlugin { | ||||
| private: | ||||
|   // Add any member variables or functions you may need here. | ||||
| public: | ||||
|   cPluginFemon(void); | ||||
|   virtual ~cPluginFemon(); | ||||
| @@ -41,7 +39,9 @@ public: | ||||
| class cMenuFemonSetup : public cMenuSetupPage { | ||||
|   private: | ||||
|     const char *dispmodes[eFemonModeMaxNumber]; | ||||
|     const char *skins[eFemonSkinMaxNumber]; | ||||
|     const char *themes[eFemonThemeMaxNumber]; | ||||
|     cFemonConfig data; | ||||
|     virtual void Setup(void); | ||||
|   protected: | ||||
|     virtual eOSState ProcessKey(eKeys Key); | ||||
|   | ||||
							
								
								
									
										41
									
								
								femoncfg.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								femoncfg.c
									
									
									
									
									
								
							| @@ -14,6 +14,7 @@ cFemonConfig::cFemonConfig(void) | ||||
| { | ||||
|   hidemenu       = 0; | ||||
|   displaymode    = 0; | ||||
|   skin           = 0; | ||||
|   theme          = 0; | ||||
|   position       = 1; | ||||
|   redlimit       = 33; | ||||
| @@ -35,6 +36,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
| { | ||||
|   { | ||||
|     // eFemonThemeClassic | ||||
|     4,          // bpp | ||||
|     0x7F000000, // clrBackground | ||||
|     0xFFFCFCFC, // clrTitleBackground | ||||
|     0xFF000000, // clrTitleText | ||||
| @@ -46,6 +48,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeElchi | ||||
|     4,          // bpp | ||||
|     0xC8000066, // clrBackground | ||||
|     0xC833AAEE, // clrTitleBackground | ||||
|     0xFF000000, // clrTitleText | ||||
| @@ -57,6 +60,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeDeepBlue | ||||
|     4,          // bpp | ||||
|     0xC80C0C0C, // clrBackground | ||||
|     0xC832557A, // clrTitleBackground | ||||
|     0xFF000000, // clrTitleText | ||||
| @@ -68,6 +72,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeMoronimo | ||||
|     4,          // bpp | ||||
|     0xDF294A6B, // clrBackground | ||||
|     0xDF3E5578, // clrTitleBackground | ||||
|     0xFF9BBAD7, // clrTitleText | ||||
| @@ -77,5 +82,39 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
|     0xFFCE7B00, // clrYellow | ||||
|     0xFF336600, // clrGreen | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeEnigma | ||||
|     4,          // bpp | ||||
|     0xB8DEE5FA, // clrBackground | ||||
|     0xB84158BC, // clrTitleBackground | ||||
|     0xFFFFFFFF, // clrTitleText | ||||
|     0xFF000000, // clrActiveText | ||||
|     0xFF000000, // clrInactiveText | ||||
|     0xB8C40000, // clrRed | ||||
|     0xB8C4C400, // clrYellow | ||||
|     0xB800C400, // clrGreen | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeEgalsTry | ||||
|     0xCA2B1B9E, // clrBackground | ||||
|     0xDFBEBAC3, // clrTitleBackground | ||||
|     0xFF280249, // clrTitleText | ||||
|     0xFFD4D7DB, // clrActiveText | ||||
|     0xDFCFCFCF, // clrInactiveText | ||||
|     0xFFFF0000, // clrRed | ||||
|     0xFFFCC024, // clrYellow | ||||
|     0xFF20980B, // clrGreen | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeDuotone | ||||
|     2,          // bpp | ||||
|     0x7F000000, // clrBackground | ||||
|     0xFFFCFCFC, // clrTitleBackground | ||||
|     0x7F000000, // clrTitleText                                                                                                               | ||||
|     0xFFFCFCFC, // clrActiveText                                                                                                             | ||||
|     0xFFFCFCFC, // clrInactiveText | ||||
|     0xFFFC1414, // clrRed | ||||
|     0xFFFCFCFC, // clrYellow | ||||
|     0xFFFCFCFC, // clrGreen | ||||
|   }, | ||||
| }; | ||||
|  | ||||
|   | ||||
							
								
								
									
										12
									
								
								femoncfg.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								femoncfg.h
									
									
									
									
									
								
							| @@ -24,6 +24,7 @@ public: | ||||
|   cFemonConfig(void); | ||||
|   int hidemenu; | ||||
|   int displaymode; | ||||
|   int skin; | ||||
|   int theme; | ||||
|   int position; | ||||
|   int redlimit; | ||||
| @@ -39,17 +40,28 @@ public: | ||||
|  | ||||
| extern cFemonConfig femonConfig; | ||||
|  | ||||
| enum eFemonSkins | ||||
| { | ||||
|   eFemonSkinClassic, | ||||
|   eFemonSkinElchi, | ||||
|   eFemonSkinMaxNumber | ||||
| }; | ||||
|  | ||||
| enum eFemonThemes | ||||
| { | ||||
|   eFemonThemeClassic, | ||||
|   eFemonThemeElchi, | ||||
|   eFemonThemeDeepBlue, | ||||
|   eFemonThemeMoronimo, | ||||
|   eFemonThemeEnigma, | ||||
|   eFemonThemeEgalsTry, | ||||
|   eFemonThemeDuotone, | ||||
|   eFemonThemeMaxNumber | ||||
| }; | ||||
|  | ||||
| struct cFemonTheme | ||||
| { | ||||
|   int bpp; | ||||
|   int clrBackground; | ||||
|   int clrTitleBackground; | ||||
|   int clrTitleText; | ||||
|   | ||||
| @@ -16,7 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri | ||||
| ### The C++ compiler and options:
 | ||||
| 
 | ||||
| CXX      ?= g++ | ||||
| CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual -fPIC | ||||
| CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual | ||||
| 
 | ||||
| ### The directory environment:
 | ||||
| 
 | ||||
| @@ -40,6 +40,7 @@ cOsdObject *cPluginFemonClient::MainMenuAction(void) | ||||
|      printf("UNC    : %08X\n", femon.fe_unc); | ||||
|      printf("Video  : %.2f Mbit/s\n", femon.video_bitrate); | ||||
|      printf("Audio  : %.0f kbit/s\n", femon.audio_bitrate); | ||||
|      printf("Dolby  : %.0f kbit/s\n", femon.dolby_bitrate); | ||||
|      } | ||||
|   else | ||||
|      printf("\n--- No support for FemonService-v1.0 found ---\n"); | ||||
							
								
								
									
										331
									
								
								femoni18n.c
									
									
									
									
									
								
							
							
						
						
									
										331
									
								
								femoni18n.c
									
									
									
									
									
								
							| @@ -15,7 +15,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Visualizza le informazioni sul segnale DVB", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Affiche les informations du signal DVB", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Signaalimittari (OSD)", // suomi | ||||
|     "", // Polski | ||||
| @@ -36,7 +36,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Informazioni sul segnale", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Signal DVB", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Signaalimittari", // suomi | ||||
|     "", // Polski | ||||
| @@ -57,7 +57,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Posizione", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Position", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Sijainti", // suomi | ||||
|     "", // Polski | ||||
| @@ -78,7 +78,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Altezza", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Hauteur", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Korkeus", // suomi | ||||
|     "", // Polski | ||||
| @@ -99,7 +99,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "D<EFBFBD>placement horizontal", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Vaakakeskitys", // suomi | ||||
|     "", // Polski | ||||
| @@ -120,11 +120,11 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Modo di visualizzazione standard", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais  | ||||
|     "Affichage par d<>faut", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Oletusn<EFBFBD>ytt<EFBFBD>tila", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Espa<70>ol   | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
|     "", // Romaneste | ||||
| @@ -141,11 +141,11 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais  | ||||
|     "basique", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "perus", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Espa<70>ol   | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
|     "", // Romaneste | ||||
| @@ -162,11 +162,11 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais  | ||||
|     "transpondeur", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "transponderi", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Espa<70>ol   | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
|     "", // Romaneste | ||||
| @@ -183,11 +183,11 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais  | ||||
|     "flux", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "l<EFBFBD>hete", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Espa<70>ol   | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
|     "", // Romaneste | ||||
| @@ -198,17 +198,38 @@ const tI18nPhrase Phrases[] = { | ||||
|     "voog", // Eesti | ||||
|     "", // Dansk | ||||
|   }, | ||||
|   { "Skin", // English | ||||
|     "Oberfl<EFBFBD>che", // Deutsch | ||||
|     "", // Slovenski | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "Skin", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Ulkoasu", // suomi | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol   | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
|     "", // Romaneste | ||||
|     "", // Magyar | ||||
|     "", // Catal<61>  | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "", // Hrvatski (Croatian) | ||||
|     "Kest", // Eesti | ||||
|     "", // Dansk  | ||||
|   }, | ||||
|   { "Theme", // English | ||||
|     "Thema", // Deutsch | ||||
|     "", // Slovenski | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais  | ||||
|     "Th<EFBFBD>me", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Teema", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Espa<70>ol   | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
|     "", // Romaneste | ||||
| @@ -225,16 +246,16 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais  | ||||
|     "Classique", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Klassinen", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Espa<70>ol   | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
|     "", // Romaneste | ||||
|     "", // Magyar   | ||||
|     "", // Catal<61>   | ||||
|     "", // Magyar | ||||
|     "", // Catal<61> | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "", // Hrvatski (Croatian) | ||||
|     "Klassikaline", // Eesti | ||||
| @@ -246,16 +267,16 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Elchi", // Italiano | ||||
|     "Elchi", // Nederlands | ||||
|     "Elchi", // Portugu<67>s | ||||
|     "Elchi", // Fran<61>ais  | ||||
|     "Elchi", // Fran<61>ais | ||||
|     "Elchi", // Norsk | ||||
|     "Elchi", // suomi | ||||
|     "Elchi", // Polski    | ||||
|     "Elchi", // Espa<70>ol   | ||||
|     "Elchi", // Polski | ||||
|     "Elchi", // Espa<70>ol | ||||
|     "Elchi", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "Elchi", // Svenska | ||||
|     "Elchi", // Romaneste | ||||
|     "Elchi", // Magyar   | ||||
|     "Elchi", // Catal<61>   | ||||
|     "Elchi", // Magyar | ||||
|     "Elchi", // Catal<61> | ||||
|     "Elchi", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "Elchi", // Hrvatski (Croatian) | ||||
|     "Elchi", // Eesti | ||||
| @@ -267,16 +288,16 @@ const tI18nPhrase Phrases[] = { | ||||
|     "DeepBlue", // Italiano | ||||
|     "DeepBlue", // Nederlands | ||||
|     "DeepBlue", // Portugu<67>s | ||||
|     "DeepBlue", // Fran<61>ais  | ||||
|     "DeepBlue", // Fran<61>ais | ||||
|     "DeepBlue", // Norsk | ||||
|     "DeepBlue", // suomi | ||||
|     "DeepBlue", // Polski    | ||||
|     "DeepBlue", // Espa<70>ol   | ||||
|     "DeepBlue", // Polski | ||||
|     "DeepBlue", // Espa<70>ol | ||||
|     "DeepBlue", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "DeepBlue", // Svenska | ||||
|     "DeepBlue", // Romaneste | ||||
|     "DeepBlue", // Magyar   | ||||
|     "DeepBlue", // Catal<61>   | ||||
|     "DeepBlue", // Magyar | ||||
|     "DeepBlue", // Catal<61> | ||||
|     "DeepBlue", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "DeepBlue", // Hrvatski (Croatian) | ||||
|     "DeepBlue", // Eesti | ||||
| @@ -288,28 +309,91 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Moronimo", // Italiano | ||||
|     "Moronimo", // Nederlands | ||||
|     "Moronimo", // Portugu<67>s | ||||
|     "Moronimo", // Fran<61>ais  | ||||
|     "Moronimo", // Fran<61>ais | ||||
|     "Moronimo", // Norsk | ||||
|     "Moronimo", // suomi | ||||
|     "Moronimo", // Polski    | ||||
|     "Moronimo", // Espa<70>ol   | ||||
|     "Moronimo", // Polski | ||||
|     "Moronimo", // Espa<70>ol | ||||
|     "Moronimo", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "Moronimo", // Svenska | ||||
|     "Moronimo", // Romaneste | ||||
|     "Moronimo", // Magyar   | ||||
|     "Moronimo", // Catal<61>   | ||||
|     "Moronimo", // Magyar | ||||
|     "Moronimo", // Catal<61> | ||||
|     "Moronimo", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "Moronimo", // Hrvatski (Croatian) | ||||
|     "Moronimo", // Eesti | ||||
|     "Moronimo", // Dansk | ||||
|   }, | ||||
|   { "Enigma", // English | ||||
|     "Enigma", // Deutsch | ||||
|     "Enigma", // Slovenski | ||||
|     "Enigma", // Italiano | ||||
|     "Enigma", // Nederlands | ||||
|     "Enigma", // Portugu<67>s | ||||
|     "Enigma", // Fran<61>ais | ||||
|     "Enigma", // Norsk | ||||
|     "Enigma", // suomi | ||||
|     "Enigma", // Polski | ||||
|     "Enigma", // Espa<70>ol | ||||
|     "Enigma", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "Enigma", // Svenska | ||||
|     "Enigma", // Romaneste | ||||
|     "Enigma", // Magyar | ||||
|     "Enigma", // Catal<61> | ||||
|     "Enigma", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "Enigma", // Hrvatski (Croatian) | ||||
|     "Enigma", // Eesti | ||||
|     "Enigma", // Dansk | ||||
|   }, | ||||
|   { "EgalsTry", // English | ||||
|     "EgalsTry", // Deutsch | ||||
|     "EgalsTry", // Slovenski | ||||
|     "EgalsTry", // Italiano | ||||
|     "EgalsTry", // Nederlands | ||||
|     "EgalsTry", // Portugu<67>s | ||||
|     "EgalsTry", // Fran<61>ais | ||||
|     "EgalsTry", // Norsk | ||||
|     "EgalsTry", // suomi | ||||
|     "EgalsTry", // Polski | ||||
|     "EgalsTry", // Espa<70>ol | ||||
|     "EgalsTry", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "EgalsTry", // Svenska | ||||
|     "EgalsTry", // Romaneste | ||||
|     "EgalsTry", // Magyar | ||||
|     "EgalsTry", // Catal<61> | ||||
|     "EgalsTry", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "EgalsTry", // Hrvatski (Croatian) | ||||
|     "EgalsTry", // Eesti | ||||
|     "EgalsTry", // Dansk | ||||
|   }, | ||||
|   { "Duotone", // English | ||||
|     "Duotone", // Deutsch | ||||
|     "Duotone", // Slovenski | ||||
|     "Duotone", // Italiano | ||||
|     "Duotone", // Nederlands | ||||
|     "Duotone", // Portugu<67>s | ||||
|     "Duotone", // Fran<61>ais | ||||
|     "Duotone", // Norsk | ||||
|     "Duotone", // suomi | ||||
|     "Duotone", // Polski | ||||
|     "Duotone", // Espa<70>ol | ||||
|     "Duotone", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "Duotone", // Svenska | ||||
|     "Duotone", // Romaneste | ||||
|     "Duotone", // Magyar | ||||
|     "Duotone", // Catal<61> | ||||
|     "Duotone", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "Duotone", // Hrvatski (Croatian) | ||||
|     "Duotone", // Eesti | ||||
|     "Duotone", // Dansk | ||||
|   }, | ||||
|   { "Hide main menu entry", // English | ||||
|     "Hauptmen<EFBFBD>eintrag verstecken", // Deutsch | ||||
|     "", // Slovenski | ||||
|     "Nascondi voce men<65>", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Masquer dans le menu principal", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Piilota valinta p<><70>valikosta", // suomi | ||||
|     "", // Polski | ||||
| @@ -330,7 +414,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Intervallo di aggiornamento [0.1s]", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Intervalle de mise <20> jour (0,1s)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "N<EFBFBD>yt<EFBFBD>n p<>ivitysv<73>li [0.1s]", // suomi | ||||
|     "", // Polski | ||||
| @@ -351,7 +435,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Analyser le flux", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "L<EFBFBD>hetteen analysointi", // suomi | ||||
|     "", // Polski | ||||
| @@ -372,7 +456,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Intervallo di calcolo [0.1s]", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Intervalle de calcul (0,1s)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Laskennan p<>ivitysv<73>li [0.1s]", // suomi | ||||
|     "", // Polski | ||||
| @@ -393,7 +477,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Limite rosso [%]", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Limite du rouge (%)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Punaisen taso [%]", // suomi | ||||
|     "", // Polski | ||||
| @@ -414,7 +498,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Limite verde [%]", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Limite du vert (%)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Vihre<EFBFBD>n taso [%]", // suomi | ||||
|     "", // Polski | ||||
| @@ -435,10 +519,10 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Informazioni transponder", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Information transpondeur", // Fran<61>ais | ||||
|     "", // Norsk    | ||||
|     "Transponderin tiedot", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
| @@ -456,7 +540,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Scheda satellitare", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Carte Satellite", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Satelliittikortti", // suomi | ||||
|     "", // Polski | ||||
| @@ -477,7 +561,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Scheda via cavo", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Carte C<>ble", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kaapelikortti", // suomi | ||||
|     "", // Polski | ||||
| @@ -498,7 +582,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Scheda terrestre", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Carte TNT", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Terrestiaalikortti", // suomi | ||||
|     "", // Polski | ||||
| @@ -519,7 +603,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Registra su syslog", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Enregistrer les infos dans syslog", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kirjaa systeemilokiin", // suomi | ||||
|     "", // Polski | ||||
| @@ -561,7 +645,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Video", // Italiano | ||||
|     "Video", // Nederlands | ||||
|     "Video", // Portugu<67>s | ||||
|     "Video", // Fran<61>ais | ||||
|     "Vid<EFBFBD>o", // Fran<61>ais | ||||
|     "Video", // Norsk | ||||
|     "Kuva", // suomi | ||||
|     "Video", // Polski | ||||
| @@ -603,7 +687,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "None", // Italiano | ||||
|     "None", // Nederlands | ||||
|     "None", // Portugu<67>s | ||||
|     "None", // Fran<61>ais | ||||
|     "Aucun", // Fran<61>ais | ||||
|     "None", // Norsk | ||||
|     "ei", // suomi | ||||
|     "None", // Polski | ||||
| @@ -624,7 +708,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Off", // Italiano | ||||
|     "Off", // Nederlands | ||||
|     "Off", // Portugu<67>s | ||||
|     "Off", // Fran<61>ais | ||||
|     "Non", // Fran<61>ais | ||||
|     "Off", // Norsk | ||||
|     "poissa", // suomi | ||||
|     "Off", // Polski | ||||
| @@ -645,7 +729,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "On", // Italiano | ||||
|     "On", // Nederlands | ||||
|     "On", // Portugu<67>s | ||||
|     "On", // Fran<61>ais | ||||
|     "Oui", // Fran<61>ais | ||||
|     "On", // Norsk | ||||
|     "p<EFBFBD><EFBFBD>ll<EFBFBD>", // suomi | ||||
|     "On", // Polski | ||||
| @@ -729,7 +813,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Information flux", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "L<EFBFBD>hetteen tiedot", // suomi | ||||
|     "", // Polski | ||||
| @@ -750,7 +834,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "MPEG Layer", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "MPEG-taso", // suomi | ||||
|     "", // Polski | ||||
| @@ -771,7 +855,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Flux vid<69>o", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kuvaraita", // suomi | ||||
|     "", // Polski | ||||
| @@ -792,7 +876,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Bitrate", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Bittinopeus", // suomi | ||||
|     "", // Polski | ||||
| @@ -813,7 +897,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Rafra<EFBFBD>chissement", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Ruudunp<EFBFBD>ivitysnopeus", // suomi | ||||
|     "", // Polski | ||||
| @@ -855,7 +939,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Proportions d'image", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kuvasuhde", // suomi | ||||
|     "", // Polski | ||||
| @@ -876,7 +960,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "r<EFBFBD>serv<EFBFBD>", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "varattu", // suomi | ||||
|     "", // Polski | ||||
| @@ -897,10 +981,10 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "libre", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "vapaa", // suomi | ||||
|     "", // Polski    | ||||
|     "", // Polski | ||||
|     "", // Espa<70>ol | ||||
|     "", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "", // Svenska | ||||
| @@ -918,7 +1002,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Standard vid<69>o", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kuvaformaatti", // suomi | ||||
|     "", // Polski | ||||
| @@ -981,7 +1065,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "inconnu", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "tuntematon", // suomi | ||||
|     "", // Polski | ||||
| @@ -1002,7 +1086,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "R<EFBFBD>solution", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Resoluutio", // suomi | ||||
|     "", // Polski | ||||
| @@ -1023,7 +1107,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Flux audio", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "<EFBFBD><EFBFBD>niraita", // suomi | ||||
|     "", // Polski | ||||
| @@ -1044,7 +1128,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Fr<EFBFBD>quence d'<27>chantillonage", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "N<EFBFBD>ytteenottotaajuus", // suomi | ||||
|     "", // Polski | ||||
| @@ -1068,7 +1152,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "kHz", // Fran<61>ais | ||||
|     "kHz", // Norsk | ||||
|     "kHz", // suomi | ||||
|     "kHz", // Polski    | ||||
|     "kHz", // Polski | ||||
|     "kHz", // Espa<70>ol | ||||
|     "kHz", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "kHz", // Svenska | ||||
| @@ -1185,6 +1269,27 @@ const tI18nPhrase Phrases[] = { | ||||
|     "Rid", // Eesti | ||||
|     "Rid", // Dansk | ||||
|   }, | ||||
|   { "Coderate", // English | ||||
|     "Coderate", // Deutsch | ||||
|     "Coderate", // Slovenski | ||||
|     "Coderate", // Italiano | ||||
|     "Coderate", // Nederlands | ||||
|     "Coderate", // Portugu<67>s | ||||
|     "Coderate", // Fran<61>ais | ||||
|     "Coderate", // Norsk | ||||
|     "Suojaustaso", // suomi | ||||
|     "Coderate", // Polski | ||||
|     "Coderate", // Espa<70>ol | ||||
|     "Coderate", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "Coderate", // Svenska | ||||
|     "Coderate", // Romaneste | ||||
|     "Coderate", // Magyar | ||||
|     "Coderate", // Catal<61> | ||||
|     "Coderate", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian) | ||||
|     "Coderate", // Hrvatski (Croatian) | ||||
|     "Coderate", // Eesti | ||||
|     "Coderate", // Dansk | ||||
|   }, | ||||
|   { "dB", // English | ||||
|     "dB", // Deutsch | ||||
|     "dB", // Slovenski | ||||
| @@ -1194,7 +1299,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "dB", // Fran<61>ais | ||||
|     "dB", // Norsk | ||||
|     "dB", // suomi | ||||
|     "dB", // Polski    | ||||
|     "dB", // Polski | ||||
|     "dB", // Espa<70>ol | ||||
|     "dB", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek) | ||||
|     "dB", // Svenska | ||||
| @@ -1212,7 +1317,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "non indiqu<71>", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "ei ilmaistu", // suomi | ||||
|     "", // Polski | ||||
| @@ -1254,7 +1359,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Flux AC-3", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "AC-3-<2D><>niraita", // suomi | ||||
|     "", // Polski | ||||
| @@ -1275,7 +1380,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Taille de paquet", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kehyksen koko", // suomi | ||||
|     "", // Polski | ||||
| @@ -1296,7 +1401,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Mode bitstream", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "L<EFBFBD>hetteen tyyppi", // suomi | ||||
|     "", // Polski | ||||
| @@ -1317,7 +1422,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Mode de codage audio", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "<EFBFBD><EFBFBD>nikoodaus", // suomi | ||||
|     "", // Polski | ||||
| @@ -1338,7 +1443,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Niveau sonore milieu", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Keskikanavan taso", // suomi | ||||
|     "", // Polski | ||||
| @@ -1359,7 +1464,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Niveau sonore surround", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Tehostekanavien taso", // suomi | ||||
|     "", // Polski | ||||
| @@ -1380,7 +1485,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Mode Dolby Surround", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Dolby Surround -tehoste", // suomi | ||||
|     "", // Polski | ||||
| @@ -1401,7 +1506,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Effets de basses", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "LFE-kanava", // suomi | ||||
|     "", // Polski | ||||
| @@ -1422,7 +1527,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Normalisation des dialogues", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Dialogin normalisointi", // suomi | ||||
|     "", // Polski | ||||
| @@ -1443,7 +1548,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Principal (CM)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "P<EFBFBD><EFBFBD>asiallinen (CM)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1464,7 +1569,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Musique et effets (ME)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Musiikki ja tehosteet (ME)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1485,7 +1590,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Malvoyants (VI)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "N<EFBFBD>k<EFBFBD>rajoitteinen (VI)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1506,7 +1611,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Malentendants (HI)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kuulorajoitteinen (HI)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1527,7 +1632,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Dialogue (D)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Vuoropuhelu (D)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1548,7 +1653,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Commentaires (C)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Kommentointi (C)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1569,7 +1674,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Urgence (E)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "H<EFBFBD>t<EFBFBD>tiedote (E)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1590,7 +1695,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Voix off (VO)", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "P<EFBFBD><EFBFBD>lle puhuttu (VO)", // suomi | ||||
|     "", // Polski | ||||
| @@ -1611,7 +1716,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Karaoke", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Karaoke", // suomi | ||||
|     "", // Polski | ||||
| @@ -1632,7 +1737,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Can. 1", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "kan. 1", // suomi | ||||
|     "", // Polski | ||||
| @@ -1653,7 +1758,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Can. 2", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "kan. 2", // suomi | ||||
|     "", // Polski | ||||
| @@ -1674,7 +1779,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Centre", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "K", // suomi | ||||
|     "", // Polski | ||||
| @@ -1695,7 +1800,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Gauche", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "V", // suomi | ||||
|     "", // Polski | ||||
| @@ -1716,7 +1821,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Droite", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "O", // suomi | ||||
|     "", // Polski | ||||
| @@ -1737,7 +1842,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Surround", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "T", // suomi | ||||
|     "", // Polski | ||||
| @@ -1758,7 +1863,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Surround gauche", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "TV", // suomi | ||||
|     "", // Polski | ||||
| @@ -1779,7 +1884,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Surround droit", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "TO", // suomi | ||||
|     "", // Polski | ||||
| @@ -1800,7 +1905,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Syst<EFBFBD>me CA", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "N<EFBFBD>yt<EFBFBD> salausj<73>rjestelm<6C>", // suomi | ||||
|     "", // Polski | ||||
| @@ -1821,7 +1926,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Fixe", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "kiinte<EFBFBD>", // suomi | ||||
|     "", // Polski | ||||
| @@ -1842,7 +1947,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Analogique", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "analoginen", // suomi | ||||
|     "", // Polski | ||||
| @@ -1863,7 +1968,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Free To Air", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "salaamaton", // suomi | ||||
|     "", // Polski | ||||
| @@ -1884,7 +1989,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "SECA/Mediaguard", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "SECA/Mediaguard", // suomi | ||||
|     "", // Polski | ||||
| @@ -1905,7 +2010,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Viaccess", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Viaccess", // suomi | ||||
|     "", // Polski | ||||
| @@ -1926,7 +2031,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Irdeto", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Irdeto", // suomi | ||||
|     "", // Polski | ||||
| @@ -1947,7 +2052,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "NDS/Videoguard", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "NDS/Videoguard", // suomi | ||||
|     "", // Polski | ||||
| @@ -1968,7 +2073,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "Conax", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "Conax", // suomi | ||||
|     "", // Polski | ||||
| @@ -1989,7 +2094,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "CryptoWorks", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "CryptoWorks", // suomi | ||||
|     "", // Polski | ||||
| @@ -2010,7 +2115,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "PowerVu", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "PowerVu", // suomi | ||||
|     "", // Polski | ||||
| @@ -2031,7 +2136,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "BetaCrypt", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "BetaCrypt", // suomi | ||||
|     "", // Polski | ||||
| @@ -2052,7 +2157,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "NagraVision", // Fran<61>ais | ||||
|     "", // Norsk | ||||
|     "NagraVision", // suomi | ||||
|     "", // Polski | ||||
| @@ -2073,7 +2178,7 @@ const tI18nPhrase Phrases[] = { | ||||
|     "", // Italiano | ||||
|     "", // Nederlands | ||||
|     "", // Portugu<67>s | ||||
|     "", // Fran<61>ais | ||||
|     "SkyCrypt", // Fran<61>ais | ||||
|     "", // Norsk    | ||||
|     "SkyCrypt", // suomi | ||||
|     "", // Polski | ||||
|   | ||||
							
								
								
									
										206
									
								
								femonosd.c
									
									
									
									
									
								
							
							
						
						
									
										206
									
								
								femonosd.c
									
									
									
									
									
								
							| @@ -47,6 +47,7 @@ | ||||
| #define OSDSTATUSHEIGHT           (OSDROWHEIGHT * 6)      // in pixels (6 rows) | ||||
| #define OSDSPACING                5 | ||||
| #define OSDCORNERING              10 | ||||
| #define IS_OSDCORNERING           (femonConfig.skin == eFemonSkinElchi) | ||||
|  | ||||
| #define OSDINFOWIN_Y(offset)      (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset) | ||||
| #define OSDINFOWIN_X(col)         ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 15) | ||||
| @@ -80,7 +81,19 @@ cBitmap cFemonOsd::bmCarrier(carrier_xpm); | ||||
| cBitmap cFemonOsd::bmViterbi(viterbi_xpm); | ||||
| cBitmap cFemonOsd::bmSync(sync_xpm); | ||||
|  | ||||
| cFemonOsd::cFemonOsd(void) | ||||
| cFemonOsd *cFemonOsd::pInstance = NULL; | ||||
|  | ||||
| cFemonOsd *cFemonOsd::Instance(bool create) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   if (pInstance == NULL && create) | ||||
|   { | ||||
|      pInstance = new cFemonOsd(); | ||||
|   } | ||||
|   return (pInstance); | ||||
| } | ||||
|  | ||||
| cFemonOsd::cFemonOsd() | ||||
| :cOsdObject(true), cThread("femon osd") | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
| @@ -109,13 +122,13 @@ cFemonOsd::cFemonOsd(void) | ||||
| cFemonOsd::~cFemonOsd(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   if (Running()) { | ||||
|   if (Running()) | ||||
|      Cancel(3); | ||||
|      } | ||||
|   if (m_Receiver) | ||||
|      delete m_Receiver; | ||||
|   if (m_Osd) | ||||
|      delete m_Osd; | ||||
|   pInstance = NULL; | ||||
| } | ||||
|  | ||||
| void cFemonOsd::DrawStatusWindow(void) | ||||
| @@ -136,8 +149,10 @@ void cFemonOsd::DrawStatusWindow(void) | ||||
|      snprintf(buf, sizeof(buf), "%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)); | ||||
|      m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground); | ||||
|      m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); | ||||
|      m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(0), OSDCORNERING, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|      m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|      if (IS_OSDCORNERING) { | ||||
|         m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(0), OSDCORNERING, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|         } | ||||
|      if (m_Receiver) { | ||||
|         value = cDevice::ActualDevice()->CardIndex(); | ||||
|         if (value == 1) { | ||||
| @@ -343,8 +358,10 @@ void cFemonOsd::DrawStatusWindow(void) | ||||
|      m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(3, x), OSDSTATUSWIN_Y(offset + y), bmCarrier, (m_FrontendStatus & FE_HAS_CARRIER) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground); | ||||
|      m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(4, x), OSDSTATUSWIN_Y(offset + y), bmViterbi, (m_FrontendStatus & FE_HAS_VITERBI) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground); | ||||
|      m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(5, x), OSDSTATUSWIN_Y(offset + y), bmSync, (m_FrontendStatus & FE_HAS_SYNC) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground); | ||||
|      m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDCORNERING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -3); | ||||
|      m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -4); | ||||
|      if (IS_OSDCORNERING) { | ||||
|         m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDCORNERING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -3); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -4); | ||||
|         } | ||||
|      m_Osd->Flush(); | ||||
|      } | ||||
| } | ||||
| @@ -365,8 +382,10 @@ void cFemonOsd::DrawInfoWindow(void) | ||||
|         m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground); | ||||
|         m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground); | ||||
|         m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Transponder Information"), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); | ||||
|         m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|         if (IS_OSDCORNERING) { | ||||
|            m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|            m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|            } | ||||
|         offset += OSDROWHEIGHT; | ||||
|         m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|         snprintf(buf, sizeof(buf), "%d", channel->Vpid()); | ||||
| @@ -614,29 +633,29 @@ void cFemonOsd::DrawInfoWindow(void) | ||||
|                else if (value == INVERSION_ON)    snprintf(buf, sizeof(buf), tr("On")); | ||||
|                else            /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); | ||||
|                m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|                m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|                m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Coderate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|                value = channel->CoderateH(); | ||||
|                if      (value == FEC_NONE)  snprintf(buf, sizeof(buf), tr("None")); | ||||
|                else if (value == FEC_1_2)   snprintf(buf, sizeof(buf), "1/2"); | ||||
|                else if (value == FEC_2_3)   snprintf(buf, sizeof(buf), "2/3"); | ||||
|                else if (value == FEC_3_4)   snprintf(buf, sizeof(buf), "3/4"); | ||||
|                else if (value == FEC_4_5)   snprintf(buf, sizeof(buf), "4/5"); | ||||
|                else if (value == FEC_5_6)   snprintf(buf, sizeof(buf), "5/6"); | ||||
|                else if (value == FEC_6_7)   snprintf(buf, sizeof(buf), "6/7"); | ||||
|                else if (value == FEC_7_8)   snprintf(buf, sizeof(buf), "7/8"); | ||||
|                else if (value == FEC_8_9)   snprintf(buf, sizeof(buf), "8/9"); | ||||
|                else            /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); | ||||
|                if      (value == FEC_NONE)  snprintf(buf, sizeof(buf), "%s (H)", tr("None")); | ||||
|                else if (value == FEC_1_2)   snprintf(buf, sizeof(buf), "1/2 (H)"); | ||||
|                else if (value == FEC_2_3)   snprintf(buf, sizeof(buf), "2/3 (H)"); | ||||
|                else if (value == FEC_3_4)   snprintf(buf, sizeof(buf), "3/4 (H)"); | ||||
|                else if (value == FEC_4_5)   snprintf(buf, sizeof(buf), "4/5 (H)"); | ||||
|                else if (value == FEC_5_6)   snprintf(buf, sizeof(buf), "5/6 (H)"); | ||||
|                else if (value == FEC_6_7)   snprintf(buf, sizeof(buf), "6/7 (H)"); | ||||
|                else if (value == FEC_7_8)   snprintf(buf, sizeof(buf), "7/8 (H)"); | ||||
|                else if (value == FEC_8_9)   snprintf(buf, sizeof(buf), "8/9 (H)"); | ||||
|                else            /*FEC_AUTO*/ snprintf(buf, sizeof(buf), "%s (H)", tr("Auto")); | ||||
|                value = channel->CoderateL(); | ||||
|                if      (value == FEC_NONE)  snprintf(buf2, sizeof(buf2), " - %s", tr("None")); | ||||
|                else if (value == FEC_1_2)   snprintf(buf2, sizeof(buf2), " - 1/2"); | ||||
|                else if (value == FEC_2_3)   snprintf(buf2, sizeof(buf2), " - 2/3"); | ||||
|                else if (value == FEC_3_4)   snprintf(buf2, sizeof(buf2), " - 3/4"); | ||||
|                else if (value == FEC_4_5)   snprintf(buf2, sizeof(buf2), " - 4/5"); | ||||
|                else if (value == FEC_5_6)   snprintf(buf2, sizeof(buf2), " - 5/6"); | ||||
|                else if (value == FEC_6_7)   snprintf(buf2, sizeof(buf2), " - 6/7"); | ||||
|                else if (value == FEC_7_8)   snprintf(buf2, sizeof(buf2), " - 7/8"); | ||||
|                else if (value == FEC_8_9)   snprintf(buf2, sizeof(buf2), " - 8/9"); | ||||
|                else            /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " - %s", tr("Auto")); | ||||
|                if      (value == FEC_NONE)  snprintf(buf2, sizeof(buf2), " %s (L)", tr("None")); | ||||
|                else if (value == FEC_1_2)   snprintf(buf2, sizeof(buf2), " 1/2 (L)"); | ||||
|                else if (value == FEC_2_3)   snprintf(buf2, sizeof(buf2), " 2/3 (L)"); | ||||
|                else if (value == FEC_3_4)   snprintf(buf2, sizeof(buf2), " 3/4 (L)"); | ||||
|                else if (value == FEC_4_5)   snprintf(buf2, sizeof(buf2), " 4/5 (L)"); | ||||
|                else if (value == FEC_5_6)   snprintf(buf2, sizeof(buf2), " 5/6 (L)"); | ||||
|                else if (value == FEC_6_7)   snprintf(buf2, sizeof(buf2), " 6/7 (L)"); | ||||
|                else if (value == FEC_7_8)   snprintf(buf2, sizeof(buf2), " 7/8 (L)"); | ||||
|                else if (value == FEC_8_9)   snprintf(buf2, sizeof(buf2), " 8/9 (L)"); | ||||
|                else            /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " %s (L)", tr("Auto")); | ||||
|                strncat(buf, buf2, sizeof(buf)); | ||||
|                m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|                offset += OSDROWHEIGHT; | ||||
| @@ -658,15 +677,19 @@ void cFemonOsd::DrawInfoWindow(void) | ||||
|                m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|                break; | ||||
|           } | ||||
|         m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); | ||||
|         if (IS_OSDCORNERING) { | ||||
|            m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); | ||||
|            m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); | ||||
|            } | ||||
|         } | ||||
|      else if (m_DisplayMode == eFemonModeStream) { | ||||
|         m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground); | ||||
|         m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground); | ||||
|         m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); | ||||
|         m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|         if (IS_OSDCORNERING) { | ||||
|            m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|            m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|            } | ||||
|         offset += OSDROWHEIGHT; | ||||
|         m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|         snprintf(buf, sizeof(buf), "#%d", channel->Vpid()); | ||||
| @@ -736,16 +759,20 @@ void cFemonOsd::DrawInfoWindow(void) | ||||
|            } | ||||
|         else                         snprintf(buf, sizeof(buf), "---"); | ||||
|         m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|         m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); | ||||
|         if (IS_OSDCORNERING) { | ||||
|            m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); | ||||
|            m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); | ||||
|            } | ||||
|         } | ||||
|      else if (m_DisplayMode == eFemonModeAC3) { | ||||
|         m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground); | ||||
|         m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground); | ||||
|         snprintf(buf, sizeof(buf), "%s - %s #%d %s", tr("Stream Information"), tr("AC-3 Stream"), IS_DOLBY_TRACK(track) ? channel->Dpid(int(track - ttDolbyFirst)) : channel->Dpid(0), IS_DOLBY_TRACK(track) ? channel->Dlang(int(track - ttDolbyFirst)) : channel->Dlang(0)); | ||||
|         m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); | ||||
|         m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|         if (IS_OSDCORNERING) { | ||||
|            m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); | ||||
|            m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); | ||||
|            } | ||||
|         offset += OSDROWHEIGHT; | ||||
|         if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) { | ||||
|            m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
| @@ -831,8 +858,10 @@ void cFemonOsd::DrawInfoWindow(void) | ||||
|            else           snprintf(buf, sizeof(buf), "---"); | ||||
|            m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); | ||||
|            } | ||||
|         m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); | ||||
|         m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); | ||||
|         if (IS_OSDCORNERING) { | ||||
|            m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); | ||||
|            m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); | ||||
|            } | ||||
|         } | ||||
|      else /* eFemonModeBasic */ { | ||||
|         m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent); | ||||
| @@ -886,13 +915,13 @@ void cFemonOsd::Show(void) | ||||
|      } | ||||
|   m_Osd = cOsdProvider::NewOsd(((Setup.OSDWidth - OSDWIDTH) / 2) + Setup.OSDLeft + femonConfig.osdoffset, ((Setup.OSDHeight - OSDHEIGHT) / 2) + Setup.OSDTop); | ||||
|   if (m_Osd) { | ||||
|      tArea Areas1[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, 4 } }; | ||||
|      tArea Areas1[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, femonTheme[femonConfig.theme].bpp } }; | ||||
|      if (m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) { | ||||
|         m_Osd->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea)); | ||||
|         } | ||||
|      else { | ||||
|         tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0),          (OSDWIDTH-1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-1), 4 }, | ||||
|                            { 0, OSDINFOWIN_Y(0),            (OSDWIDTH-1), OSDINFOWIN_Y(OSDROWHEIGHT-1),      4 }, | ||||
|         tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0),          (OSDWIDTH-1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-1), femonTheme[femonConfig.theme].bpp }, | ||||
|                            { 0, OSDINFOWIN_Y(0),            (OSDWIDTH-1), OSDINFOWIN_Y(OSDROWHEIGHT-1),      femonTheme[femonConfig.theme].bpp }, | ||||
|                            { 0, OSDINFOWIN_Y(OSDROWHEIGHT), (OSDWIDTH-1), OSDINFOWIN_Y(OSDINFOHEIGHT-1),     2 } }; | ||||
|         m_Osd->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea)); | ||||
|         } | ||||
| @@ -963,6 +992,69 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks) | ||||
|      } | ||||
| } | ||||
|  | ||||
| bool cFemonOsd::DeviceSwitch(int direction) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   int device = cDevice::ActualDevice()->DeviceNumber();                             | ||||
|   direction = sgn(direction); | ||||
|   if (device >= 0) { | ||||
|      cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|      for (int i = 0; i < cDevice::NumDevices() - 1; i++) {                          | ||||
|         if (direction) { | ||||
|            if (++device >= cDevice::NumDevices()) device = 0;                      | ||||
|            } | ||||
|         else { | ||||
|            if (--device < 0) device = cDevice::NumDevices() - 1; | ||||
|            } | ||||
|         if (cDevice::GetDevice(device)->ProvidesChannel(channel)) { | ||||
|            Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device); | ||||
|            // here should be added some checks, if the device is really available (i.e. not recording) | ||||
|            cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0); | ||||
|            cControl::Shutdown(); | ||||
|            cDevice::GetDevice(device)->SwitchChannel(channel, true); | ||||
|            // does this work with primary devices ? | ||||
|            cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids())); | ||||
|            cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number()); | ||||
|            return (true); | ||||
|            } | ||||
|         } | ||||
|      } | ||||
|    return (false); | ||||
| } | ||||
|  | ||||
| double cFemonOsd::GetVideoBitrate(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   double value = 0.0; | ||||
|  | ||||
|   if (m_Receiver) | ||||
|      value = m_Receiver->VideoBitrate(); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| double cFemonOsd::GetAudioBitrate(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   double value = 0.0; | ||||
|  | ||||
|   if (m_Receiver) | ||||
|      value = m_Receiver->AudioBitrate(); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| double cFemonOsd::GetDolbyBitrate(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   double value = 0.0; | ||||
|  | ||||
|   if (m_Receiver) | ||||
|      value = m_Receiver->AC3Bitrate(); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| eOSState cFemonOsd::ProcessKey(eKeys Key) | ||||
| {  | ||||
|   eOSState state = cOsdObject::ProcessKey(Key); | ||||
| @@ -1043,32 +1135,10 @@ eOSState cFemonOsd::ProcessKey(eKeys Key) | ||||
|                } | ||||
|             break; | ||||
|        case kRight: | ||||
|             DeviceSwitch(1); | ||||
|             break; | ||||
|        case kLeft: | ||||
|             { | ||||
|             int device = cDevice::ActualDevice()->DeviceNumber(); | ||||
|             if (device >= 0) { | ||||
|                cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|                for (int i = 0; i < cDevice::NumDevices() - 1; i++) { | ||||
|                    if (NORMALKEY(Key) == kRight) { | ||||
|                       if (++device >= cDevice::NumDevices()) device = 0; | ||||
|                       } | ||||
|                    else { | ||||
|                       if (--device < 0) device = cDevice::NumDevices() - 1; | ||||
|                       } | ||||
|                    if (cDevice::GetDevice(device)->ProvidesChannel(channel)) { | ||||
|                       Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, Key, device); | ||||
|                       // here should be added some checks, if the device is really available (i.e. not recording) | ||||
|                       cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0); | ||||
|                       cControl::Shutdown(); | ||||
|                       cDevice::GetDevice(device)->SwitchChannel(channel, true); | ||||
|                       // does this work with primary devices ? | ||||
|                       cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids())); | ||||
|                       cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number()); | ||||
|                       break; | ||||
|                       } | ||||
|                    } | ||||
|                } | ||||
|             } | ||||
|             DeviceSwitch(-1); | ||||
|             break; | ||||
|        case kUp|k_Repeat: | ||||
|        case kUp: | ||||
|   | ||||
							
								
								
									
										11
									
								
								femonosd.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								femonosd.h
									
									
									
									
									
								
							| @@ -21,6 +21,7 @@ | ||||
|  | ||||
| class cFemonOsd : public cOsdObject, public cThread, public cStatus { | ||||
| private: | ||||
|   static cFemonOsd *pInstance; | ||||
|   cOsd *m_Osd; | ||||
|   cFemonReceiver *m_Receiver; | ||||
|   int m_Frontend; | ||||
| @@ -44,16 +45,24 @@ private: | ||||
|   void DrawInfoWindow(void); | ||||
|  | ||||
| protected: | ||||
|   cFemonOsd(); | ||||
|   cFemonOsd(const cFemonOsd&); | ||||
|   cFemonOsd& operator= (const cFemonOsd&); | ||||
|   virtual void Action(void); | ||||
|   virtual void ChannelSwitch(const cDevice * device, int channelNumber); | ||||
|   virtual void SetAudioTrack(int Index, const char * const *Tracks); | ||||
|  | ||||
| public: | ||||
|   cFemonOsd(void); | ||||
|   static cFemonOsd *Instance(bool create = false); | ||||
|   ~cFemonOsd(); | ||||
|  | ||||
|   virtual void Show(void); | ||||
|   virtual eOSState ProcessKey(eKeys Key); | ||||
|  | ||||
|   bool DeviceSwitch(int direction); | ||||
|   double GetVideoBitrate(void); | ||||
|   double GetAudioBitrate(void); | ||||
|   double GetDolbyBitrate(void); | ||||
| }; | ||||
|  | ||||
| #endif //__FEMONOSD_H | ||||
|   | ||||
| @@ -58,9 +58,8 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid[], int Dpid[]) | ||||
| cFemonReceiver::~cFemonReceiver(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   Detach(); | ||||
|   if (Running()) | ||||
|      Cancel(); | ||||
|      Cancel(3); | ||||
| } | ||||
|  | ||||
| /* The following function originates from libdvbmpeg: */ | ||||
|   | ||||
| @@ -20,6 +20,7 @@ struct FemonService_v1_0 { | ||||
|   uint32_t fe_unc; | ||||
|   double video_bitrate; | ||||
|   double audio_bitrate; | ||||
|   double dolby_bitrate; | ||||
|   }; | ||||
|  | ||||
| #endif //__FEMONSERVICE_H | ||||
|   | ||||
							
								
								
									
										21
									
								
								femontools.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								femontools.c
									
									
									
									
									
								
							| @@ -25,7 +25,7 @@ cString getFrontendName(int cardIndex) | ||||
|   ioctl(fe, FE_GET_INFO, &value); | ||||
|   close(fe); | ||||
|  | ||||
|   return (cString::sprintf("#%d %s", cardIndex, value.name)); | ||||
|   return (cString::sprintf("%s on device #%d", value.name, cardIndex)); | ||||
| } | ||||
|  | ||||
| cString getFrontendStatus(int cardIndex) | ||||
| @@ -41,7 +41,7 @@ cString getFrontendStatus(int cardIndex) | ||||
|   CHECK(ioctl(fe, FE_READ_STATUS, &value)); | ||||
|   close(fe); | ||||
|  | ||||
|   return (cString::sprintf("%s:%s:%s:%s:%s", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-")); | ||||
|   return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", cardIndex)); | ||||
| } | ||||
|  | ||||
| uint16_t getSignal(int cardIndex) | ||||
| @@ -108,20 +108,3 @@ uint32_t getUNC(int cardIndex) | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| double getVideoBitrate(void) | ||||
| { | ||||
|   double value = 0.0; | ||||
|  | ||||
|   // Not yet implemented. | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| double getAudioBitrate(void) | ||||
| { | ||||
|   double value = 0.0; | ||||
|  | ||||
|   // Not yet implemented. | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|   | ||||
| @@ -26,7 +26,5 @@ uint16_t getSNR(int cardIndex = 0); | ||||
| uint16_t getSignal(int cardIndex = 0); | ||||
| uint32_t getBER(int cardIndex = 0); | ||||
| uint32_t getUNC(int cardIndex = 0); | ||||
| double getVideoBitrate(void); | ||||
| double getAudioBitrate(void); | ||||
|  | ||||
| #endif // __FEMONTOOLS_H | ||||
|   | ||||
		Reference in New Issue
	
	Block a user