mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 11:36:53 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5819441c03 | ||
|
|
b0b0fe4f02 | ||
|
|
64e56af6dc | ||
|
|
830aa73e1a | ||
|
|
78048d8ea0 | ||
|
|
42c6b69490 |
18
COPYING
18
COPYING
@@ -2,7 +2,7 @@
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
@@ -225,7 +225,7 @@ impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
@@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
@@ -336,5 +336,5 @@ necessary. Here is a sample; alter the names:
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
||||
47
HISTORY
47
HISTORY
@@ -233,3 +233,50 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- 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).
|
||||
|
||||
2007-10-14: Version 1.1.4
|
||||
|
||||
- Backported from 1.2.2.
|
||||
|
||||
2008-01-20: Version 1.1.5
|
||||
|
||||
- Updated Italian translation (Thanks to Gringo).
|
||||
- Added '-Wno-parentheses' to the compiler options.
|
||||
|
||||
2007-08-14: Version 1.2.0
|
||||
|
||||
- Updated for vdr-1.5.7.
|
||||
|
||||
2007-08-19: Version 1.2.1
|
||||
|
||||
- Updated for vdr-1.5.8.
|
||||
|
||||
2007-10-14: Version 1.2.2
|
||||
|
||||
- Added Spids support.
|
||||
- Minor OSD layout changes.
|
||||
|
||||
2008-01-20: Version 1.2.3
|
||||
|
||||
- Updated Italian translation (Thanks to Gringo).
|
||||
- Added '-Wno-parentheses' to the compiler options.
|
||||
- Mapped 'kInfo' as help key in setup menu.
|
||||
|
||||
18
Makefile
18
Makefile
@@ -15,17 +15,19 @@ 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.
|
||||
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||
# file. So it must be defined, even if it is not used here!
|
||||
#
|
||||
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).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
@@ -67,14 +69,18 @@ all-redirect: all
|
||||
|
||||
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o femontools.o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
# Dependencies:
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@@ -83,14 +89,12 @@ $(DEPFILE): Makefile
|
||||
|
||||
### Targets:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
ifndef FEMON_DEBUG
|
||||
@$(STRIP) $@
|
||||
endif
|
||||
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
||||
36
README
36
README
@@ -1,11 +1,16 @@
|
||||
This is a DVB Frontend Status Monitor plugin for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: R o l f . A h r e n b e r g @ s c i . f i
|
||||
Written by: Rolf Ahrenberg
|
||||
< R o l f . A h r e n b e r g @ s c i . f i >
|
||||
|
||||
Project's homepage: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
|
||||
|
||||
Latest version available at: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
See the file COPYING for license information.
|
||||
|
||||
Requirements:
|
||||
@@ -28,7 +33,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 +54,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:
|
||||
|
||||
@@ -75,6 +81,22 @@ 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, because I
|
||||
@@ -91,4 +113,10 @@ Notes:
|
||||
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."
|
||||
|
||||
83
femon.c
83
femon.c
@@ -6,6 +6,7 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <vdr/menu.h>
|
||||
#include <vdr/remote.h>
|
||||
#include "femoncfg.h"
|
||||
#include "femoni18n.h"
|
||||
@@ -13,12 +14,38 @@
|
||||
#include "femonosd.h"
|
||||
#include "femonservice.h"
|
||||
#include "femontools.h"
|
||||
#include "femon.h"
|
||||
|
||||
#if defined(APIVERSNUM) && APIVERSNUM < 10400
|
||||
#error "VDR-1.4.0 API version or greater is required!"
|
||||
#endif
|
||||
|
||||
static const char VERSION[] = "1.1.5";
|
||||
static const char DESCRIPTION[] = "DVB Signal Information Monitor (OSD)";
|
||||
static const char MAINMENUENTRY[] = "Signal Information";
|
||||
|
||||
class cPluginFemon : public cPlugin {
|
||||
public:
|
||||
cPluginFemon(void);
|
||||
virtual ~cPluginFemon();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return tr(DESCRIPTION); }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual bool Initialize(void);
|
||||
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);
|
||||
};
|
||||
|
||||
cPluginFemon::cPluginFemon()
|
||||
{
|
||||
// Initialize any member variables here.
|
||||
@@ -72,14 +99,17 @@ cOsdObject *cPluginFemon::MainMenuAction(void)
|
||||
{
|
||||
// Perform the action when selected from the main VDR menu.
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
return cFemonOsd::Instance(true);
|
||||
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);
|
||||
@@ -92,6 +122,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;
|
||||
@@ -130,6 +163,8 @@ const char **cPluginFemon::SVDRPHelpPages(void)
|
||||
" 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"
|
||||
@@ -141,7 +176,7 @@ const char **cPluginFemon::SVDRPHelpPages(void)
|
||||
"BERA\n"
|
||||
" Print the current bit error rate.",
|
||||
"UNCB\n"
|
||||
" Print the current uncorrcted blocks rate.",
|
||||
" Print the current uncorrected blocks rate.",
|
||||
"VIBR\n"
|
||||
" Print the actual device and current video bitrate [Mbit/s].",
|
||||
"AUBR\n"
|
||||
@@ -156,6 +191,10 @@ const char **cPluginFemon::SVDRPHelpPages(void)
|
||||
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");
|
||||
@@ -177,6 +216,9 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
|
||||
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());
|
||||
}
|
||||
@@ -199,25 +241,39 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
|
||||
}
|
||||
else if (strcasecmp(Command, "VIBR") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("%.2f Mbit/s on device #%d", cFemonOsd::Instance()->GetVideoBitrate(), cDevice::ActualDevice()->CardIndex());
|
||||
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("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetAudioBitrate(), cDevice::ActualDevice()->CardIndex());
|
||||
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("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetDolbyBitrate(), cDevice::ActualDevice()->CardIndex());
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
virtual void Store(void);
|
||||
public:
|
||||
cMenuFemonSetup(void);
|
||||
};
|
||||
|
||||
cMenuFemonSetup::cMenuFemonSetup(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
@@ -248,7 +304,6 @@ void cMenuFemonSetup::Setup(void)
|
||||
|
||||
Clear();
|
||||
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));
|
||||
@@ -262,6 +317,11 @@ void cMenuFemonSetup::Setup(void)
|
||||
Add(new cMenuEditBoolItem( tr("Analyze stream"), &data.analyzestream, tr("no"), tr("yes")));
|
||||
if (femonConfig.analyzestream)
|
||||
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();
|
||||
@@ -272,7 +332,6 @@ 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);
|
||||
@@ -285,15 +344,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 oldUsesvdrp = data.usesvdrp;
|
||||
int oldAnalyzestream = data.analyzestream;
|
||||
|
||||
eOSState state = cMenuSetupPage::ProcessKey(Key);
|
||||
|
||||
if (Key != kNone && (data.analyzestream != oldAnalyzestream)) {
|
||||
if (Key != kNone && (data.analyzestream != oldAnalyzestream || data.usesvdrp != oldUsesvdrp)) {
|
||||
Setup();
|
||||
}
|
||||
|
||||
|
||||
56
femon.h
56
femon.h
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_H
|
||||
#define __FEMON_H
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char VERSION[] = "1.0.1";
|
||||
static const char DESCRIPTION[] = "DVB Signal Information Monitor (OSD)";
|
||||
static const char MAINMENUENTRY[] = "Signal Information";
|
||||
|
||||
class cPluginFemon : public cPlugin {
|
||||
public:
|
||||
cPluginFemon(void);
|
||||
virtual ~cPluginFemon();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return tr(DESCRIPTION); }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual bool Initialize(void);
|
||||
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 *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
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "femoncfg.h"
|
||||
|
||||
cFemonConfig femonConfig;
|
||||
@@ -22,7 +23,6 @@ cFemonConfig::cFemonConfig(void)
|
||||
updateinterval = 5;
|
||||
analyzestream = 1;
|
||||
calcinterval = 20;
|
||||
syslogoutput = 0;
|
||||
showcasystem = 0;
|
||||
#ifdef NTSC
|
||||
osdheight = 420;
|
||||
@@ -30,6 +30,9 @@ cFemonConfig::cFemonConfig(void)
|
||||
osdheight = 480;
|
||||
#endif
|
||||
osdoffset = 0;
|
||||
usesvdrp = 0;
|
||||
svdrpport = 2001;
|
||||
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
|
||||
}
|
||||
|
||||
const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#ifndef __FEMONCFG_H
|
||||
#define __FEMONCFG_H
|
||||
|
||||
#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx
|
||||
|
||||
enum eFemonModes
|
||||
{
|
||||
eFemonModeBasic,
|
||||
@@ -32,10 +34,12 @@ 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;
|
||||
|
||||
@@ -1,340 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
@@ -1,6 +0,0 @@
|
||||
VDR Plugin 'femonclient' Revision History
|
||||
-----------------------------------------
|
||||
|
||||
2005-08-28: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
||||
@@ -1,81 +0,0 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.1 2005/08/21 10:43:12 kls Exp $
|
||||
|
||||
# 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.
|
||||
#
|
||||
PLUGIN = femonclient
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
VDRDIR = ../../../..
|
||||
LIBDIR = ../../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include -I$(VDRDIR)/PLUGINS/src/femon/
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Targets:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
libvdr-$(PLUGIN).so: $(PLUGIN).o
|
||||
$(CXX) $(CXXFLAGS) -shared $(PLUGIN).o -o $@
|
||||
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||
@@ -1,14 +0,0 @@
|
||||
This is a "plugin" for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: R o l f . A h r e n b e r g @ s c i . f i
|
||||
|
||||
Project's homepage: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
|
||||
|
||||
Latest version available at: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
|
||||
|
||||
See the file COPYING for license information.
|
||||
|
||||
Description:
|
||||
|
||||
Demo client for the service interface of the Femon plugin.
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* femonclient.c: Demo femon service client plugin
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include "femonservice.h"
|
||||
|
||||
static const char VERSION[] = "0.0.1";
|
||||
static const char DESCRIPTION[] = "Femon client";
|
||||
static const char MAINMENUENTRY[] = "Show frontend statistic on console";
|
||||
|
||||
class cPluginFemonClient : public cPlugin {
|
||||
public:
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return DESCRIPTION; }
|
||||
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
||||
virtual cOsdObject *MainMenuAction(void);
|
||||
};
|
||||
|
||||
// --- cPluginFemonClient ----------------------------------------------------------
|
||||
|
||||
cOsdObject *cPluginFemonClient::MainMenuAction(void)
|
||||
{
|
||||
FemonService_v1_0 femon;
|
||||
cPlugin *p;
|
||||
|
||||
p = cPluginManager::CallFirstService("FemonService-v1.0", &femon);
|
||||
if (p) {
|
||||
printf("Device : %s\n", *femon.fe_name);
|
||||
printf("Status : %s\n", *femon.fe_status);
|
||||
printf("Signal : %04X (%2d%%)\n", femon.fe_signal, femon.fe_signal / 655);
|
||||
printf("SNR : %04X (%2d%%)\n", femon.fe_snr, femon.fe_snr / 655);
|
||||
printf("BER : %08X\n", femon.fe_ber);
|
||||
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");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VDRPLUGINCREATOR(cPluginFemonClient); // Don't touch this!
|
||||
BIN
femonclient/vdr-femonclient-0.0.2.tgz
Normal file
BIN
femonclient/vdr-femonclient-0.0.2.tgz
Normal file
Binary file not shown.
256
femoni18n.c
256
femoni18n.c
@@ -12,7 +12,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "DVB Signal Information Monitor (OSD)", // English
|
||||
"DVB Signal Informationsanzeige (OSD)", // Deutsch
|
||||
"", // Slovenski
|
||||
"Visualizza le informazioni sul segnale DVB", // Italiano
|
||||
"Visualizza informazioni segnale DVB", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Affiche les informations du signal DVB", // Fran<61>ais
|
||||
@@ -34,7 +34,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Signal Information", // English
|
||||
"Signalinformationen", // Deutsch
|
||||
"", // Slovenski
|
||||
"Informazioni sul segnale", // Italiano
|
||||
"Informazioni segnale", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Signal DVB", // Fran<61>ais
|
||||
@@ -100,7 +100,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Horizontal offset", // English
|
||||
"Horizontaler Offset", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Limite orizzontale", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"D<EFBFBD>placement horizontal", // Fran<61>ais
|
||||
@@ -122,7 +122,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Default display mode", // English
|
||||
"Standard Anzeigemodus", // Deutsch
|
||||
"", // Slovenski
|
||||
"Modo di visualizzazione standard", // Italiano
|
||||
"Modalit<EFBFBD> visualizz. standard", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Affichage par d<>faut", // Fran<61>ais
|
||||
@@ -144,7 +144,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "basic", // English
|
||||
"Standard", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"base", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"basique", // Fran<61>ais
|
||||
@@ -166,7 +166,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "transponder", // English
|
||||
"Transponder", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"transponder", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"transpondeur", // Fran<61>ais
|
||||
@@ -188,7 +188,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "stream", // English
|
||||
"Stream", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"flusso", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"flux", // Fran<61>ais
|
||||
@@ -210,7 +210,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Skin", // English
|
||||
"Oberfl<EFBFBD>che", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Interfaccia", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Skin", // Fran<61>ais
|
||||
@@ -232,7 +232,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Theme", // English
|
||||
"Thema", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Tema", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Th<EFBFBD>me", // Fran<61>ais
|
||||
@@ -254,7 +254,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Classic", // English
|
||||
"Klassischer", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Classico", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Classique", // Fran<61>ais
|
||||
@@ -430,7 +430,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Hide main menu entry", // English
|
||||
"Hauptmen<EFBFBD>eintrag verstecken", // Deutsch
|
||||
"", // Slovenski
|
||||
"Nascondi voce men<EFBFBD>", // Italiano
|
||||
"Nascondi voce menu principale", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Masquer dans le menu principal", // Fran<61>ais
|
||||
@@ -452,7 +452,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "OSD update interval [0.1s]", // English
|
||||
"OSD Updateintervall [0.1s]", // Deutsch
|
||||
"", // Slovenski
|
||||
"Intervallo di aggiornamento [0.1s]", // Italiano
|
||||
"Intervallo aggiornamento OSD [0.1s]", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Intervalle de mise <20> jour (0,1s)", // Fran<61>ais
|
||||
@@ -474,7 +474,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Analyze stream", // English
|
||||
"Stream analysieren", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Analizza flusso", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Analyser le flux", // Fran<61>ais
|
||||
@@ -496,7 +496,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Calculation interval [0.1s]", // English
|
||||
"Berechnungsintervall [0.1s]", // Deutsch
|
||||
"", // Slovenski
|
||||
"Intervallo di calcolo [0.1s]", // Italiano
|
||||
"Intervallo calcolo [0.1s]", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Intervalle de calcul (0,1s)", // Fran<61>ais
|
||||
@@ -540,7 +540,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Green limit [%]", // English
|
||||
"Grenze Gr<47>n [%]", // Deutsch
|
||||
"", // Slovenski
|
||||
"Limite de verde [%]", // Italiano
|
||||
"Limite verde [%]", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Limite du vert (%)", // Fran<61>ais
|
||||
@@ -647,28 +647,6 @@ const tI18nPhrase Phrases[] = {
|
||||
"", // Dansk
|
||||
"", // <20>esky (Czech)
|
||||
},
|
||||
{ "Use syslog output", // English
|
||||
"Benutze syslog Ausgabe", // Deutsch
|
||||
"", // Slovenski
|
||||
"Registra su syslog", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Enregistrer les infos dans syslog", // Fran<61>ais
|
||||
"", // Norsk
|
||||
"Kirjaa systeemilokiin", // suomi
|
||||
"", // Polski
|
||||
"Usar syslog como registro", // Espa<70>ol
|
||||
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
|
||||
"", // Svenska
|
||||
"", // Romaneste
|
||||
"", // Magyar
|
||||
"", // Catal<61>
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> syslog", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
|
||||
"", // Hrvatski (Croatian)
|
||||
"Kirjuta s<>steemilogisse", // Eesti
|
||||
"", // Dansk
|
||||
"", // <20>esky (Czech)
|
||||
},
|
||||
{ "Audio", // English
|
||||
"Audio", // Deutsch
|
||||
"Audio", // Slovenski
|
||||
@@ -738,7 +716,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "None", // English
|
||||
"Nichts", // Deutsch
|
||||
"None", // Slovenski
|
||||
"None", // Italiano
|
||||
"Nessuno", // Italiano
|
||||
"None", // Nederlands
|
||||
"None", // Portugu<67>s
|
||||
"Aucun", // Fran<61>ais
|
||||
@@ -760,7 +738,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Off", // English
|
||||
"Aus", // Deutsch
|
||||
"Off", // Slovenski
|
||||
"Off", // Italiano
|
||||
"Disattivo", // Italiano
|
||||
"Off", // Nederlands
|
||||
"Off", // Portugu<67>s
|
||||
"Non", // Fran<61>ais
|
||||
@@ -782,7 +760,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "On", // English
|
||||
"Ein", // Deutsch
|
||||
"On", // Slovenski
|
||||
"On", // Italiano
|
||||
"Attivo", // Italiano
|
||||
"On", // Nederlands
|
||||
"On", // Portugu<67>s
|
||||
"Oui", // Fran<61>ais
|
||||
@@ -870,7 +848,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Stream Information", // English
|
||||
"Streaminformation", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Informazione flusso", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Information flux", // Fran<61>ais
|
||||
@@ -892,7 +870,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "MPEG Layer", // English
|
||||
"MPEG Layer", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Formato MPEG", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"MPEG Layer", // Fran<61>ais
|
||||
@@ -914,7 +892,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Video Stream", // English
|
||||
"Video Stream", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Flusso video", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Flux vid<69>o", // Fran<61>ais
|
||||
@@ -936,7 +914,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Bitrate", // English
|
||||
"Bitrate", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Bitrate", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Bitrate", // Fran<61>ais
|
||||
@@ -958,7 +936,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Frame Rate", // English
|
||||
"Bildrate", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Frame rate", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Rafra<EFBFBD>chissement", // Fran<61>ais
|
||||
@@ -1002,7 +980,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Aspect Ratio", // English
|
||||
"Seitenverh<EFBFBD>ltnis", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Dimensione immagine", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Proportions d'image", // Fran<61>ais
|
||||
@@ -1024,7 +1002,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "reserved", // English
|
||||
"belegt", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"riservato", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"r<EFBFBD>serv<EFBFBD>", // Fran<61>ais
|
||||
@@ -1046,7 +1024,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "free", // English
|
||||
"frei", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"libero", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"libre", // Fran<61>ais
|
||||
@@ -1068,7 +1046,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Video Format", // English
|
||||
"Bildformat", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Formato video", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Standard vid<69>o", // Fran<61>ais
|
||||
@@ -1134,7 +1112,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "unknown", // English
|
||||
"unbekannt", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"sconosciuto", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"inconnu", // Fran<61>ais
|
||||
@@ -1156,7 +1134,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Resolution", // English
|
||||
"Aufl<EFBFBD>sung", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Risoluzione", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"R<EFBFBD>solution", // Fran<61>ais
|
||||
@@ -1178,7 +1156,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Audio Stream", // English
|
||||
"Audio Stream", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Flusso audio", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Flux audio", // Fran<61>ais
|
||||
@@ -1200,7 +1178,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Sampling Frequency", // English
|
||||
"Abtastrate", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Frequenza campionamento", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Fr<EFBFBD>quence d'<27>chantillonage", // Fran<61>ais
|
||||
@@ -1398,7 +1376,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "not indicated", // English
|
||||
"nicht angegeben", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"non indicato", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"non indiqu<71>", // Fran<61>ais
|
||||
@@ -1442,7 +1420,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "AC-3 Stream", // English
|
||||
"AC-3 Stream", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Flusso AC-3", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Flux AC-3", // Fran<61>ais
|
||||
@@ -1464,7 +1442,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Frame Size", // English
|
||||
"Frame Gr<47><72>e", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Dimensione frame", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Taille de paquet", // Fran<61>ais
|
||||
@@ -1486,7 +1464,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Bit Stream Mode", // English
|
||||
"Bitstream Modus", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Modalit<EFBFBD> bitstream", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Mode bitstream", // Fran<61>ais
|
||||
@@ -1508,7 +1486,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Audio Coding Mode", // English
|
||||
"Audiokodierung", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Modalit<EFBFBD> codifica audio", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Mode de codage audio", // Fran<61>ais
|
||||
@@ -1530,7 +1508,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Center Mix Level", // English
|
||||
"Center Mix Pegel", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Livello sonoro centrale", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Niveau sonore milieu", // Fran<61>ais
|
||||
@@ -1552,7 +1530,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Surround Mix Level", // English
|
||||
"Surround Mix Pegel", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Livello sonoro surround", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Niveau sonore surround", // Fran<61>ais
|
||||
@@ -1574,7 +1552,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Dolby Surround Mode", // English
|
||||
"Dolby Surround Modus", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Modalit<EFBFBD> Dolby Surround", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Mode Dolby Surround", // Fran<61>ais
|
||||
@@ -1596,7 +1574,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Low Frequency Effects", // English
|
||||
"Tieft<EFBFBD>ner Effekte", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Effetti bassa frequenza", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Effets de basses", // Fran<61>ais
|
||||
@@ -1618,7 +1596,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Dialogue Normalization", // English
|
||||
"Dialog Normalisierung", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Normalizzazione dialoghi", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Normalisation des dialogues", // Fran<61>ais
|
||||
@@ -1640,7 +1618,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Complete Main (CM)", // English
|
||||
"Complete Main (CM)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Principale (CM)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Principal (CM)", // Fran<61>ais
|
||||
@@ -1662,7 +1640,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Music and Effects (ME)", // English
|
||||
"Musik und Effekte (ME)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Musica ed effetti (ME)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Musique et effets (ME)", // Fran<61>ais
|
||||
@@ -1684,7 +1662,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Visually Impaired (VI)", // English
|
||||
"Sehbehindert (VI)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Immagine alterata (VI)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Malvoyants (VI)", // Fran<61>ais
|
||||
@@ -1706,7 +1684,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Hearing Impaired (HI)", // English
|
||||
"H<EFBFBD>rbehindert (HI)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Suono deteriorato (HI)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Malentendants (HI)", // Fran<61>ais
|
||||
@@ -1728,7 +1706,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Dialogue (D)", // English
|
||||
"Dialog (D)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Dialogo (D)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Dialogue (D)", // Fran<61>ais
|
||||
@@ -1750,7 +1728,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Commentary (C)", // English
|
||||
"Kommentar (C)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Commenti (C)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Commentaires (C)", // Fran<61>ais
|
||||
@@ -1772,7 +1750,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Emergency (E)", // English
|
||||
"Notfall (E)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Emergenza (E)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Urgence (E)", // Fran<61>ais
|
||||
@@ -1794,7 +1772,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Voice Over (VO)", // English
|
||||
"<EFBFBD>berlagerte Stimme (VO)", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Voce off (VO)", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Voix off (VO)", // Fran<61>ais
|
||||
@@ -1816,7 +1794,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Karaoke", // English
|
||||
"Karaoke", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Karaoke", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Karaoke", // Fran<61>ais
|
||||
@@ -1838,7 +1816,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Ch1", // English "Channel 1"
|
||||
"Kan1", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Can. 1", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Can. 1", // Fran<61>ais
|
||||
@@ -1860,7 +1838,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Ch2", // English "Channel 2"
|
||||
"Kan2", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Can. 2", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Can. 2", // Fran<61>ais
|
||||
@@ -1882,7 +1860,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "C", // English "Center"
|
||||
"C", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"C", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Centre", // Fran<61>ais
|
||||
@@ -1904,7 +1882,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "L", // English "Left"
|
||||
"L", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"S", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Gauche", // Fran<61>ais
|
||||
@@ -1926,7 +1904,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "R", // English "Right"
|
||||
"R", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"D", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Droite", // Fran<61>ais
|
||||
@@ -1948,7 +1926,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "S", // English "Surround"
|
||||
"S", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"S", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Surround", // Fran<61>ais
|
||||
@@ -1970,7 +1948,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "SL", // English "Surround Left"
|
||||
"SL", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"SS", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Surround gauche", // Fran<61>ais
|
||||
@@ -1992,7 +1970,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "SR", // English "Surround Right"
|
||||
"SR", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"SD", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Surround droit", // Fran<61>ais
|
||||
@@ -2014,7 +1992,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Show CA system", // English
|
||||
"CA System anzeigen", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Mostra sistema CA", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Syst<EFBFBD>me CA", // Fran<61>ais
|
||||
@@ -2036,7 +2014,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Fixed", // English
|
||||
"Fest", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Fisso", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Fixe", // Fran<61>ais
|
||||
@@ -2058,7 +2036,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Analog", // English
|
||||
"Analog", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Analogico", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Analogique", // Fran<61>ais
|
||||
@@ -2080,7 +2058,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Free to Air", // English
|
||||
"Frei empfangbar", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"In chiaro", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Free To Air", // Fran<61>ais
|
||||
@@ -2102,7 +2080,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "SECA/Mediaguard", // English
|
||||
"SECA/Mediaguard", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"SECA/Mediaguard", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"SECA/Mediaguard", // Fran<61>ais
|
||||
@@ -2124,7 +2102,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Viaccess", // English
|
||||
"Viaccess", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Viaccess", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Viaccess", // Fran<61>ais
|
||||
@@ -2146,7 +2124,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Irdeto", // English
|
||||
"Irdeto", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Irdeto", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Irdeto", // Fran<61>ais
|
||||
@@ -2168,7 +2146,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "NDS/Videoguard", // English
|
||||
"NDS/Videoguard", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"NDS/Videoguard", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"NDS/Videoguard", // Fran<61>ais
|
||||
@@ -2190,7 +2168,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "Conax", // English
|
||||
"Conax", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"Conax", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"Conax", // Fran<61>ais
|
||||
@@ -2212,7 +2190,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "CryptoWorks", // English
|
||||
"CryptoWorks", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"CryptoWorks", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"CryptoWorks", // Fran<61>ais
|
||||
@@ -2234,7 +2212,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "PowerVu", // English
|
||||
"PowerVu", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"PowerVu", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"PowerVu", // Fran<61>ais
|
||||
@@ -2256,7 +2234,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "BetaCrypt", // English
|
||||
"BetaCrypt", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"BetaCrypt", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"BetaCrypt", // Fran<61>ais
|
||||
@@ -2278,7 +2256,7 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "NagraVision", // English
|
||||
"NagraVision", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"NagraVision", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"NagraVision", // Fran<61>ais
|
||||
@@ -2300,11 +2278,11 @@ const tI18nPhrase Phrases[] = {
|
||||
{ "SkyCrypt", // English
|
||||
"SkyCrypt", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"SkyCrypt", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"SkyCrypt", // Fran<61>ais
|
||||
"", // Norsk
|
||||
"", // Norsk
|
||||
"SkyCrypt", // suomi
|
||||
"", // Polski
|
||||
"SkyCrypt", // Espa<70>ol
|
||||
@@ -2319,6 +2297,94 @@ const tI18nPhrase Phrases[] = {
|
||||
"", // Dansk
|
||||
"", // <20>esky (Czech)
|
||||
},
|
||||
{ "Use SVDRP service", // English
|
||||
"SVDRP Service verwenden", // Deutsch
|
||||
"", // Slovenski
|
||||
"Utilizza servizio SVDRP", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"", // Fran<61>ais
|
||||
"", // Norsk
|
||||
"K<EFBFBD>yt<EFBFBD> SVDRP-palvelua", // 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)
|
||||
"", // Eesti
|
||||
"", // Dansk
|
||||
"", // <20>esky (Czech)
|
||||
},
|
||||
{ "SVDRP service IP", // English
|
||||
"SVDRP Service IP", // Deutsch
|
||||
"", // Slovenski
|
||||
"IP servizio SVDRP", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"", // Fran<61>ais
|
||||
"", // Norsk
|
||||
"SVDRP-palvelun IP-osoite", // 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)
|
||||
"", // Eesti
|
||||
"", // Dansk
|
||||
"", // <20>esky (Czech)
|
||||
},
|
||||
{ "SVDRP service port", // English
|
||||
"SVDRP Service Port", // Deutsch
|
||||
"", // Slovenski
|
||||
"Porta servizio SVDRP", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"", // Fran<61>ais
|
||||
"", // Norsk
|
||||
"SVDRP-palvelun portti", // 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)
|
||||
"", // Eesti
|
||||
"", // Dansk
|
||||
"", // <20>esky (Czech)
|
||||
},
|
||||
{ "Femon not available while replaying", // English
|
||||
"", // Deutsch
|
||||
"", // Slovenski
|
||||
"Femon non disponibile durante la riproduzione", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Portugu<67>s
|
||||
"", // Fran<61>ais
|
||||
"", // Norsk
|
||||
"Signaalimittari ei ole k<>ytett<74>viss<73> toiston aikana", // 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)
|
||||
"", // Eesti
|
||||
"", // Dansk
|
||||
"", // <20>esky (Czech)
|
||||
},
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
||||
845
femonosd.c
845
femonosd.c
File diff suppressed because it is too large
Load Diff
15
femonosd.h
15
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:
|
||||
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,11 +48,14 @@ 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();
|
||||
|
||||
@@ -17,8 +17,12 @@
|
||||
#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_VideoPid = Vpid;
|
||||
@@ -60,6 +64,7 @@ cFemonReceiver::~cFemonReceiver(void)
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
Detach();
|
||||
}
|
||||
|
||||
/* The following function originates from libdvbmpeg: */
|
||||
@@ -141,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] =
|
||||
@@ -179,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;
|
||||
@@ -222,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];
|
||||
@@ -355,11 +360,11 @@ void cFemonReceiver::Action(void)
|
||||
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,9 +47,11 @@ 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:
|
||||
@@ -94,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
|
||||
@@ -103,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
|
||||
|
||||
327
femontools.c
327
femontools.c
@@ -10,8 +10,47 @@
|
||||
#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;
|
||||
@@ -22,7 +61,7 @@ cString getFrontendName(int cardIndex)
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return NULL;
|
||||
ioctl(fe, FE_GET_INFO, &value);
|
||||
CHECK(ioctl(fe, FE_GET_INFO, &value));
|
||||
close(fe);
|
||||
|
||||
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
|
||||
@@ -108,3 +147,289 @@ uint32_t getUNC(int cardIndex)
|
||||
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 getSpids(const cChannel *channel)
|
||||
{
|
||||
int value = 0;
|
||||
cString spids = cString::sprintf("%d", channel->Spid(value));
|
||||
while (channel->Spid(++value) && (value < MAXSPIDS))
|
||||
spids = cString::sprintf("%s, %d", *spids, channel->Spid(value));
|
||||
return spids;
|
||||
}
|
||||
|
||||
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"));
|
||||
}
|
||||
|
||||
30
femontools.h
30
femontools.h
@@ -10,6 +10,7 @@
|
||||
#define __FEMONTOOLS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/tools.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -20,11 +21,40 @@
|
||||
|
||||
#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 getSpids(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
|
||||
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",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+..........................................................+",
|
||||
"+.....+++++....++....++...++++++.....++++++.....++++++.....+",
|
||||
"+....+++++++...++....++...+++++++....+++++++....+++++++....+",
|
||||
"+...+++...++...++....++...++...+++...++...+++...++...+++...+",
|
||||
"+...++....++...++....++...++....++...++....++...++....++...+",
|
||||
"+...++.........++....++...++....++...++....++...++....++...+",
|
||||
"+...+++.........++..++....++....++...++...+++...++...+++...+",
|
||||
"+....+++++......++..++....++....++...+++++++....+++++++....+",
|
||||
"+.....+++++.....++..++....++....++...++++++.....++++++.....+",
|
||||
"+........+++....++..++....++....++...++...++....++.........+",
|
||||
"+.........++.....++++.....++....++...++...++....++.........+",
|
||||
"+...++....++.....++++.....++....++...++...++....++.........+",
|
||||
"+...++...+++......++......++...+++...++....++...++.........+",
|
||||
"+...+++++++.......++......+++++++....++....++...++.........+",
|
||||
"+....+++++........++......++++++.....++....++...++.........+",
|
||||
"+..........................................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
Reference in New Issue
Block a user