mirror of
				https://github.com/rofafor/vdr-plugin-femon.git
				synced 2023-10-10 11:36:53 +00:00 
			
		
		
		
	Compare commits
	
		
			16 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 64e56af6dc | ||
|  | 830aa73e1a | ||
|  | 78048d8ea0 | ||
|  | 42c6b69490 | ||
|  | 6ce0ca32bd | ||
|  | 74a2a1bbe7 | ||
|  | bf85e32d0d | ||
|  | caf42f7ace | ||
|  | c2b1e5a187 | ||
|  | e90fe6065c | ||
|  | 7ee255830a | ||
|  | 7da8cb2110 | ||
|  | e2fb9e994a | ||
|  | 37957be99f | ||
|  | 713f9e652a | ||
|  | 7c948cde72 | 
							
								
								
									
										91
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -161,3 +161,94 @@ VDR Plugin 'femon' Revision History | ||||
|  | ||||
| - Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM' to 'FEMON_NTSC'). | ||||
| - Enabled preliminary support for the device switching. | ||||
|  | ||||
| 2005-07-23: Version 0.9.1 | ||||
|  | ||||
| - Fixed AC3-info flickering (Thanks to Pasi Juppo for reporting this one). | ||||
| - Added "Analog" type CA system. | ||||
| - Plugin is now stripped by default. | ||||
|  | ||||
| 2005-08-15: Version 0.9.2 | ||||
|  | ||||
| - Threads updated for vdr-1.3.29. | ||||
|  | ||||
| 2005-08-28: Version 0.9.3 | ||||
|  | ||||
| - 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). | ||||
|  | ||||
| 2006-01-25: Version 0.9.6 | ||||
|  | ||||
| - Updated for vdr-1.3.40. | ||||
| - Fixed a translation bug (Thanks to Antti Hartikainen). | ||||
| - Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this one). | ||||
| - Fixed EgalsTry theme (Thanks to Uwe Hanke). | ||||
|  | ||||
| 2006-02-06: Version 0.9.7 | ||||
|  | ||||
| - Updated for vdr-1.3.42. | ||||
| - Added "SilverGreen" theme (Thanks to Rififi77 @ VDRPortal). | ||||
|  | ||||
| 2006-03-08: Version 0.9.8 | ||||
|  | ||||
| - Updated for vdr-1.3.44. | ||||
| - Minor Makefile changes. | ||||
| - Made all symbol data 'const'. | ||||
| - Added spanish translation (Thanks to Luis Palacios). | ||||
|  | ||||
| 2006-04-20: Version 0.9.9 | ||||
|  | ||||
| - Updated for vdr-1.3.47. | ||||
|  | ||||
| 2006-04-23: Version 0.9.10 | ||||
|  | ||||
| - Added STRIP option for Makefile (Thanks to Ville Skytt<74>). | ||||
| - Modified APIVERSION code in Makefile. | ||||
|  | ||||
| 2006-04-30: Version 1.0.0 | ||||
|  | ||||
| - Updated for vdr-1.4.0. | ||||
| - Modified APIVERSION code in Makefile. | ||||
| - Updated german translation (Thanks to Andreas Brachold). | ||||
|  | ||||
| 2006-06-06: Version 1.0.1 | ||||
|  | ||||
| - Fixed device switching priority (Thanks to Andreas Brugger). | ||||
| - Fixed device switching back to the primary device. | ||||
|  | ||||
| 2006-09-17: Version 1.1.0 | ||||
|  | ||||
| - Added support for svdrpservice plugin (Thanks to Frank Schmirler). | ||||
| - Added INFO SVDRP command (partially based on patch by Herbert P<>tzl). | ||||
| - Removed system log option - use SVDRP instead. | ||||
| - Added --remove-destination to the 'cp' command in Makefile. | ||||
|  | ||||
| 2007-01-08: Version 1.1.1 | ||||
|  | ||||
| - Updated for vdr-1.5.0. | ||||
|  | ||||
| 2007-05-01: Version 1.1.2 | ||||
|  | ||||
| - Fixed opening while replaying (Thanks to Antti Sepp<70>l<EFBFBD> for reporting this one). | ||||
|  | ||||
| 2007-05-15: Version 1.1.3 | ||||
|  | ||||
| - Fixed a race condition in cFemonReceiver (Thanks to Reinhard Nissl). | ||||
|   | ||||
							
								
								
									
										31
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,6 +3,15 @@ | ||||
| # | ||||
| # $Id$ | ||||
|  | ||||
| # Debugging on/off  | ||||
| #FEMON_DEBUG = 1 | ||||
|  | ||||
| # NTSC on/off  | ||||
| #FEMON_NTSC = 1 | ||||
|  | ||||
| # Strip debug symbols?  Set eg. to /bin/true if not | ||||
| STRIP = strip | ||||
|  | ||||
| # The official name of this plugin. | ||||
| # This name will be used in the '-P...' option of VDR to load the plugin. | ||||
| # By default the main source file also carries this name. | ||||
| @@ -11,16 +20,15 @@ PLUGIN = femon | ||||
|  | ||||
| ### The version number of this plugin (taken from the main source file): | ||||
|  | ||||
| VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).h | awk '{ print $$6 }' | sed -e 's/[";]//g') | ||||
| VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).h | awk '{ print $$6 }' | sed -e 's/[";]//g') | ||||
|  | ||||
| ### The C++ compiler and options: | ||||
|  | ||||
| CXX      ?= g++ | ||||
| CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual -fPIC | ||||
| CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual | ||||
|  | ||||
| ### The directory environment: | ||||
|  | ||||
| DVBDIR = ../../../../DVB | ||||
| VDRDIR = ../../.. | ||||
| LIBDIR = ../../lib | ||||
| TMPDIR = /tmp | ||||
| @@ -29,9 +37,9 @@ TMPDIR = /tmp | ||||
|  | ||||
| -include $(VDRDIR)/Make.config | ||||
|  | ||||
| ### The version number of VDR (taken from VDR's "config.h"): | ||||
| ### The version number of VDR's plugin API (taken from VDR's "config.h"): | ||||
|  | ||||
| VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g') | ||||
| APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h) | ||||
|  | ||||
| ### The name of the distribution archive: | ||||
|  | ||||
| @@ -40,16 +48,16 @@ PACKAGE = vdr-$(ARCHIVE) | ||||
|  | ||||
| ### Includes and Defines (add further entries here): | ||||
|  | ||||
| INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include | ||||
| INCLUDES += -I$(VDRDIR)/include | ||||
|  | ||||
| DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' | ||||
|  | ||||
| ifdef FEMON_NTSC | ||||
| DEFINES += -DFEMON_NTSC | ||||
| DEFINES += -DNTSC | ||||
| endif | ||||
|  | ||||
| ifdef FEMON_DEBUG | ||||
| DEFINES += -DFEMON_DEBUG | ||||
| DEFINES += -DDEBUG | ||||
| endif | ||||
|  | ||||
| .PHONY: all all-redirect | ||||
| @@ -57,7 +65,7 @@ all-redirect: all | ||||
|  | ||||
| ### The object files (add further files here): | ||||
|  | ||||
| OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o | ||||
| OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o femontools.o | ||||
|  | ||||
| ### Implicit rules: | ||||
|  | ||||
| @@ -79,7 +87,10 @@ all: libvdr-$(PLUGIN).so | ||||
|  | ||||
| libvdr-$(PLUGIN).so: $(OBJS) | ||||
| 	$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@ | ||||
| 	@cp $@ $(LIBDIR)/$@.$(VDRVERSION) | ||||
| ifndef FEMON_DEBUG | ||||
| 	@$(STRIP) $@ | ||||
| endif | ||||
| 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION) | ||||
|  | ||||
| dist: clean | ||||
| 	@-rm -rf $(TMPDIR)/$(ARCHIVE) | ||||
|   | ||||
							
								
								
									
										44
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								README
									
									
									
									
									
								
							| @@ -28,7 +28,7 @@ the 'libdvb' library by Metzler Brothers. | ||||
| Terminology: | ||||
|  | ||||
| -------------------------------------------------------------- | ||||
| |## Channel Name ########################## [AR][VF][A/DD][D]| | ||||
| |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| | ||||
| |[=====Signal Strength in % ==============|=================]| | ||||
| |[=====Signal-to-Noise Ratio in % ========|=================]| | ||||
| | STR: #0000 (0%)       BER: #00000000       Video: 0 Mbit/s | | ||||
| @@ -49,10 +49,11 @@ CARRIER - Found a DVB signal | ||||
| VITERBI - FEC (forward error correction) is stable | ||||
| SYNC    - Found sync bytes | ||||
|  | ||||
| SVDRP   - SVDRP connection active (optional) | ||||
| AR      - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional) | ||||
| VF      - Video format: PAL/NTSC (optional) | ||||
| A/DD    - Audio (0..5) / AC-3 track (optional) | ||||
| D       - Device number: 0..3 (optional) | ||||
| A/DD    - Audio (0..N) / AC-3 track (optional) | ||||
| D       - Device number: 0..N (optional) | ||||
|  | ||||
| Controls: | ||||
|  | ||||
| @@ -63,7 +64,7 @@ Ok            - Switch between display modes: basic, transponder, stream, AC-3 | ||||
| Green         - Select next audio track | ||||
| Yellow        - Select audio channel: stereo, mono left, mono right | ||||
| Back          - Exit plugin | ||||
| Left/Right   - Switch to next/previous device that provides the current channel | ||||
| Left/Right    - Switch to next/previous device that provides the current channel | ||||
|  | ||||
| Installation: | ||||
|  | ||||
| @@ -75,19 +76,42 @@ make | ||||
| make plugins | ||||
| ./vdr -P femon | ||||
|  | ||||
| Client-server architecture: | ||||
|  | ||||
| The SVDRP service extension can be used in client-server configurations. | ||||
| A streamdev based VDR-to-VDR streaming client can retrieve frontend | ||||
| information from a server, if the SVDRP service has been activated and | ||||
| properly configured in femon. The svdrpservice plugin is required on the | ||||
| VDR client. | ||||
|  | ||||
| If the client fails to open a DVB card frontend corresponding to the | ||||
| current receiving device, it will connect to the SVDRP server, look for | ||||
| the femon plugin and tune the channel on the server to the one currently | ||||
| viewed on the client. If one of these steps fails, the femon OSD won't | ||||
| open on the client. An SVDRP icon in the femon title bar indicates that | ||||
| the data source is SVDRP. The device number in the title bar is always | ||||
| the local device number. | ||||
|  | ||||
| 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. | ||||
|  | ||||
| - The signal strength and signal-to-noise ratio values are comparable only | ||||
|   between the same brand/model frontends. Due to the lack of proper frontend | ||||
|   specifications those values cannot be calculated into any real units. | ||||
|  | ||||
| - If the OSD isn't visible, you've configured the OSD height too big or too | ||||
|   small. Please, try to adjust the variable on the setup page before writing | ||||
|   any bug reports. | ||||
| - There's a shrinked default OSD height for NTSC users: make FEMON_NTSC=1 | ||||
| - The device switching feature is still non-functional. | ||||
|   any bug reports. NTSC users should use a shrinked default OSD height by | ||||
|   compiling the plugin with: make FEMON_NTSC=1 | ||||
|  | ||||
| - If the SVDRP service is used: femon won't notice if the server is tuned | ||||
|   to a different channel and tuning the channel on the server might annoy | ||||
|   people watching live TV. In some situations the server will refuse | ||||
|   switching to the requested channel. On a headless server you can avoid | ||||
|   this by installing the dummydevice plugin. | ||||
|  | ||||
| "Femon - A real womon who lives according to her natural feminine inclinations." | ||||
|   | ||||
							
								
								
									
										204
									
								
								femon.c
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								femon.c
									
									
									
									
									
								
							| @@ -6,26 +6,32 @@ | ||||
|  * $Id$ | ||||
|  */ | ||||
|  | ||||
| #include <vdr/menu.h> | ||||
| #include <vdr/remote.h> | ||||
| #include "femoncfg.h" | ||||
| #include "femoni18n.h" | ||||
| #include "femonreceiver.h" | ||||
| #include "femonosd.h" | ||||
| #include "femonservice.h" | ||||
| #include "femontools.h" | ||||
| #include "femon.h" | ||||
|  | ||||
| #if VDRVERSNUM && VDRVERSNUM < 10321 | ||||
| #error "You don't exist! Go away!" | ||||
| #if defined(APIVERSNUM) && APIVERSNUM < 10400 | ||||
| #error "VDR-1.4.0 API version or greater is required!" | ||||
| #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) | ||||
| @@ -66,18 +72,23 @@ 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__); | ||||
|   if (cReplayControl::NowReplaying()) | ||||
|      Skins.Message(mtInfo, tr("Femon not available while replaying")); | ||||
|   else | ||||
|      return cFemonOsd::Instance(true); | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| bool cPluginFemon::SetupParse(const char *Name, const char *Value) | ||||
| { | ||||
|   // Parse your own setup parameters and store their values. | ||||
|   if      (!strcasecmp(Name, "HideMenu"))       femonConfig.hidemenu       = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "SyslogOutput"))   femonConfig.syslogoutput   = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "DisplayMode"))    femonConfig.displaymode    = atoi(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); | ||||
| @@ -85,6 +96,9 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value) | ||||
|   else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "AnalStream"))     femonConfig.analyzestream  = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "CalcInterval"))   femonConfig.calcinterval   = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "UseSvdrp"))       femonConfig.usesvdrp       = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "ServerPort"))     femonConfig.svdrpport      = atoi(Value); | ||||
|   else if (!strcasecmp(Name, "ServerIp"))       strn0cpy(femonConfig.svdrpip, Value, sizeof(femonConfig.svdrpip)); | ||||
|   else | ||||
|     return false; | ||||
|   if (femonConfig.displaymode < 0 || femonConfig.displaymode >= eFemonModeMaxNumber) femonConfig.displaymode = 0; | ||||
| @@ -92,18 +106,155 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value) | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| bool cPluginFemon::Service(const char *Id, void *Data) | ||||
| { | ||||
|   if ((strcmp(Id,"FemonService-v1.0") == 0) && Data) { | ||||
|      FemonService_v1_0 *data = (FemonService_v1_0*)Data; | ||||
|      int ndx = cDevice::ActualDevice()->CardIndex(); | ||||
|      data->fe_name = getFrontendName(ndx); | ||||
|      data->fe_status = getFrontendStatus(ndx); | ||||
|      data->fe_snr = getSNR(ndx); | ||||
|      data->fe_signal = getSignal(ndx); | ||||
|      data->fe_ber = getBER(ndx); | ||||
|      data->fe_unc = getUNC(ndx); | ||||
|      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; | ||||
|      } | ||||
|  | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| 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.", | ||||
|     "INFO\n" | ||||
|     "    Print the current frontend information.", | ||||
|     "NAME\n" | ||||
|     "    Print the current frontend name.", | ||||
|     "STAT\n" | ||||
|     "    Print the current frontend status.", | ||||
|     "SGNL\n" | ||||
|     "    Print the current signal strength.", | ||||
|     "SNRA\n" | ||||
|     "    Print the current signal-to-noise ratio.", | ||||
|     "BERA\n" | ||||
|     "    Print the current bit error rate.", | ||||
|     "UNCB\n" | ||||
|     "    Print the current uncorrected blocks rate.", | ||||
|     "VIBR\n" | ||||
|     "    Print the actual device and current video bitrate [Mbit/s].", | ||||
|     "AUBR\n" | ||||
|     "    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; | ||||
| } | ||||
|  | ||||
| cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) | ||||
| { | ||||
|   if (strcasecmp(Command, "OPEN") == 0) { | ||||
|      if (cReplayControl::NowReplaying()) { | ||||
|         ReplyCode = 550; // Requested action not taken | ||||
|         return cString("Cannot open femon plugin while replaying"); | ||||
|         } | ||||
|      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, "INFO") == 0) { | ||||
|      return getFrontendInfo(cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   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) { | ||||
|      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) { | ||||
|      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 on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "UNCB") == 0) { | ||||
|      return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "VIBR") == 0) { | ||||
|      if (cFemonOsd::Instance()) | ||||
|         return cString::sprintf("%s on device #%d", *getBitrateMbits(cFemonOsd::Instance()->GetVideoBitrate()), cDevice::ActualDevice()->CardIndex()); | ||||
|      else | ||||
|         return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); | ||||
|      } | ||||
|   else if (strcasecmp(Command, "AUBR") == 0) { | ||||
|      if (cFemonOsd::Instance()) | ||||
|         return cString::sprintf("%s on device #%d", *getBitrateKbits(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("%s on device #%d", *getBitrateKbits(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"); | ||||
|   themes[eFemonThemeSilverGreen]   = tr("SilverGreen"); | ||||
|  | ||||
|   data = femonConfig; | ||||
|   Setup(); | ||||
| } | ||||
|  | ||||
| @@ -112,20 +263,25 @@ 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 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)); | ||||
|   Add(new cMenuEditBoolItem(  tr("Use SVDRP service"),           &data.usesvdrp)); | ||||
|   if (data.usesvdrp) { | ||||
|      Add(new cMenuEditIntItem(tr("SVDRP service port"),          &data.svdrpport,      1,                   65535)); | ||||
|      Add(new cMenuEditStrItem(tr("SVDRP service IP"),             data.svdrpip,        MaxSvdrpIp,          ".1234567890")); | ||||
|      } | ||||
|  | ||||
|   SetCurrent(Get(current)); | ||||
|   Display(); | ||||
| @@ -133,9 +289,11 @@ 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); | ||||
| @@ -146,15 +304,19 @@ void cMenuFemonSetup::Store(void) | ||||
|   SetupStore("UpdateInterval", femonConfig.updateinterval); | ||||
|   SetupStore("AnalStream",     femonConfig.analyzestream); | ||||
|   SetupStore("CalcInterval",   femonConfig.calcinterval); | ||||
|   SetupStore("UseSvdrp",       femonConfig.usesvdrp); | ||||
|   SetupStore("ServerPort",     femonConfig.svdrpport); | ||||
|   SetupStore("ServerIp",       femonConfig.svdrpip); | ||||
| } | ||||
|  | ||||
| eOSState cMenuFemonSetup::ProcessKey(eKeys Key) | ||||
| { | ||||
|   int oldAnalyzestream = femonConfig.analyzestream; | ||||
|   int oldUsesvdrp = data.usesvdrp; | ||||
|   int oldAnalyzestream = data.analyzestream; | ||||
|  | ||||
|   eOSState state = cMenuSetupPage::ProcessKey(Key); | ||||
|  | ||||
|   if (Key != kNone && (femonConfig.analyzestream != oldAnalyzestream)) { | ||||
|   if (Key != kNone && (data.analyzestream != oldAnalyzestream || data.usesvdrp != oldUsesvdrp)) { | ||||
|      Setup(); | ||||
|      } | ||||
|  | ||||
|   | ||||
							
								
								
									
										33
									
								
								femon.h
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								femon.h
									
									
									
									
									
								
							| @@ -11,13 +11,11 @@ | ||||
|  | ||||
| #include <vdr/plugin.h> | ||||
|  | ||||
| static const char *VERSION        = "0.9.0"; | ||||
| static const char *DESCRIPTION    = "DVB Signal Information Monitor (OSD)"; | ||||
| static const char *MAINMENUENTRY  = "Signal Information"; | ||||
| static const char VERSION[]       = "1.1.3"; | ||||
| 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(); | ||||
| @@ -29,22 +27,29 @@ public: | ||||
|   virtual bool Start(void); | ||||
|   virtual void Stop(void); | ||||
|   virtual void Housekeeping(void); | ||||
|   virtual void MainThreadHook(void) {} | ||||
|   virtual cString Active(void) { return NULL; } | ||||
|   virtual const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); } | ||||
|   virtual cOsdObject *MainMenuAction(void); | ||||
|   virtual cMenuSetupPage *SetupMenu(void); | ||||
|   virtual bool SetupParse(const char *Name, const char *Value); | ||||
|   virtual bool Service(const char *Id, void *Data); | ||||
|   virtual const char **SVDRPHelpPages(void); | ||||
|   virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode); | ||||
|   }; | ||||
|  | ||||
| class cMenuFemonSetup : public cMenuSetupPage { | ||||
|   private: | ||||
|     const char *dispmodes[eFemonModeMaxNumber]; | ||||
|     const char *themes[eFemonThemeMaxNumber]; | ||||
|     virtual void Setup(void); | ||||
|   protected: | ||||
|     virtual eOSState ProcessKey(eKeys Key); | ||||
|     virtual void Store(void); | ||||
|   public: | ||||
|     cMenuFemonSetup(void); | ||||
| 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); | ||||
|   virtual void Store(void); | ||||
| public: | ||||
|   cMenuFemonSetup(void); | ||||
|   }; | ||||
|  | ||||
| #endif //__FEMON_H | ||||
|   | ||||
							
								
								
									
										61
									
								
								femoncfg.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								femoncfg.c
									
									
									
									
									
								
							| @@ -6,6 +6,7 @@ | ||||
|  * $Id$ | ||||
|  */ | ||||
|  | ||||
| #include <string.h> | ||||
| #include "femoncfg.h" | ||||
|  | ||||
| cFemonConfig femonConfig; | ||||
| @@ -14,6 +15,7 @@ cFemonConfig::cFemonConfig(void) | ||||
| { | ||||
|   hidemenu       = 0; | ||||
|   displaymode    = 0; | ||||
|   skin           = 0; | ||||
|   theme          = 0; | ||||
|   position       = 1; | ||||
|   redlimit       = 33; | ||||
| @@ -21,20 +23,23 @@ cFemonConfig::cFemonConfig(void) | ||||
|   updateinterval = 5; | ||||
|   analyzestream  = 1; | ||||
|   calcinterval   = 20; | ||||
|   syslogoutput   = 0; | ||||
|   showcasystem   = 0; | ||||
| #ifdef FEMON_NTSC | ||||
| #ifdef NTSC | ||||
|   osdheight      = 420; | ||||
| #else | ||||
|   osdheight      = 480; | ||||
| #endif | ||||
|   osdoffset      = 0; | ||||
|   usesvdrp       = 0; | ||||
|   svdrpport      = 2001; | ||||
|   strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip)); | ||||
| } | ||||
|  | ||||
| const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
| { | ||||
|   { | ||||
|     // eFemonThemeClassic | ||||
|     4,          // bpp | ||||
|     0x7F000000, // clrBackground | ||||
|     0xFFFCFCFC, // clrTitleBackground | ||||
|     0xFF000000, // clrTitleText | ||||
| @@ -46,6 +51,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeElchi | ||||
|     4,          // bpp | ||||
|     0xC8000066, // clrBackground | ||||
|     0xC833AAEE, // clrTitleBackground | ||||
|     0xFF000000, // clrTitleText | ||||
| @@ -57,6 +63,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeDeepBlue | ||||
|     4,          // bpp | ||||
|     0xC80C0C0C, // clrBackground | ||||
|     0xC832557A, // clrTitleBackground | ||||
|     0xFF000000, // clrTitleText | ||||
| @@ -68,6 +75,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] = | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeMoronimo | ||||
|     4,          // bpp | ||||
|     0xDF294A6B, // clrBackground | ||||
|     0xDF3E5578, // clrTitleBackground | ||||
|     0xFF9BBAD7, // clrTitleText | ||||
| @@ -77,5 +85,52 @@ 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 | ||||
|     4,          // bpp | ||||
|     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 | ||||
|   }, | ||||
|   { | ||||
|     // eFemonThemeSilverGreen | ||||
|     4,          // bpp | ||||
|     0xD9526470, // clrBackground | ||||
|     0xD9293841, // clrTitleBackground | ||||
|     0xFFB3BDCA, // clrTitleText | ||||
|     0xFFCE7B00, // clrActiveText | ||||
|     0xFFB3BDCA, // clrInactiveText | ||||
|     0xFF992900, // clrRed | ||||
|     0xFFCE7B00, // clrYellow | ||||
|     0xFF336600, // clrGreen | ||||
|   }, | ||||
| }; | ||||
|  | ||||
|   | ||||
							
								
								
									
										23
									
								
								femoncfg.h
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								femoncfg.h
									
									
									
									
									
								
							| @@ -9,11 +9,7 @@ | ||||
| #ifndef __FEMONCFG_H | ||||
| #define __FEMONCFG_H | ||||
|  | ||||
| #ifdef FEMON_DEBUG | ||||
| #define Dprintf(x...) printf(x); | ||||
| #else | ||||
| #define Dprintf(x...) ; | ||||
| #endif | ||||
| #define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx | ||||
|  | ||||
| enum eFemonModes | ||||
| { | ||||
| @@ -30,6 +26,7 @@ public: | ||||
|   cFemonConfig(void); | ||||
|   int hidemenu; | ||||
|   int displaymode; | ||||
|   int skin; | ||||
|   int theme; | ||||
|   int position; | ||||
|   int redlimit; | ||||
| @@ -37,25 +34,39 @@ public: | ||||
|   int updateinterval; | ||||
|   int analyzestream; | ||||
|   int calcinterval; | ||||
|   int syslogoutput; | ||||
|   int showcasystem; | ||||
|   int osdheight; | ||||
|   int osdoffset; | ||||
|   int usesvdrp; | ||||
|   int svdrpport; | ||||
|   char svdrpip[MaxSvdrpIp + 1]; // must end with additional null | ||||
| }; | ||||
|  | ||||
| extern cFemonConfig femonConfig; | ||||
|  | ||||
| enum eFemonSkins | ||||
| { | ||||
|   eFemonSkinClassic, | ||||
|   eFemonSkinElchi, | ||||
|   eFemonSkinMaxNumber | ||||
| }; | ||||
|  | ||||
| enum eFemonThemes | ||||
| { | ||||
|   eFemonThemeClassic, | ||||
|   eFemonThemeElchi, | ||||
|   eFemonThemeDeepBlue, | ||||
|   eFemonThemeMoronimo, | ||||
|   eFemonThemeEnigma, | ||||
|   eFemonThemeEgalsTry, | ||||
|   eFemonThemeDuotone, | ||||
|   eFemonThemeSilverGreen, | ||||
|   eFemonThemeMaxNumber | ||||
| }; | ||||
|  | ||||
| struct cFemonTheme | ||||
| { | ||||
|   int bpp; | ||||
|   int clrBackground; | ||||
|   int clrTitleBackground; | ||||
|   int clrTitleText; | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								femonclient/vdr-femonclient-0.0.2.tgz
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								femonclient/vdr-femonclient-0.0.2.tgz
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										743
									
								
								femoni18n.c
									
									
									
									
									
								
							
							
						
						
									
										743
									
								
								femoni18n.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										998
									
								
								femonosd.c
									
									
									
									
									
								
							
							
						
						
									
										998
									
								
								femonosd.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										27
									
								
								femonosd.h
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								femonosd.h
									
									
									
									
									
								
							| @@ -15,16 +15,26 @@ | ||||
| #include <vdr/osd.h> | ||||
| #include <vdr/thread.h> | ||||
| #include <vdr/status.h> | ||||
| #include <vdr/plugin.h> | ||||
| #include <vdr/channels.h> | ||||
| #include <vdr/transfer.h> | ||||
| #include <vdr/tools.h> | ||||
| #include "svdrpservice.h" | ||||
|  | ||||
| #define MAX_BM_NUMBER 5 | ||||
|  | ||||
| class cFemonOsd : public cOsdObject, public cThread, public cStatus { | ||||
| private: | ||||
|   bool m_Active; | ||||
|   enum { MAX_BMNUMBERS = 6 }; | ||||
|   static cFemonOsd *pInstance; | ||||
|   cOsd *m_Osd; | ||||
|   cFemonReceiver *m_Receiver; | ||||
|   int m_Frontend; | ||||
|   int m_SvdrpFrontend; | ||||
|   double m_SvdrpVideoBitrate; | ||||
|   double m_SvdrpAudioBitrate; | ||||
|   SvdrpConnection_v1_0 m_SvdrpConnection; | ||||
|   cPlugin *m_SvdrpPlugin; | ||||
|   struct dvb_frontend_info m_FrontendInfo; | ||||
|   int m_Number; | ||||
|   int m_OldNumber; | ||||
| @@ -38,23 +48,34 @@ private: | ||||
|   cTimeMs m_InputTime; | ||||
|   cMutex* m_Mutex; | ||||
|   static cBitmap bmStereo, bmMonoLeft, bmMonoRight, bmDD, bmDD20, bmDD51; | ||||
|   static cBitmap bmZero, bmDevice, bmPAL, bmNTSC, bmOne, bmTwo, bmThree, bmFour, bmFive; | ||||
|   static cBitmap bmNumbers[MAX_BMNUMBERS]; | ||||
|   static cBitmap bmDevice, bmPAL, bmNTSC, bmSVDRP; | ||||
|   static cBitmap bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3; | ||||
|   static cBitmap bmLock, bmSignal, bmCarrier, bmViterbi, bmSync; | ||||
|   void DrawStatusWindow(void); | ||||
|   void DrawInfoWindow(void); | ||||
|   bool SvdrpConnect(void); | ||||
|   bool SvdrpTune(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 | ||||
|   | ||||
							
								
								
									
										121
									
								
								femonreceiver.c
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								femonreceiver.c
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include <unistd.h> | ||||
| #include <vdr/tools.h> | ||||
| #include "femontools.h" | ||||
| #include "femoncfg.h" | ||||
| #include "femonreceiver.h" | ||||
|  | ||||
| @@ -17,11 +17,14 @@ | ||||
| #define PAYLOAD       0x10 | ||||
| #define PTS_DTS_FLAGS 0xC0 | ||||
|  | ||||
| cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid[], int Dpid[]) | ||||
| cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[]) | ||||
| #if defined(APIVERSNUM) && APIVERSNUM < 10500 | ||||
| :cReceiver(Ca, -1, Vpid, Apid, Dpid, NULL), cThread("femon receiver") | ||||
| #else | ||||
| :cReceiver(ChannelID, -1, Vpid, Apid, Dpid, NULL), cThread("femon receiver") | ||||
| #endif | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   m_Active = false; | ||||
|   m_VideoPid = Vpid; | ||||
|   m_AudioPid = Apid[0]; | ||||
|   m_AC3Pid = Dpid[0]; | ||||
| @@ -59,11 +62,9 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid[], int Dpid[]) | ||||
| cFemonReceiver::~cFemonReceiver(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   if (Running()) | ||||
|      Cancel(3); | ||||
|   Detach(); | ||||
|   if (m_Active) { | ||||
|      m_Active = false; | ||||
|      Cancel(); | ||||
|      } | ||||
| } | ||||
|  | ||||
| /* The following function originates from libdvbmpeg: */ | ||||
| @@ -72,7 +73,7 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count) | ||||
|   uint8_t *headr; | ||||
|   int found = 0; | ||||
|   int c = 0; | ||||
|   m_VideoValid = false; | ||||
|   //m_VideoValid = false; | ||||
|   while ((found < 4) && ((c + 4) < count)) { | ||||
|     uint8_t *b; | ||||
|     b = mbuf + c; | ||||
| @@ -145,7 +146,7 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count) | ||||
|       m_VideoFormat = VF_UNKNOWN; | ||||
|       break; | ||||
|     } | ||||
|   m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0; | ||||
|   m_VideoStreamBitrate = 400.0 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)); | ||||
| } | ||||
|  | ||||
| static unsigned int bitrates[3][16] = | ||||
| @@ -165,7 +166,7 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count) | ||||
|   int found = 0; | ||||
|   int c = 0; | ||||
|   int tmp = 0; | ||||
|   m_AudioValid = false; | ||||
|   //m_AudioValid = false; | ||||
|   while (!found && (c < count)) { | ||||
|     uint8_t *b = mbuf + c; | ||||
|     if ((b[0] == 0xff) && ((b[1] & 0xf8) == 0xf8)) | ||||
| @@ -183,7 +184,7 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count) | ||||
|   else if (tmp == 0xf) | ||||
|      m_AudioStreamBitrate = (double)FR_RESERVED; | ||||
|   else | ||||
|      m_AudioStreamBitrate = tmp / 1000.0; | ||||
|      m_AudioStreamBitrate = tmp; | ||||
|   tmp = samplerates[((headr[2] & 0x0c) >> 2)] * 100; | ||||
|   if (tmp == 3) | ||||
|      m_AudioSamplingFreq = FR_RESERVED; | ||||
| @@ -214,7 +215,7 @@ void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count) | ||||
|   int found = 0; | ||||
|   int c = 0; | ||||
|   uint8_t frame; | ||||
|   m_AC3Valid = false; | ||||
|   //m_AC3Valid = false; | ||||
|   while (!found && (c < count)) { | ||||
|     uint8_t *b = mbuf + c; | ||||
|     if ((b[0] == 0x0b) && (b[1] == 0x77)) | ||||
| @@ -226,7 +227,7 @@ void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count) | ||||
|   m_AC3Valid = true; | ||||
|   headr = mbuf + c + 2; | ||||
|   frame = (headr[2] & 0x3f); | ||||
|   m_AC3StreamBitrate = ac3_bitrates[frame >> 1]; | ||||
|   m_AC3StreamBitrate = ac3_bitrates[frame >> 1] * 1000; | ||||
|   int fr = (headr[2] & 0xc0 ) >> 6; | ||||
|   m_AC3SamplingFreq = ac3_freq[fr] * 100; | ||||
|   m_AC3FrameSize = ac3_frames[fr][frame >> 1]; | ||||
| @@ -234,33 +235,80 @@ void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count) | ||||
|      m_AC3FrameSize <<= 1; | ||||
|   m_AC3BitStreamMode = (headr[3] & 7); | ||||
|   m_AC3AudioCodingMode = (headr[4] & 0xE0) >> 5; | ||||
|   if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) // if 3 front channels | ||||
|   if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) { | ||||
|      // 3 front channels | ||||
|      m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3; | ||||
|   else | ||||
|      if (m_AC3AudioCodingMode & 0x04) { | ||||
|         // a surround channel exists | ||||
|         m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1; | ||||
|         if (m_AC3AudioCodingMode == 0x02) { | ||||
|            // if in 2/0 mode | ||||
|            m_AC3DolbySurroundMode = ((headr[4] & 0x01) << 1) | ((headr[5] & 0x80) >> 7); | ||||
|            m_AC3LfeOn = (headr[5] & 0x40) >> 6; | ||||
|            m_AC3DialogLevel = (headr[5] & 0x3e) >> 1; | ||||
|            } | ||||
|         else { | ||||
|            m_AC3DolbySurroundMode = FR_NOTVALID; | ||||
|            m_AC3LfeOn = (headr[4] & 0x01); | ||||
|            m_AC3DialogLevel = (headr[5] & 0xF8) >> 3; | ||||
|            } | ||||
|         } | ||||
|      else { | ||||
|         m_AC3SurroundMixLevel = FR_NOTVALID; | ||||
|         if (m_AC3AudioCodingMode == 0x02) { | ||||
|            // if in 2/0 mode | ||||
|             m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1; | ||||
|             m_AC3LfeOn = (headr[4] & 0x01); | ||||
|             m_AC3DialogLevel = (headr[5] & 0xF8) >> 3; | ||||
|            } | ||||
|         else { | ||||
|            m_AC3DolbySurroundMode = FR_NOTVALID; | ||||
|            m_AC3LfeOn = (headr[4] & 0x04) >> 2; | ||||
|            m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5); | ||||
|            } | ||||
|         } | ||||
|      } | ||||
|   else { | ||||
|      m_AC3CenterMixLevel = FR_NOTVALID; | ||||
|   if (m_AC3AudioCodingMode & 0x04) //  if a surround channel exists | ||||
|      m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1; | ||||
|   else | ||||
|      m_AC3SurroundMixLevel = FR_NOTVALID; | ||||
|   if (m_AC3AudioCodingMode == 0x02) // if in 2/0 mode | ||||
|      m_AC3DolbySurroundMode = ((headr[4] & 1) << 1) | ((headr[5] & 0x80) >> 7); | ||||
|   else  | ||||
|      m_AC3DolbySurroundMode = FR_NOTVALID; | ||||
|   m_AC3LfeOn = (headr[5] & 0x40) >> 6; | ||||
|   m_AC3DialogLevel = (headr[5] & 0x3e) >> 1; | ||||
|      if (m_AC3AudioCodingMode & 0x04) { | ||||
|         // a surround channel exists | ||||
|         m_AC3SurroundMixLevel = (headr[4] & 0x18) >> 3; | ||||
|         if (m_AC3AudioCodingMode == 0x02) { | ||||
|            // if in 2/0 mode | ||||
|            m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1; | ||||
|            m_AC3LfeOn = (headr[4] & 0x01); | ||||
|            m_AC3DialogLevel = (headr[5] & 0xF8) >> 3; | ||||
|            } | ||||
|         else { | ||||
|            m_AC3DolbySurroundMode = FR_NOTVALID; | ||||
|            m_AC3LfeOn = (headr[4] & 0x04) >> 2; | ||||
|            m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5); | ||||
|            } | ||||
|         } | ||||
|      else { | ||||
|         m_AC3SurroundMixLevel = FR_NOTVALID; | ||||
|         if (m_AC3AudioCodingMode == 0x02) { | ||||
|            // if in 2/0 mode | ||||
|            m_AC3DolbySurroundMode = (headr[4] & 0x18) >> 3; | ||||
|            m_AC3LfeOn = (headr[4] & 0x04) >> 2; | ||||
|            m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5); | ||||
|            } | ||||
|         else { | ||||
|            m_AC3DolbySurroundMode = FR_NOTVALID; | ||||
|            m_AC3LfeOn = (headr[4] & 0x10) >> 4; | ||||
|            m_AC3DialogLevel = ((headr[4] & 0x0F) << 1) | ((headr[5] & 0x80) >> 7); | ||||
|            } | ||||
|         } | ||||
|      } | ||||
| } | ||||
|  | ||||
| void cFemonReceiver::Activate(bool On) | ||||
| { | ||||
|   Dprintf("%s(%d)\n", __PRETTY_FUNCTION__, On); | ||||
|   if (On) { | ||||
|      if (!m_Active) | ||||
|         Start(); | ||||
|      } | ||||
|   else if (m_Active) { | ||||
|      m_Active = false; | ||||
|   if (On) | ||||
|      Start(); | ||||
|   else | ||||
|      Cancel(); | ||||
|      } | ||||
| } | ||||
|  | ||||
| void cFemonReceiver::Receive(uchar *Data, int Length) | ||||
| @@ -309,15 +357,14 @@ void cFemonReceiver::Action(void) | ||||
| { | ||||
|   Dprintf("%s()\n", __PRETTY_FUNCTION__); | ||||
|   cTimeMs t; | ||||
|   m_Active = true; | ||||
|   while (m_Active) { | ||||
|   while (Running()) { | ||||
|         t.Set(0); | ||||
|         // TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit | ||||
|         m_VideoBitrate = (8.0 * 184.0 * m_VideoPacketCount) / (femonConfig.calcinterval * 100000.0); | ||||
|         m_VideoBitrate = (10.0 * 8.0 * 184.0 * m_VideoPacketCount) / femonConfig.calcinterval; | ||||
|         m_VideoPacketCount = 0; | ||||
|         m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0); | ||||
|         m_AudioBitrate = (10.0 * 8.0 * 184.0 * m_AudioPacketCount) / femonConfig.calcinterval; | ||||
|         m_AudioPacketCount = 0; | ||||
|         m_AC3Bitrate   = (8.0 * 184.0 * m_AC3PacketCount)   / (femonConfig.calcinterval * 100.0); | ||||
|         m_AC3Bitrate   = (10.0 * 8.0 * 184.0 * m_AC3PacketCount)   / femonConfig.calcinterval; | ||||
|         m_AC3PacketCount = 0; | ||||
|         cCondWait::SleepMs(100 * femonConfig.calcinterval - t.Elapsed()); | ||||
|     } | ||||
|   | ||||
| @@ -47,13 +47,14 @@ enum eDolbySurroundMode { | ||||
|   DSM_RESERVED          = 3, | ||||
|   }; | ||||
|  | ||||
| #define FR_RESERVED    -1 | ||||
| #define FR_FREE        -2 | ||||
| #define FR_NOTVALID    -3 | ||||
| enum eReveiverCodes { | ||||
|   FR_RESERVED = -1, | ||||
|   FR_FREE     = -2, | ||||
|   FR_NOTVALID = -3 | ||||
|   }; | ||||
|  | ||||
| class cFemonReceiver : public cReceiver, public cThread { | ||||
| private: | ||||
|   bool   m_Active; | ||||
|   int    m_VideoPid; | ||||
|   int    m_AudioPid; | ||||
|   int    m_AC3Pid; | ||||
| @@ -95,7 +96,7 @@ protected: | ||||
|   virtual void Action(void); | ||||
|  | ||||
| public: | ||||
|   cFemonReceiver(int Ca, int Vpid, int Apid[], int Dpid[]); | ||||
|   cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[]); | ||||
|   virtual ~cFemonReceiver(); | ||||
|  | ||||
|   bool VideoValid(void)           { return m_VideoValid; };          // boolean | ||||
| @@ -104,19 +105,19 @@ public: | ||||
|   int VideoAspectRatio(void)      { return m_VideoAspectRatio; };    // eAspectRatio | ||||
|   int VideoFormat(void)           { return m_VideoFormat; };         // eVideoFormat | ||||
|   double VideoFrameRate(void)     { return m_VideoFrameRate; };      // Hz | ||||
|   double VideoStreamBitrate(void) { return m_VideoStreamBitrate; };  // Mbit/s | ||||
|   double VideoBitrate(void)       { return m_VideoBitrate; };        // Mbit/s | ||||
|   double VideoStreamBitrate(void) { return m_VideoStreamBitrate; };  // bit/s | ||||
|   double VideoBitrate(void)       { return m_VideoBitrate; };        // bit/s | ||||
|  | ||||
|   bool AudioValid(void)           { return m_AudioValid; };          // boolean | ||||
|   int AudioMPEGLayer(void)        { return m_AudioMPEGLayer; };      // layer number | ||||
|   int AudioSamplingFreq(void)     { return m_AudioSamplingFreq; };   // Hz | ||||
|   double AudioStreamBitrate(void) { return m_AudioStreamBitrate; };  // kbit/s | ||||
|   double AudioBitrate(void)       { return m_AudioBitrate; };        // kbit/s | ||||
|   double AudioStreamBitrate(void) { return m_AudioStreamBitrate; };  // bit/s | ||||
|   double AudioBitrate(void)       { return m_AudioBitrate; };        // bit/s | ||||
|  | ||||
|   bool AC3Valid(void)             { return m_AC3Valid; };                // boolean | ||||
|   int AC3SamplingFreq(void)       { return m_AC3SamplingFreq; };         // Hz | ||||
|   double AC3StreamBitrate(void)   { return m_AC3StreamBitrate; };        // kbit/s | ||||
|   double AC3Bitrate(void)         { return m_AC3Bitrate; };              // kbit/s | ||||
|   double AC3StreamBitrate(void)   { return m_AC3StreamBitrate; };        // bit/s | ||||
|   double AC3Bitrate(void)         { return m_AC3Bitrate; };              // bit/s | ||||
|   int AC3FrameSize(void)          { return m_AC3FrameSize; };            // Bytes | ||||
|   int AC3BitStreamMode(void)      { return m_AC3BitStreamMode; };        // 0..7 | ||||
|   int AC3AudioCodingMode(void)    { return m_AC3AudioCodingMode; };      // 0..7 | ||||
|   | ||||
							
								
								
									
										27
									
								
								femonservice.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								femonservice.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| /* | ||||
|  * Frontend Status Monitor plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  * $Id$ | ||||
|  */ | ||||
|  | ||||
| #ifndef __FEMONSERVICE_H | ||||
| #define __FEMONSERVICE_H | ||||
|  | ||||
| #include <linux/dvb/frontend.h> | ||||
|  | ||||
| struct FemonService_v1_0 { | ||||
|   cString fe_name; | ||||
|   cString fe_status; | ||||
|   uint16_t fe_snr; | ||||
|   uint16_t fe_signal; | ||||
|   uint32_t fe_ber; | ||||
|   uint32_t fe_unc; | ||||
|   double video_bitrate; | ||||
|   double audio_bitrate; | ||||
|   double dolby_bitrate; | ||||
|   }; | ||||
|  | ||||
| #endif //__FEMONSERVICE_H | ||||
|  | ||||
							
								
								
									
										426
									
								
								femontools.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										426
									
								
								femontools.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,426 @@ | ||||
| /* | ||||
|  * Frontend Status Monitor plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  * $Id$ | ||||
|  */ | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <linux/dvb/frontend.h> | ||||
| #include "femoni18n.h" | ||||
| #include "femonreceiver.h" | ||||
| #include "femonosd.h" | ||||
| #include "femontools.h" | ||||
|  | ||||
| cString getFrontendInfo(int cardIndex) | ||||
| { | ||||
|   cString info; | ||||
|   struct dvb_frontend_info value; | ||||
|   fe_status_t status; | ||||
|   uint16_t signal = 0; | ||||
|   uint16_t snr = 0; | ||||
|   uint32_t ber = 0; | ||||
|   uint32_t unc = 0; | ||||
|   char *dev = NULL; | ||||
|   cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); | ||||
|  | ||||
|   asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); | ||||
|   int fe = open(dev, O_RDONLY | O_NONBLOCK); | ||||
|   free(dev);  | ||||
|   if (fe < 0) | ||||
|      return NULL; | ||||
|   CHECK(ioctl(fe, FE_GET_INFO, &value)); | ||||
|   CHECK(ioctl(fe, FE_READ_STATUS, &status)); | ||||
|   CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal)); | ||||
|   CHECK(ioctl(fe, FE_READ_SNR, &snr)); | ||||
|   CHECK(ioctl(fe, FE_READ_BER, &ber)); | ||||
|   CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc)); | ||||
|   close(fe); | ||||
|  | ||||
|   info = cString::sprintf("CARD:%d\nTYPE:%d\nNAME:%s\nSTAT:%02X\nSGNL:%04X\nSNRA:%04X\nBERA:%08X\nUNCB:%08X", cardIndex, value.type, value.name, status, signal, snr, ber, unc); | ||||
|  | ||||
|   if (cFemonOsd::Instance()) | ||||
|      info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate()); | ||||
|  | ||||
|   if (channel) | ||||
|      info  = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText()); | ||||
|  | ||||
|   return info; | ||||
| } | ||||
|  | ||||
| cString getFrontendName(int cardIndex) | ||||
| { | ||||
|   struct dvb_frontend_info value; | ||||
|   char *dev = NULL; | ||||
|  | ||||
|   asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); | ||||
|   int fe = open(dev, O_RDONLY | O_NONBLOCK); | ||||
|   free(dev); | ||||
|   if (fe < 0) | ||||
|      return NULL; | ||||
|   CHECK(ioctl(fe, FE_GET_INFO, &value)); | ||||
|   close(fe); | ||||
|  | ||||
|   return (cString::sprintf("%s on device #%d", value.name, cardIndex)); | ||||
| } | ||||
|  | ||||
| cString getFrontendStatus(int cardIndex) | ||||
| { | ||||
|   fe_status_t value; | ||||
|   char *dev = NULL; | ||||
|  | ||||
|   asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); | ||||
|   int fe = open(dev, O_RDONLY | O_NONBLOCK); | ||||
|   free(dev); | ||||
|   if (fe < 0) | ||||
|      return NULL; | ||||
|   CHECK(ioctl(fe, FE_READ_STATUS, &value)); | ||||
|   close(fe); | ||||
|  | ||||
|   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) | ||||
| { | ||||
|   uint16_t value = 0; | ||||
|   char *dev = NULL; | ||||
|  | ||||
|   asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); | ||||
|   int fe = open(dev, O_RDONLY | O_NONBLOCK); | ||||
|   free(dev); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value)); | ||||
|   close(fe); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| uint16_t getSNR(int cardIndex) | ||||
| { | ||||
|   uint16_t value = 0; | ||||
|   char *dev = NULL; | ||||
|  | ||||
|   asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); | ||||
|   int fe = open(dev, O_RDONLY | O_NONBLOCK); | ||||
|   free(dev); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   CHECK(ioctl(fe, FE_READ_SNR, &value)); | ||||
|   close(fe); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| uint32_t getBER(int cardIndex) | ||||
| { | ||||
|   uint32_t value = 0; | ||||
|   char *dev = NULL; | ||||
|  | ||||
|   asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); | ||||
|   int fe = open(dev, O_RDONLY | O_NONBLOCK); | ||||
|   free(dev); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   CHECK(ioctl(fe, FE_READ_BER, &value)); | ||||
|   close(fe); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| uint32_t getUNC(int cardIndex) | ||||
| { | ||||
|   uint32_t value = 0; | ||||
|   char *dev = NULL; | ||||
|  | ||||
|   asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); | ||||
|   int fe = open(dev, O_RDONLY | O_NONBLOCK); | ||||
|   free(dev); | ||||
|   if (fe < 0) | ||||
|      return (value); | ||||
|   CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value)); | ||||
|   close(fe); | ||||
|  | ||||
|   return (value); | ||||
| } | ||||
|  | ||||
| cString getApids(const cChannel *channel) | ||||
| { | ||||
|   int value = 0; | ||||
|   cString apids = cString::sprintf("%d", channel->Apid(value)); | ||||
|   while (channel->Apid(++value) && (value < MAXAPIDS)) | ||||
|     apids = cString::sprintf("%s, %d", *apids, channel->Apid(value)); | ||||
|   return apids; | ||||
| } | ||||
|  | ||||
| cString getDpids(const cChannel *channel) | ||||
| { | ||||
|   int value = 0; | ||||
|   cString dpids = cString::sprintf("%d", channel->Dpid(value)); | ||||
|   while (channel->Dpid(++value) && (value < MAXDPIDS)) | ||||
|     dpids = cString::sprintf("%s, %d", *dpids, channel->Dpid(value)); | ||||
|   return dpids; | ||||
| } | ||||
|  | ||||
| cString getCAids(const cChannel *channel, bool identify) | ||||
| { | ||||
|   cString caids; | ||||
|   int value = 0; | ||||
|  | ||||
|   if (identify) { | ||||
|      caids = cString::sprintf("%s", *getCA(channel->Ca(value))); | ||||
|      while (channel->Ca(++value) && (value < MAXCAIDS)) | ||||
|        caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value))); | ||||
|      } | ||||
|   else { | ||||
|      caids = cString::sprintf("%04x", channel->Ca(value)); | ||||
|      while (channel->Ca(++value) && (value < MAXCAIDS)) | ||||
|        caids = cString::sprintf("%s, %04x", *caids, channel->Ca(value)); | ||||
|      } | ||||
|   return caids; | ||||
| } | ||||
|  | ||||
| cString getCA(int value) | ||||
| { | ||||
|   /* http://www.dvb.org/index.php?id=174 */ | ||||
|   switch (value) { | ||||
|     case 0x0000:            return cString::sprintf("%s", tr("Free to Air")); /* Reserved */ | ||||
|     case 0x0001 ... 0x009F: | ||||
|     case 0x00A2 ... 0x00FF: return cString::sprintf("%s", tr("Fixed")); /* Standardized systems */ | ||||
|     case 0x00A0 ... 0x00A1: return cString::sprintf("%s", tr("Analog")); /* Analog signals */ | ||||
|     case 0x0100 ... 0x01FF: return cString::sprintf("%s", tr("SECA/Mediaguard")); /* Canal Plus */ | ||||
|     case 0x0500 ... 0x05FF: return cString::sprintf("%s", tr("Viaccess")); /* France Telecom */ | ||||
|     case 0x0600 ... 0x06FF: return cString::sprintf("%s", tr("Irdeto")); /* Irdeto */ | ||||
|     case 0x0900 ... 0x09FF: return cString::sprintf("%s", tr("NDS/Videoguard")); /* News Datacom */ | ||||
|     case 0x0B00 ... 0x0BFF: return cString::sprintf("%s", tr("Conax")); /* Norwegian Telekom */ | ||||
|     case 0x0D00 ... 0x0DFF: return cString::sprintf("%s", tr("CryptoWorks")); /* Philips */ | ||||
|     case 0x0E00 ... 0x0EFF: return cString::sprintf("%s", tr("PowerVu")); /* Scientific Atlanta */ | ||||
|     case 0x1200 ... 0x12FF: return cString::sprintf("%s", tr("NagraVision")); /* BellVu Express */ | ||||
|     case 0x1700 ... 0x17FF: return cString::sprintf("%s", tr("BetaCrypt")); /* BetaTechnik */ | ||||
|     case 0x1800 ... 0x18FF: return cString::sprintf("%s", tr("NagraVision")); /* Kudelski SA */ | ||||
|     case 0x4A60 ... 0x4A6F: return cString::sprintf("%s", tr("SkyCrypt")); /* @Sky */ | ||||
|     } | ||||
|   return cString::sprintf("%X", value); | ||||
| } | ||||
|  | ||||
| cString getCoderate(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case FEC_NONE: return cString::sprintf("%s", tr("None")); | ||||
|     case FEC_1_2:  return cString::sprintf("1/2"); | ||||
|     case FEC_2_3:  return cString::sprintf("2/3"); | ||||
|     case FEC_3_4:  return cString::sprintf("3/4"); | ||||
|     case FEC_4_5:  return cString::sprintf("4/5"); | ||||
|     case FEC_5_6:  return cString::sprintf("5/6"); | ||||
|     case FEC_6_7:  return cString::sprintf("6/7"); | ||||
|     case FEC_7_8:  return cString::sprintf("7/8"); | ||||
|     case FEC_8_9:  return cString::sprintf("8/9"); | ||||
|     case FEC_AUTO: return cString::sprintf("%s", tr("Auto")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getTransmission(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case TRANSMISSION_MODE_2K:   return cString::sprintf("2K"); | ||||
|     case TRANSMISSION_MODE_8K:   return cString::sprintf("8K"); | ||||
|     case TRANSMISSION_MODE_AUTO: return cString::sprintf("%s", tr("Auto")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|   | ||||
| cString getBandwidth(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case BANDWIDTH_8_MHZ: return cString::sprintf("8 %s", tr("MHz")); | ||||
|     case BANDWIDTH_7_MHZ: return cString::sprintf("7 %s", tr("MHz")); | ||||
|     case BANDWIDTH_6_MHZ: return cString::sprintf("6 %s", tr("MHz")); | ||||
|     case BANDWIDTH_AUTO:  return cString::sprintf("%s", tr("Auto")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getInversion(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case INVERSION_OFF:  return cString::sprintf("%s", tr("Off")); | ||||
|     case INVERSION_ON:   return cString::sprintf("%s", tr("On")); | ||||
|     case INVERSION_AUTO: return cString::sprintf("%s", tr("Auto")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getHierarchy(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case HIERARCHY_NONE: return cString::sprintf("%s", tr("None")); | ||||
|     case HIERARCHY_1:    return cString::sprintf("1"); | ||||
|     case HIERARCHY_2:    return cString::sprintf("2"); | ||||
|     case HIERARCHY_4:    return cString::sprintf("4"); | ||||
|     case HIERARCHY_AUTO: cString::sprintf("%s", tr("Auto")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getGuard(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case GUARD_INTERVAL_1_32: return cString::sprintf("1/32"); | ||||
|     case GUARD_INTERVAL_1_16: return cString::sprintf("1/16"); | ||||
|     case GUARD_INTERVAL_1_8:  return cString::sprintf("1/8"); | ||||
|     case GUARD_INTERVAL_1_4:  return cString::sprintf("1/4"); | ||||
|     case GUARD_INTERVAL_AUTO: cString::sprintf("%s", tr("Auto")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getModulation(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case QPSK:     return cString::sprintf("QPSK"); | ||||
|     case QAM_16:   return cString::sprintf("QAM 16"); | ||||
|     case QAM_32:   return cString::sprintf("QAM 32"); | ||||
|     case QAM_64:   return cString::sprintf("QAM 64"); | ||||
|     case QAM_128:  return cString::sprintf("QAM 128"); | ||||
|     case QAM_256:  return cString::sprintf("QAM 256"); | ||||
|     case QAM_AUTO: return cString::sprintf("QAM %s", tr("Auto")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getAspectRatio(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case AR_RESERVED: return cString::sprintf("%s", tr("reserved")); | ||||
|     case AR_1_1:      return cString::sprintf("1:1"); | ||||
|     case AR_4_3:      return cString::sprintf("4:3"); | ||||
|     case AR_16_9:     return cString::sprintf("16:9"); | ||||
|     case AR_2_21_1:   return cString::sprintf("2.21:1"); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getVideoFormat(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case VF_UNKNOWN: return cString::sprintf("%s", tr("unknown")); | ||||
|     case VF_PAL:     return cString::sprintf("%s", tr("PAL")); | ||||
|     case VF_NTSC:    return cString::sprintf("%s", tr("NTSC")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getAC3BitStreamMode(int value, int coding) | ||||
| { | ||||
|   switch (value) { | ||||
|     case 0: return cString::sprintf("%s", tr("Complete Main (CM)")); | ||||
|     case 1: return cString::sprintf("%s", tr("Music and Effects (ME)")); | ||||
|     case 2: return cString::sprintf("%s", tr("Visually Impaired (VI)")); | ||||
|     case 3: return cString::sprintf("%s", tr("Hearing Impaired (HI)")); | ||||
|     case 4: return cString::sprintf("%s", tr("Dialogue (D)")); | ||||
|     case 5: return cString::sprintf("%s", tr("Commentary (C)")); | ||||
|     case 6: return cString::sprintf("%s", tr("Emergency (E)")); | ||||
|     case 7: return cString::sprintf("%s", (coding == 1) ? tr("Voice Over (VO)") : tr("Karaoke")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getAC3AudioCodingMode(int value, int stream) | ||||
| { | ||||
|   if (stream != 7) { | ||||
|      switch (value) { | ||||
|        case 0: return cString::sprintf("1+1 - %s, %s", tr("Ch1"), tr("Ch2")); | ||||
|        case 1: return cString::sprintf("1/0 - %s", tr("C")); | ||||
|        case 2: return cString::sprintf("2/0 - %s, %s", tr("L"), tr("R")); | ||||
|        case 3: return cString::sprintf("3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R")); | ||||
|        case 4: return cString::sprintf("2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S")); | ||||
|        case 5: return cString::sprintf("3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S")); | ||||
|        case 6: return cString::sprintf("2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR")); | ||||
|        case 7: return cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR")); | ||||
|        } | ||||
|      } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getAC3CenterMixLevel(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case CML_MINUS_3dB:   return cString::sprintf("-3.0 %s", tr("dB")); | ||||
|     case CML_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB")); | ||||
|     case CML_MINUS_6dB:   return cString::sprintf("-6.0 %s", tr("dB")); | ||||
|     case CML_RESERVED:    return cString::sprintf("%s", tr("reserved")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getAC3SurroundMixLevel(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case SML_MINUS_3dB: return cString::sprintf("-3 %s", tr("dB")); | ||||
|     case SML_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB")); | ||||
|     case SML_0_dB:      return cString::sprintf("0 %s", tr("dB")); | ||||
|     case SML_RESERVED:  return cString::sprintf("%s", tr("reserved")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getAC3DolbySurroundMode(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case DSM_NOT_INDICATED:     return cString::sprintf("%s", tr("not indicated")); | ||||
|     case DSM_NOT_DOLBYSURROUND: return cString::sprintf("%s", tr("no")); | ||||
|     case DSM_DOLBYSURROUND:     return cString::sprintf("%s", tr("yes")); | ||||
|     case DSM_RESERVED:          return cString::sprintf("%s", tr("reserved")); | ||||
|     } | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getAC3DialogLevel(int value) | ||||
| { | ||||
|   if (value > 0) | ||||
|      return cString::sprintf("-%d %s", value, tr("dB")); | ||||
|   return cString::sprintf("---"); | ||||
| } | ||||
|  | ||||
| cString getFrequencyMHz(int value) | ||||
| { | ||||
|    while (value > 20000) value /= 1000; | ||||
|    return cString::sprintf("%d %s", value, tr("MHz")); | ||||
| } | ||||
|  | ||||
| cString getAudioSamplingFreq(int value) | ||||
| { | ||||
|   switch (value) { | ||||
|     case FR_NOTVALID: return cString::sprintf("---"); | ||||
|     case FR_RESERVED: return cString::sprintf("%s", tr("reserved")); | ||||
|     } | ||||
|   return cString::sprintf("%.1f %s", ((double)value / 1000.0), tr("kHz")); | ||||
| } | ||||
|  | ||||
| cString getAudioBitrate(double value, double stream) | ||||
| { | ||||
|   switch ((int)stream) { | ||||
|     case FR_NOTVALID: return cString::sprintf("---"); | ||||
|     case FR_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(value)); | ||||
|     case FR_FREE:     return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(value)); | ||||
|     } | ||||
|   return cString::sprintf("%s (%s)", *getBitrateKbits(stream), *getBitrateKbits(value)); | ||||
| } | ||||
|  | ||||
| cString getBitrateMbits(double value) | ||||
| { | ||||
|   if (value >= 0) | ||||
|      return cString::sprintf("%.2f %s", value / 1000000.0, tr("Mbit/s")); | ||||
|   return cString::sprintf("--- %s", tr("Mbit/s")); | ||||
| } | ||||
|  | ||||
| cString getBitrateKbits(double value) | ||||
| { | ||||
|   if (value >= 0)  | ||||
|      return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s")); | ||||
|   return cString::sprintf("--- %s", tr("kbit/s")); | ||||
| } | ||||
							
								
								
									
										59
									
								
								femontools.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								femontools.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /* | ||||
|  * Frontend Status Monitor plugin for the Video Disk Recorder | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  * | ||||
|  * $Id$ | ||||
|  */ | ||||
|  | ||||
| #ifndef __FEMONTOOLS_H | ||||
| #define __FEMONTOOLS_H | ||||
|  | ||||
| #include <stdint.h> | ||||
| #include <vdr/channels.h> | ||||
| #include <vdr/tools.h> | ||||
|  | ||||
| #ifdef DEBUG | ||||
| #define Dprintf(x...) printf(x); | ||||
| #else | ||||
| #define Dprintf(x...) ; | ||||
| #endif | ||||
|  | ||||
| #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" | ||||
|  | ||||
| cString getFrontendInfo(int cardIndex = 0); | ||||
| cString getFrontendName(int cardIndex = 0); | ||||
| cString getFrontendStatus(int cardIndex = 0); | ||||
|  | ||||
| uint16_t getSNR(int cardIndex = 0); | ||||
| uint16_t getSignal(int cardIndex = 0); | ||||
|  | ||||
| uint32_t getBER(int cardIndex = 0); | ||||
| uint32_t getUNC(int cardIndex = 0); | ||||
|  | ||||
| cString getApids(const cChannel *channel); | ||||
| cString getDpids(const cChannel *channel); | ||||
| cString getCAids(const cChannel *channel, bool identify = false); | ||||
| cString getCA(int value); | ||||
| cString getCoderate(int value); | ||||
| cString getTransmission(int value); | ||||
| cString getBandwidth(int value); | ||||
| cString getInversion(int value); | ||||
| cString getHierarchy(int value); | ||||
| cString getGuard(int value); | ||||
| cString getModulation(int value); | ||||
| cString getAspectRatio(int value); | ||||
| cString getVideoFormat(int value); | ||||
| cString getAC3BitStreamMode(int value, int coding); | ||||
| cString getAC3AudioCodingMode(int value, int stream); | ||||
| cString getAC3CenterMixLevel(int value); | ||||
| cString getAC3SurroundMixLevel(int value); | ||||
| cString getAC3DolbySurroundMode(int value); | ||||
| cString getAC3DialogLevel(int value); | ||||
| cString getFrequencyMHz(int value); | ||||
| cString getAudioSamplingFreq(int value); | ||||
| cString getAudioBitrate(double value, double stream); | ||||
| cString getBitrateMbits(double value); | ||||
| cString getBitrateKbits(double value); | ||||
|  | ||||
| #endif // __FEMONTOOLS_H | ||||
							
								
								
									
										39
									
								
								svdrpservice.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								svdrpservice.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /* | ||||
|  * svdrpservice.h: Public interface of the plugin's services | ||||
|  * | ||||
|  * See the README file for copyright information and how to reach the author. | ||||
|  */ | ||||
|  | ||||
| #ifndef _SVDRPSERVICE__H | ||||
| #define _SVDRPSERVICE__H | ||||
|  | ||||
| #include <vdr/tools.h> | ||||
|  | ||||
| class cLine: public cListObject { | ||||
| private: | ||||
|   char *Line; | ||||
| public: | ||||
|   const char *Text()   { return Line; } | ||||
|   cLine(const char *s) { Line = s ? strdup(s) : NULL; }; | ||||
|   virtual ~cLine()     { if (Line) free(Line); }; | ||||
| }; | ||||
|  | ||||
| struct SvdrpConnection_v1_0 { | ||||
|   // in | ||||
|   cString        serverIp; | ||||
|   unsigned short serverPort; | ||||
|   bool           shared; | ||||
|   // in+out | ||||
|   int            handle; | ||||
| }; | ||||
|  | ||||
| struct SvdrpCommand_v1_0 { | ||||
|   // in | ||||
|   cString        command; | ||||
|   int            handle; | ||||
|   // out | ||||
|   cList<cLine>   reply; | ||||
|   unsigned short responseCode; | ||||
| }; | ||||
|  | ||||
| #endif //_SVDRPSERVICE__H | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * ar11_xpm[] = { | ||||
| static const char *const ar11_xpm[] = { | ||||
| "26 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * ar169_xpm[] = { | ||||
| static const char *const ar169_xpm[] = { | ||||
| "38 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * ar2211_xpm[] = { | ||||
| static const char *const ar2211_xpm[] = { | ||||
| "52 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * ar43_xpm[] = { | ||||
| static const char *const ar43_xpm[] = { | ||||
| "31 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * carrier_xpm[] = { | ||||
| static const char *const carrier_xpm[] = { | ||||
| "96 19 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * device_xpm[] = { | ||||
| static const char *const device_xpm[] = { | ||||
| "14 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * dolbydigital_xpm[] = { | ||||
| static const char *const dolbydigital_xpm[] = { | ||||
| "31 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * dolbydigital20_xpm[] = { | ||||
| static const char *const dolbydigital20_xpm[] = { | ||||
| "55 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * dolbydigital51_xpm[] = { | ||||
| static const char *const dolbydigital51_xpm[] = { | ||||
| "51 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * five_xpm[] = { | ||||
| static const char *const five_xpm[] = { | ||||
| "15 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * four_xpm[] = { | ||||
| static const char *const four_xpm[] = { | ||||
| "15 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * lock_xpm[] = { | ||||
| static const char *const lock_xpm[] = { | ||||
| "96 19 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * monoleft_xpm[] = { | ||||
| static const char *const monoleft_xpm[] = { | ||||
| "17 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * monoright_xpm[] = { | ||||
| static const char *const monoright_xpm[] = { | ||||
| "17 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * ntsc_xpm[] = { | ||||
| static const char *const ntsc_xpm[] = { | ||||
| "19 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * one_xpm[] = { | ||||
| static const char *const one_xpm[] = { | ||||
| "15 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * pal_xpm[] = { | ||||
| static const char *const pal_xpm[] = { | ||||
| "18 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * signal_xpm[] = { | ||||
| static const char *const signal_xpm[] = { | ||||
| "96 19 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * stereo_xpm[] = { | ||||
| static const char *const stereo_xpm[] = { | ||||
| "17 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
							
								
								
									
										23
									
								
								symbols/svdrp.xpm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								symbols/svdrp.xpm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| /* XPM */ | ||||
| static const char *const svdrp_xpm[] = { | ||||
| "60 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
| "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", | ||||
| "+..........................................................+", | ||||
| "+.....+++++....++....++...++++++.....++++++.....++++++.....+", | ||||
| "+....+++++++...++....++...+++++++....+++++++....+++++++....+", | ||||
| "+...+++...++...++....++...++...+++...++...+++...++...+++...+", | ||||
| "+...++....++...++....++...++....++...++....++...++....++...+", | ||||
| "+...++.........++....++...++....++...++....++...++....++...+", | ||||
| "+...+++.........++..++....++....++...++...+++...++...+++...+", | ||||
| "+....+++++......++..++....++....++...+++++++....+++++++....+", | ||||
| "+.....+++++.....++..++....++....++...++++++.....++++++.....+", | ||||
| "+........+++....++..++....++....++...++...++....++.........+", | ||||
| "+.........++.....++++.....++....++...++...++....++.........+", | ||||
| "+...++....++.....++++.....++....++...++...++....++.........+", | ||||
| "+...++...+++......++......++...+++...++....++...++.........+", | ||||
| "+...+++++++.......++......+++++++....++....++...++.........+", | ||||
| "+....+++++........++......++++++.....++....++...++.........+", | ||||
| "+..........................................................+", | ||||
| "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"}; | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * sync_xpm[] = { | ||||
| static const char *const sync_xpm[] = { | ||||
| "96 19 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * three_xpm[] = { | ||||
| static const char *const three_xpm[] = { | ||||
| "15 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * two_xpm[] = { | ||||
| static const char *const two_xpm[] = { | ||||
| "15 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * viterbi_xpm[] = { | ||||
| static const char *const viterbi_xpm[] = { | ||||
| "96 19 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /* XPM */ | ||||
| static char * zero_xpm[] = { | ||||
| static const char *const zero_xpm[] = { | ||||
| "15 18 2 1", | ||||
| ".	c #FFFFFF", | ||||
| "+	c #000000", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user