1
0
mirror of https://github.com/rofafor/vdr-plugin-femon.git synced 2023-10-10 11:36:53 +00:00

Compare commits

..

8 Commits

Author SHA1 Message Date
Rolf Ahrenberg
6ce0ca32bd Fixed device switching priority (Thanks to Andreas Brugger).
Fixed device switching back to the primary device.
2006-06-06 04:20:00 +03:00
Rolf Ahrenberg
74a2a1bbe7 Updated for vdr-1.4.0.
Modified APIVERSION code in Makefile.
Updated german translation (Thanks to Andreas Brachold).
2006-04-30 04:20:00 +03:00
Rolf Ahrenberg
bf85e32d0d Added STRIP option for Makefile (Thanks to Ville Skyttä).
Modified APIVERSION code in Makefile.
2006-04-23 04:20:00 +03:00
Rolf Ahrenberg
caf42f7ace Updated for vdr-1.3.47. 2006-04-20 04:20:00 +03:00
Rolf Ahrenberg
c2b1e5a187 Updated for vdr-1.3.44.
Minor Makefile changes.
Made all symbol data 'const'.
Added spanish translation (Thanks to Luis Palacios).
2006-03-08 04:20:00 +02:00
Rolf Ahrenberg
e90fe6065c Updated for vdr-1.3.42.
Added "SilverGreen" theme (Thanks to Rififi77 @ VDRPortal).
2006-02-06 04:20:00 +02:00
Rolf Ahrenberg
7ee255830a Updated for vdr-1.3.40.
Fixed a translation bug (Thanks to Antti Hartikainen).
Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this one).
Fixed EgalsTry theme (Thanks to Uwe Hanke).
2006-01-25 04:20:00 +02:00
Rolf Ahrenberg
7da8cb2110 Updated for vdr-1.3.36.
Added french translation (Thanks to Nicolas Huillard).
Enabled bitrate commands via SVDRP.
Added new SVDRP commands.
Modified femon service without incrementing version number.
Added "Duotone" theme for 2bpp on screen displays.
Fixed crash bug in femonreceiver.
Fixed setup page bug (Thanks to Thomas Günther for reporting this one).
2005-11-13 04:20:00 +02:00
40 changed files with 717 additions and 329 deletions

50
HISTORY
View File

@@ -183,3 +183,53 @@ VDR Plugin 'femon' Revision History
- Added Enigma theme (Thanks to Rolf Hoverath). - Added Enigma theme (Thanks to Rolf Hoverath).
- Added EgalsTry theme (Thanks to Uwe Hanke). - Added EgalsTry theme (Thanks to Uwe Hanke).
- Added option to disable rounded corners. - Added option to disable rounded corners.
2005-11-13: Version 0.9.5
- Updated for vdr-1.3.36.
- Added french translation (Thanks to Nicolas Huillard).
- Enabled bitrate commands via SVDRP.
- Added new SVDRP commands.
- Modified femon service without incrementing version number.
- Added "Duotone" theme for 2bpp on screen displays.
- Fixed crash bug in femonreceiver.
- Fixed setup page bug (Thanks to Thomas G<>nther for reporting this one).
2006-01-25: Version 0.9.6
- Updated for vdr-1.3.40.
- Fixed a translation bug (Thanks to Antti Hartikainen).
- Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this one).
- Fixed EgalsTry theme (Thanks to Uwe Hanke).
2006-02-06: Version 0.9.7
- Updated for vdr-1.3.42.
- Added "SilverGreen" theme (Thanks to Rififi77 @ VDRPortal).
2006-03-08: Version 0.9.8
- Updated for vdr-1.3.44.
- Minor Makefile changes.
- Made all symbol data 'const'.
- Added spanish translation (Thanks to Luis Palacios).
2006-04-20: Version 0.9.9
- Updated for vdr-1.3.47.
2006-04-23: Version 0.9.10
- Added STRIP option for Makefile (Thanks to Ville Skytt<74>).
- Modified APIVERSION code in Makefile.
2006-04-30: Version 1.0.0
- Updated for vdr-1.4.0.
- Modified APIVERSION code in Makefile.
- Updated german translation (Thanks to Andreas Brachold).
2006-06-06: Version 1.0.1
- Fixed device switching priority (Thanks to Andreas Brugger).
- Fixed device switching back to the primary device.

View File

@@ -3,6 +3,15 @@
# #
# $Id$ # $Id$
# Debugging on/off
#FEMON_DEBUG = 1
# NTSC on/off
#FEMON_NTSC = 1
# Strip debug symbols? Set eg. to /bin/true if not
STRIP = strip
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the 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. # By default the main source file also carries this name.
@@ -11,20 +20,15 @@ PLUGIN = femon
### The version number of this plugin (taken from the main source file): ### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).h | awk '{ print $$6 }' | sed -e 's/[";]//g') VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).h | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The C++ compiler and options: ### The C++ compiler and options:
CXX ?= g++ CXX ?= g++
ifdef FEMON_DEBUG CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
CXXFLAGS ?= -g -Wall -Woverloaded-virtual -fPIC
else
CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual -fPIC
endif
### The directory environment: ### The directory environment:
DVBDIR = ../../../../DVB
VDRDIR = ../../.. VDRDIR = ../../..
LIBDIR = ../../lib LIBDIR = ../../lib
TMPDIR = /tmp TMPDIR = /tmp
@@ -33,9 +37,9 @@ TMPDIR = /tmp
-include $(VDRDIR)/Make.config -include $(VDRDIR)/Make.config
### The version number of VDR (taken from VDR's "config.h"): ### The version number of VDR's plugin API (taken from VDR's "config.h"):
VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g') APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
### The name of the distribution archive: ### The name of the distribution archive:
@@ -44,16 +48,16 @@ PACKAGE = vdr-$(ARCHIVE)
### Includes and Defines (add further entries here): ### Includes and Defines (add further entries here):
INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include INCLUDES += -I$(VDRDIR)/include
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
ifdef FEMON_NTSC ifdef FEMON_NTSC
DEFINES += -DFEMON_NTSC DEFINES += -DNTSC
endif endif
ifdef FEMON_DEBUG ifdef FEMON_DEBUG
DEFINES += -DFEMON_DEBUG DEFINES += -DDEBUG
endif endif
.PHONY: all all-redirect .PHONY: all all-redirect
@@ -83,10 +87,10 @@ all: libvdr-$(PLUGIN).so
libvdr-$(PLUGIN).so: $(OBJS) libvdr-$(PLUGIN).so: $(OBJS)
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@ $(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
@cp $@ $(LIBDIR)/$@.$(VDRVERSION)
ifndef FEMON_DEBUG ifndef FEMON_DEBUG
strip $(LIBDIR)/$@.$(VDRVERSION) @$(STRIP) $@
endif endif
@cp $@ $(LIBDIR)/$@.$(APIVERSION)
dist: clean dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE)

5
README
View File

@@ -77,9 +77,8 @@ make plugins
Notes: Notes:
- The plugin supports only those DVB cards with _one_ frontend (do any cards - The plugin supports only those DVB cards with _one_ frontend, because I
with multiple frontends even exist?), because I haven't yet figured howto do haven't yet figured howto do it without patching the VDR core.
it without patching the VDR core.
- Disable the stream analyze to speed up heavy zapping sessions. - Disable the stream analyze to speed up heavy zapping sessions.

119
femon.c
View File

@@ -6,6 +6,7 @@
* $Id$ * $Id$
*/ */
#include <vdr/remote.h>
#include "femoncfg.h" #include "femoncfg.h"
#include "femoni18n.h" #include "femoni18n.h"
#include "femonreceiver.h" #include "femonreceiver.h"
@@ -14,20 +15,22 @@
#include "femontools.h" #include "femontools.h"
#include "femon.h" #include "femon.h"
#if defined(VDRVERSNUM) && VDRVERSNUM < 10334 #if defined(APIVERSNUM) && APIVERSNUM < 10400
#error "You don't exist! Go away! Upgrade yourself!" #error "VDR-1.4.0 API version or greater is required!"
#endif #endif
cPluginFemon::cPluginFemon(void) cPluginFemon::cPluginFemon()
{ {
// Initialize any member variables here. // Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
Dprintf("%s()\n", __PRETTY_FUNCTION__);
} }
cPluginFemon::~cPluginFemon() cPluginFemon::~cPluginFemon()
{ {
// Clean up after yourself! // Clean up after yourself!
Dprintf("%s()\n", __PRETTY_FUNCTION__);
} }
const char *cPluginFemon::CommandLineHelp(void) const char *cPluginFemon::CommandLineHelp(void)
@@ -68,7 +71,8 @@ void cPluginFemon::Housekeeping(void)
cOsdObject *cPluginFemon::MainMenuAction(void) cOsdObject *cPluginFemon::MainMenuAction(void)
{ {
// Perform the action when selected from the main VDR menu. // Perform the action when selected from the main VDR menu.
return new cFemonOsd(); Dprintf("%s()\n", __PRETTY_FUNCTION__);
return cFemonOsd::Instance(true);
} }
bool cPluginFemon::SetupParse(const char *Name, const char *Value) bool cPluginFemon::SetupParse(const char *Name, const char *Value)
@@ -106,8 +110,9 @@ bool cPluginFemon::Service(const char *Id, void *Data)
data->fe_signal = getSignal(ndx); data->fe_signal = getSignal(ndx);
data->fe_ber = getBER(ndx); data->fe_ber = getBER(ndx);
data->fe_unc = getUNC(ndx); data->fe_unc = getUNC(ndx);
data->video_bitrate = getVideoBitrate(); data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0;
data->audio_bitrate = getAudioBitrate(); data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0;
data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0;
return true; return true;
} }
@@ -117,6 +122,14 @@ bool cPluginFemon::Service(const char *Id, void *Data)
const char **cPluginFemon::SVDRPHelpPages(void) const char **cPluginFemon::SVDRPHelpPages(void)
{ {
static const char *HelpPages[] = { static const char *HelpPages[] = {
"OPEN\n"
" Open femon plugin.",
"QUIT\n"
" Close femon plugin.",
"NEXT\n"
" Switch to next possible device.",
"PREV\n"
" Switch to previous possible device.",
"NAME\n" "NAME\n"
" Print the current frontend name.", " Print the current frontend name.",
"STAT\n" "STAT\n"
@@ -130,9 +143,11 @@ const char **cPluginFemon::SVDRPHelpPages(void)
"UNCB\n" "UNCB\n"
" Print the current uncorrcted blocks rate.", " Print the current uncorrcted blocks rate.",
"VIBR\n" "VIBR\n"
" Print the current video bitrate [Mbit/s].", " Print the actual device and current video bitrate [Mbit/s].",
"AUBR\n" "AUBR\n"
" Print the current audio bitrate [kbit/s].", " Print the actual device and current audio bitrate [kbit/s].",
"DDBR\n"
" Print the actual device and current dolby bitrate [kbit/s].",
NULL NULL
}; };
return HelpPages; return HelpPages;
@@ -140,35 +155,72 @@ const char **cPluginFemon::SVDRPHelpPages(void)
cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
{ {
if (strcasecmp(Command, "NAME") == 0) { if (strcasecmp(Command, "OPEN") == 0) {
if (!cFemonOsd::Instance())
cRemote::CallPlugin("femon");
return cString("Opening femon plugin");
}
else if (strcasecmp(Command, "QUIT") == 0) {
if (cFemonOsd::Instance())
cRemote::Put(kBack);
return cString("Closing femon plugin");
}
else if (strcasecmp(Command, "NEXT") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("Switching to next device: %s", cFemonOsd::Instance()->DeviceSwitch(1) ? "ok" : "failed");
else
return cString("Cannot switch device");
}
else if (strcasecmp(Command, "PREV") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("Switching to previous device: %s", cFemonOsd::Instance()->DeviceSwitch(-1) ? "ok" : "failed");
else
return cString("Cannot switch device");
}
else if (strcasecmp(Command, "NAME") == 0) {
return getFrontendName(cDevice::ActualDevice()->CardIndex()); return getFrontendName(cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "STAT") == 0) { else if (strcasecmp(Command, "STAT") == 0) {
return getFrontendStatus(cDevice::ActualDevice()->CardIndex()); return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "SGNL") == 0) { else if (strcasecmp(Command, "SGNL") == 0) {
return cString::sprintf("%04X", getSignal(cDevice::ActualDevice()->CardIndex())); int value = getSignal(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "SNRA") == 0) { else if (strcasecmp(Command, "SNRA") == 0) {
return cString::sprintf("%04X", getSNR(cDevice::ActualDevice()->CardIndex())); int value = getSNR(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "BERA") == 0) { else if (strcasecmp(Command, "BERA") == 0) {
return cString::sprintf("%08X", getBER(cDevice::ActualDevice()->CardIndex())); return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "UNCB") == 0) { else if (strcasecmp(Command, "UNCB") == 0) {
return cString::sprintf("%08X", getUNC(cDevice::ActualDevice()->CardIndex())); return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "VIBR") == 0) { else if (strcasecmp(Command, "VIBR") == 0) {
return cString::sprintf("%.2f", getVideoBitrate()); if (cFemonOsd::Instance())
return cString::sprintf("%.2f Mbit/s on device #%d", cFemonOsd::Instance()->GetVideoBitrate(), cDevice::ActualDevice()->CardIndex());
else
return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "AUBR") == 0) { else if (strcasecmp(Command, "AUBR") == 0) {
return cString::sprintf("%.0f", getAudioBitrate()); if (cFemonOsd::Instance())
return cString::sprintf("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetAudioBitrate(), cDevice::ActualDevice()->CardIndex());
else
return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "DDBR") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetDolbyBitrate(), cDevice::ActualDevice()->CardIndex());
else
return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
} }
return NULL; return NULL;
} }
cMenuFemonSetup::cMenuFemonSetup(void) cMenuFemonSetup::cMenuFemonSetup(void)
{ {
Dprintf("%s()\n", __PRETTY_FUNCTION__);
dispmodes[eFemonModeBasic] = tr("basic"); dispmodes[eFemonModeBasic] = tr("basic");
dispmodes[eFemonModeTransponder] = tr("transponder"); dispmodes[eFemonModeTransponder] = tr("transponder");
dispmodes[eFemonModeStream] = tr("stream"); dispmodes[eFemonModeStream] = tr("stream");
@@ -183,7 +235,10 @@ cMenuFemonSetup::cMenuFemonSetup(void)
themes[eFemonThemeMoronimo] = tr("Moronimo"); themes[eFemonThemeMoronimo] = tr("Moronimo");
themes[eFemonThemeEnigma] = tr("Enigma"); themes[eFemonThemeEnigma] = tr("Enigma");
themes[eFemonThemeEgalsTry] = tr("EgalsTry"); themes[eFemonThemeEgalsTry] = tr("EgalsTry");
themes[eFemonThemeDuotone] = tr("Duotone");
themes[eFemonThemeSilverGreen] = tr("SilverGreen");
data = femonConfig;
Setup(); Setup();
} }
@@ -192,21 +247,21 @@ void cMenuFemonSetup::Setup(void)
int current = Current(); int current = Current();
Clear(); Clear();
Add(new cMenuEditBoolItem( tr("Hide main menu entry"), &femonConfig.hidemenu, tr("no"), tr("yes"))); Add(new cMenuEditBoolItem( tr("Hide main menu entry"), &data.hidemenu, tr("no"), tr("yes")));
Add(new cMenuEditBoolItem( tr("Use syslog output"), &femonConfig.syslogoutput, tr("no"), tr("yes"))); Add(new cMenuEditBoolItem( tr("Use syslog output"), &data.syslogoutput, tr("no"), tr("yes")));
Add(new cMenuEditStraItem( tr("Default display mode"), &femonConfig.displaymode, eFemonModeMaxNumber, dispmodes)); Add(new cMenuEditStraItem( tr("Default display mode"), &data.displaymode, eFemonModeMaxNumber, dispmodes));
Add(new cMenuEditStraItem( tr("Skin"), &femonConfig.skin, eFemonSkinMaxNumber, skins)); Add(new cMenuEditStraItem( tr("Skin"), &data.skin, eFemonSkinMaxNumber, skins));
Add(new cMenuEditStraItem( tr("Theme"), &femonConfig.theme, eFemonThemeMaxNumber,themes)); Add(new cMenuEditStraItem( tr("Theme"), &data.theme, eFemonThemeMaxNumber,themes));
Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top"))); Add(new cMenuEditBoolItem( tr("Position"), &data.position, tr("bottom"), tr("top")));
Add(new cMenuEditIntItem( tr("Height"), &femonConfig.osdheight, 400, 500)); Add(new cMenuEditIntItem( tr("Height"), &data.osdheight, 400, 500));
Add(new cMenuEditIntItem( tr("Horizontal offset"), &femonConfig.osdoffset, -50, 50)); Add(new cMenuEditIntItem( tr("Horizontal offset"), &data.osdoffset, -50, 50));
Add(new cMenuEditBoolItem( tr("Show CA system"), &femonConfig.showcasystem, tr("no"), tr("yes"))); Add(new cMenuEditBoolItem( tr("Show CA system"), &data.showcasystem, tr("no"), tr("yes")));
Add(new cMenuEditIntItem( tr("Red limit [%]"), &femonConfig.redlimit, 1, 50)); Add(new cMenuEditIntItem( tr("Red limit [%]"), &data.redlimit, 1, 50));
Add(new cMenuEditIntItem( tr("Green limit [%]"), &femonConfig.greenlimit, 51, 100)); Add(new cMenuEditIntItem( tr("Green limit [%]"), &data.greenlimit, 51, 100));
Add(new cMenuEditIntItem( tr("OSD update interval [0.1s]"), &femonConfig.updateinterval, 1, 100)); Add(new cMenuEditIntItem( tr("OSD update interval [0.1s]"), &data.updateinterval, 1, 100));
Add(new cMenuEditBoolItem( tr("Analyze stream"), &femonConfig.analyzestream, tr("no"), tr("yes"))); Add(new cMenuEditBoolItem( tr("Analyze stream"), &data.analyzestream, tr("no"), tr("yes")));
if (femonConfig.analyzestream) if (femonConfig.analyzestream)
Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &femonConfig.calcinterval, 1, 100)); Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &data.calcinterval, 1, 100));
SetCurrent(Get(current)); SetCurrent(Get(current));
Display(); Display();
@@ -214,6 +269,8 @@ void cMenuFemonSetup::Setup(void)
void cMenuFemonSetup::Store(void) void cMenuFemonSetup::Store(void)
{ {
Dprintf("%s()\n", __PRETTY_FUNCTION__);
femonConfig = data;
SetupStore("HideMenu", femonConfig.hidemenu); SetupStore("HideMenu", femonConfig.hidemenu);
SetupStore("SyslogOutput", femonConfig.syslogoutput); SetupStore("SyslogOutput", femonConfig.syslogoutput);
SetupStore("DisplayMode", femonConfig.displaymode); SetupStore("DisplayMode", femonConfig.displaymode);
@@ -232,11 +289,11 @@ void cMenuFemonSetup::Store(void)
eOSState cMenuFemonSetup::ProcessKey(eKeys Key) eOSState cMenuFemonSetup::ProcessKey(eKeys Key)
{ {
int oldAnalyzestream = femonConfig.analyzestream; int oldAnalyzestream = data.analyzestream;
eOSState state = cMenuSetupPage::ProcessKey(Key); eOSState state = cMenuSetupPage::ProcessKey(Key);
if (Key != kNone && (femonConfig.analyzestream != oldAnalyzestream)) { if (Key != kNone && (data.analyzestream != oldAnalyzestream)) {
Setup(); Setup();
} }

11
femon.h
View File

@@ -11,13 +11,11 @@
#include <vdr/plugin.h> #include <vdr/plugin.h>
static const char *VERSION = "0.9.4"; static const char VERSION[] = "1.0.1";
static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)"; static const char DESCRIPTION[] = "DVB Signal Information Monitor (OSD)";
static const char *MAINMENUENTRY = "Signal Information"; static const char MAINMENUENTRY[] = "Signal Information";
class cPluginFemon : public cPlugin { class cPluginFemon : public cPlugin {
private:
// Add any member variables or functions you may need here.
public: public:
cPluginFemon(void); cPluginFemon(void);
virtual ~cPluginFemon(); virtual ~cPluginFemon();
@@ -29,6 +27,8 @@ public:
virtual bool Start(void); virtual bool Start(void);
virtual void Stop(void); virtual void Stop(void);
virtual void Housekeeping(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 const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); }
virtual cOsdObject *MainMenuAction(void); virtual cOsdObject *MainMenuAction(void);
virtual cMenuSetupPage *SetupMenu(void); virtual cMenuSetupPage *SetupMenu(void);
@@ -43,6 +43,7 @@ class cMenuFemonSetup : public cMenuSetupPage {
const char *dispmodes[eFemonModeMaxNumber]; const char *dispmodes[eFemonModeMaxNumber];
const char *skins[eFemonSkinMaxNumber]; const char *skins[eFemonSkinMaxNumber];
const char *themes[eFemonThemeMaxNumber]; const char *themes[eFemonThemeMaxNumber];
cFemonConfig data;
virtual void Setup(void); virtual void Setup(void);
protected: protected:
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);

View File

@@ -24,7 +24,7 @@ cFemonConfig::cFemonConfig(void)
calcinterval = 20; calcinterval = 20;
syslogoutput = 0; syslogoutput = 0;
showcasystem = 0; showcasystem = 0;
#ifdef FEMON_NTSC #ifdef NTSC
osdheight = 420; osdheight = 420;
#else #else
osdheight = 480; osdheight = 480;
@@ -36,6 +36,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
{ {
{ {
// eFemonThemeClassic // eFemonThemeClassic
4, // bpp
0x7F000000, // clrBackground 0x7F000000, // clrBackground
0xFFFCFCFC, // clrTitleBackground 0xFFFCFCFC, // clrTitleBackground
0xFF000000, // clrTitleText 0xFF000000, // clrTitleText
@@ -47,6 +48,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
}, },
{ {
// eFemonThemeElchi // eFemonThemeElchi
4, // bpp
0xC8000066, // clrBackground 0xC8000066, // clrBackground
0xC833AAEE, // clrTitleBackground 0xC833AAEE, // clrTitleBackground
0xFF000000, // clrTitleText 0xFF000000, // clrTitleText
@@ -58,6 +60,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
}, },
{ {
// eFemonThemeDeepBlue // eFemonThemeDeepBlue
4, // bpp
0xC80C0C0C, // clrBackground 0xC80C0C0C, // clrBackground
0xC832557A, // clrTitleBackground 0xC832557A, // clrTitleBackground
0xFF000000, // clrTitleText 0xFF000000, // clrTitleText
@@ -69,6 +72,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
}, },
{ {
// eFemonThemeMoronimo // eFemonThemeMoronimo
4, // bpp
0xDF294A6B, // clrBackground 0xDF294A6B, // clrBackground
0xDF3E5578, // clrTitleBackground 0xDF3E5578, // clrTitleBackground
0xFF9BBAD7, // clrTitleText 0xFF9BBAD7, // clrTitleText
@@ -80,6 +84,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
}, },
{ {
// eFemonThemeEnigma // eFemonThemeEnigma
4, // bpp
0xB8DEE5FA, // clrBackground 0xB8DEE5FA, // clrBackground
0xB84158BC, // clrTitleBackground 0xB84158BC, // clrTitleBackground
0xFFFFFFFF, // clrTitleText 0xFFFFFFFF, // clrTitleText
@@ -91,6 +96,7 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
}, },
{ {
// eFemonThemeEgalsTry // eFemonThemeEgalsTry
4, // bpp
0xCA2B1B9E, // clrBackground 0xCA2B1B9E, // clrBackground
0xDFBEBAC3, // clrTitleBackground 0xDFBEBAC3, // clrTitleBackground
0xFF280249, // clrTitleText 0xFF280249, // clrTitleText
@@ -100,4 +106,28 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
0xFFFCC024, // clrYellow 0xFFFCC024, // clrYellow
0xFF20980B, // clrGreen 0xFF20980B, // clrGreen
}, },
{
// eFemonThemeDuotone
2, // bpp
0x7F000000, // clrBackground
0xFFFCFCFC, // clrTitleBackground
0x7F000000, // clrTitleText
0xFFFCFCFC, // clrActiveText
0xFFFCFCFC, // clrInactiveText
0xFFFC1414, // clrRed
0xFFFCFCFC, // clrYellow
0xFFFCFCFC, // clrGreen
},
{
// eFemonThemeSilverGreen
4, // bpp
0xD9526470, // clrBackground
0xD9293841, // clrTitleBackground
0xFFB3BDCA, // clrTitleText
0xFFCE7B00, // clrActiveText
0xFFB3BDCA, // clrInactiveText
0xFF992900, // clrRed
0xFFCE7B00, // clrYellow
0xFF336600, // clrGreen
},
}; };

View File

@@ -55,11 +55,14 @@ enum eFemonThemes
eFemonThemeMoronimo, eFemonThemeMoronimo,
eFemonThemeEnigma, eFemonThemeEnigma,
eFemonThemeEgalsTry, eFemonThemeEgalsTry,
eFemonThemeDuotone,
eFemonThemeSilverGreen,
eFemonThemeMaxNumber eFemonThemeMaxNumber
}; };
struct cFemonTheme struct cFemonTheme
{ {
int bpp;
int clrBackground; int clrBackground;
int clrTitleBackground; int clrTitleBackground;
int clrTitleText; int clrTitleText;

View File

@@ -11,36 +11,35 @@ PLUGIN = femonclient
### The version number of this plugin (taken from the main source file): ### 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') VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The C++ compiler and options: ### The C++ compiler and options:
CXX ?= g++ CXX ?= g++
CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual -fPIC CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
### The directory environment: ### The directory environment:
DVBDIR = ../../../../DVB VDRDIR = ../../../..
VDRDIR = ../../.. LIBDIR = ../../../lib
LIBDIR = ../../lib
TMPDIR = /tmp TMPDIR = /tmp
### Allow user defined options to overwrite defaults: ### Allow user defined options to overwrite defaults:
-include $(VDRDIR)/Make.config -include $(VDRDIR)/Make.config
### The version number of VDR (taken from VDR's "config.h"): ### The version number of VDR's plugin API (taken from VDR's "config.h"):
VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g') APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
### The name of the distribution archive: ### The name of the distribution archive:
ARCHIVE = svcintf-$(VERSION) ARCHIVE = $(PLUGIN)-$(VERSION)
PACKAGE = vdr-$(ARCHIVE) PACKAGE = vdr-$(ARCHIVE)
### Includes and Defines (add further entries here): ### Includes and Defines (add further entries here):
INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include -I$(VDRDIR)/PLUGINS/src/femon/ INCLUDES += -I$(VDRDIR)/include -I$(VDRDIR)/PLUGINS/src/femon/
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
@@ -68,7 +67,7 @@ all: libvdr-$(PLUGIN).so
libvdr-$(PLUGIN).so: $(PLUGIN).o libvdr-$(PLUGIN).so: $(PLUGIN).o
$(CXX) $(CXXFLAGS) -shared $(PLUGIN).o -o $@ $(CXX) $(CXXFLAGS) -shared $(PLUGIN).o -o $@
@cp $@ $(LIBDIR)/$@.$(VDRVERSION) @cp $@ $(LIBDIR)/$@.$(APIVERSION)
dist: clean dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE)

View File

@@ -11,9 +11,9 @@
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include "femonservice.h" #include "femonservice.h"
static const char *VERSION = "0.0.1"; static const char VERSION[] = "0.0.1";
static const char *DESCRIPTION = "Femon client"; static const char DESCRIPTION[] = "Femon client";
static const char *MAINMENUENTRY = "Show frontend statistic on console"; static const char MAINMENUENTRY[] = "Show frontend statistic on console";
class cPluginFemonClient : public cPlugin { class cPluginFemonClient : public cPlugin {
public: public:
@@ -40,6 +40,7 @@ cOsdObject *cPluginFemonClient::MainMenuAction(void)
printf("UNC : %08X\n", femon.fe_unc); printf("UNC : %08X\n", femon.fe_unc);
printf("Video : %.2f Mbit/s\n", femon.video_bitrate); printf("Video : %.2f Mbit/s\n", femon.video_bitrate);
printf("Audio : %.0f kbit/s\n", femon.audio_bitrate); printf("Audio : %.0f kbit/s\n", femon.audio_bitrate);
printf("Dolby : %.0f kbit/s\n", femon.dolby_bitrate);
} }
else else
printf("\n--- No support for FemonService-v1.0 found ---\n"); printf("\n--- No support for FemonService-v1.0 found ---\n");

File diff suppressed because it is too large Load Diff

View File

@@ -81,7 +81,19 @@ cBitmap cFemonOsd::bmCarrier(carrier_xpm);
cBitmap cFemonOsd::bmViterbi(viterbi_xpm); cBitmap cFemonOsd::bmViterbi(viterbi_xpm);
cBitmap cFemonOsd::bmSync(sync_xpm); cBitmap cFemonOsd::bmSync(sync_xpm);
cFemonOsd::cFemonOsd(void) cFemonOsd *cFemonOsd::pInstance = NULL;
cFemonOsd *cFemonOsd::Instance(bool create)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
if (pInstance == NULL && create)
{
pInstance = new cFemonOsd();
}
return (pInstance);
}
cFemonOsd::cFemonOsd()
:cOsdObject(true), cThread("femon osd") :cOsdObject(true), cThread("femon osd")
{ {
Dprintf("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
@@ -110,13 +122,13 @@ cFemonOsd::cFemonOsd(void)
cFemonOsd::~cFemonOsd(void) cFemonOsd::~cFemonOsd(void)
{ {
Dprintf("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
if (Running()) { if (Running())
Cancel(3); Cancel(3);
}
if (m_Receiver) if (m_Receiver)
delete m_Receiver; delete m_Receiver;
if (m_Osd) if (m_Osd)
delete m_Osd; delete m_Osd;
pInstance = NULL;
} }
void cFemonOsd::DrawStatusWindow(void) void cFemonOsd::DrawStatusWindow(void)
@@ -582,7 +594,7 @@ void cFemonOsd::DrawInfoWindow(void)
break; break;
default: default:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestrial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
@@ -903,13 +915,13 @@ void cFemonOsd::Show(void)
} }
m_Osd = cOsdProvider::NewOsd(((Setup.OSDWidth - OSDWIDTH) / 2) + Setup.OSDLeft + femonConfig.osdoffset, ((Setup.OSDHeight - OSDHEIGHT) / 2) + Setup.OSDTop); m_Osd = cOsdProvider::NewOsd(((Setup.OSDWidth - OSDWIDTH) / 2) + Setup.OSDLeft + femonConfig.osdoffset, ((Setup.OSDHeight - OSDHEIGHT) / 2) + Setup.OSDTop);
if (m_Osd) { if (m_Osd) {
tArea Areas1[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, 4 } }; tArea Areas1[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, femonTheme[femonConfig.theme].bpp } };
if (m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) { if (m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
m_Osd->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea)); m_Osd->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea));
} }
else { else {
tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0), (OSDWIDTH-1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-1), 4 }, tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0), (OSDWIDTH-1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-1), femonTheme[femonConfig.theme].bpp },
{ 0, OSDINFOWIN_Y(0), (OSDWIDTH-1), OSDINFOWIN_Y(OSDROWHEIGHT-1), 4 }, { 0, OSDINFOWIN_Y(0), (OSDWIDTH-1), OSDINFOWIN_Y(OSDROWHEIGHT-1), femonTheme[femonConfig.theme].bpp },
{ 0, OSDINFOWIN_Y(OSDROWHEIGHT), (OSDWIDTH-1), OSDINFOWIN_Y(OSDINFOHEIGHT-1), 2 } }; { 0, OSDINFOWIN_Y(OSDROWHEIGHT), (OSDWIDTH-1), OSDINFOWIN_Y(OSDINFOHEIGHT-1), 2 } };
m_Osd->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea)); m_Osd->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea));
} }
@@ -980,6 +992,71 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
} }
} }
bool cFemonOsd::DeviceSwitch(int direction)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
int device = cDevice::ActualDevice()->DeviceNumber();
direction = sgn(direction);
if (device >= 0) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
if (direction) {
if (++device >= cDevice::NumDevices())
device = 0;
}
else {
if (--device < 0)
device = cDevice::NumDevices() - 1;
}
if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) {
Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0);
cControl::Shutdown();
cDevice::GetDevice(device)->SwitchChannel(channel, true);
if (cDevice::GetDevice(device) == cDevice::PrimaryDevice())
cDevice::GetDevice(device)->ForceTransferMode();
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
return (true);
}
}
}
return (false);
}
double cFemonOsd::GetVideoBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
value = m_Receiver->VideoBitrate();
return (value);
}
double cFemonOsd::GetAudioBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
value = m_Receiver->AudioBitrate();
return (value);
}
double cFemonOsd::GetDolbyBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
value = m_Receiver->AC3Bitrate();
return (value);
}
eOSState cFemonOsd::ProcessKey(eKeys Key) eOSState cFemonOsd::ProcessKey(eKeys Key)
{ {
eOSState state = cOsdObject::ProcessKey(Key); eOSState state = cOsdObject::ProcessKey(Key);
@@ -1060,32 +1137,10 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
} }
break; break;
case kRight: case kRight:
DeviceSwitch(1);
break;
case kLeft: case kLeft:
{ DeviceSwitch(-1);
int device = cDevice::ActualDevice()->DeviceNumber();
if (device >= 0) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
if (NORMALKEY(Key) == kRight) {
if (++device >= cDevice::NumDevices()) device = 0;
}
else {
if (--device < 0) device = cDevice::NumDevices() - 1;
}
if (cDevice::GetDevice(device)->ProvidesChannel(channel)) {
Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, Key, device);
// here should be added some checks, if the device is really available (i.e. not recording)
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0);
cControl::Shutdown();
cDevice::GetDevice(device)->SwitchChannel(channel, true);
// does this work with primary devices ?
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
break;
}
}
}
}
break; break;
case kUp|k_Repeat: case kUp|k_Repeat:
case kUp: case kUp:

View File

@@ -21,6 +21,7 @@
class cFemonOsd : public cOsdObject, public cThread, public cStatus { class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private: private:
static cFemonOsd *pInstance;
cOsd *m_Osd; cOsd *m_Osd;
cFemonReceiver *m_Receiver; cFemonReceiver *m_Receiver;
int m_Frontend; int m_Frontend;
@@ -44,16 +45,24 @@ private:
void DrawInfoWindow(void); void DrawInfoWindow(void);
protected: protected:
cFemonOsd();
cFemonOsd(const cFemonOsd&);
cFemonOsd& operator= (const cFemonOsd&);
virtual void Action(void); virtual void Action(void);
virtual void ChannelSwitch(const cDevice * device, int channelNumber); virtual void ChannelSwitch(const cDevice * device, int channelNumber);
virtual void SetAudioTrack(int Index, const char * const *Tracks); virtual void SetAudioTrack(int Index, const char * const *Tracks);
public: public:
cFemonOsd(void); static cFemonOsd *Instance(bool create = false);
~cFemonOsd(); ~cFemonOsd();
virtual void Show(void); virtual void Show(void);
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);
bool DeviceSwitch(int direction);
double GetVideoBitrate(void);
double GetAudioBitrate(void);
double GetDolbyBitrate(void);
}; };
#endif //__FEMONOSD_H #endif //__FEMONOSD_H

View File

@@ -58,9 +58,8 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid[], int Dpid[])
cFemonReceiver::~cFemonReceiver(void) cFemonReceiver::~cFemonReceiver(void)
{ {
Dprintf("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
Detach();
if (Running()) if (Running())
Cancel(); Cancel(3);
} }
/* The following function originates from libdvbmpeg: */ /* The following function originates from libdvbmpeg: */
@@ -231,20 +230,71 @@ void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count)
m_AC3FrameSize <<= 1; m_AC3FrameSize <<= 1;
m_AC3BitStreamMode = (headr[3] & 7); m_AC3BitStreamMode = (headr[3] & 7);
m_AC3AudioCodingMode = (headr[4] & 0xE0) >> 5; m_AC3AudioCodingMode = (headr[4] & 0xE0) >> 5;
if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) // if 3 front channels if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) {
// 3 front channels
m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3; m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3;
else if (m_AC3AudioCodingMode & 0x04) {
// a surround channel exists
m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1;
if (m_AC3AudioCodingMode == 0x02) {
// if in 2/0 mode
m_AC3DolbySurroundMode = ((headr[4] & 0x01) << 1) | ((headr[5] & 0x80) >> 7);
m_AC3LfeOn = (headr[5] & 0x40) >> 6;
m_AC3DialogLevel = (headr[5] & 0x3e) >> 1;
}
else {
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = (headr[4] & 0x01);
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
}
}
else {
m_AC3SurroundMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode == 0x02) {
// if in 2/0 mode
m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1;
m_AC3LfeOn = (headr[4] & 0x01);
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
}
else {
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
}
}
}
else {
m_AC3CenterMixLevel = FR_NOTVALID; m_AC3CenterMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode & 0x04) // if a surround channel exists if (m_AC3AudioCodingMode & 0x04) {
m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1; // a surround channel exists
else m_AC3SurroundMixLevel = (headr[4] & 0x18) >> 3;
m_AC3SurroundMixLevel = FR_NOTVALID; if (m_AC3AudioCodingMode == 0x02) {
if (m_AC3AudioCodingMode == 0x02) // if in 2/0 mode // if in 2/0 mode
m_AC3DolbySurroundMode = ((headr[4] & 1) << 1) | ((headr[5] & 0x80) >> 7); m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1;
else m_AC3LfeOn = (headr[4] & 0x01);
m_AC3DolbySurroundMode = FR_NOTVALID; m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
m_AC3LfeOn = (headr[5] & 0x40) >> 6; }
m_AC3DialogLevel = (headr[5] & 0x3e) >> 1; else {
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
}
}
else {
m_AC3SurroundMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode == 0x02) {
// if in 2/0 mode
m_AC3DolbySurroundMode = (headr[4] & 0x18) >> 3;
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
}
else {
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = (headr[4] & 0x10) >> 4;
m_AC3DialogLevel = ((headr[4] & 0x0F) << 1) | ((headr[5] & 0x80) >> 7);
}
}
}
} }
void cFemonReceiver::Activate(bool On) void cFemonReceiver::Activate(bool On)

View File

@@ -20,6 +20,7 @@ struct FemonService_v1_0 {
uint32_t fe_unc; uint32_t fe_unc;
double video_bitrate; double video_bitrate;
double audio_bitrate; double audio_bitrate;
double dolby_bitrate;
}; };
#endif //__FEMONSERVICE_H #endif //__FEMONSERVICE_H

View File

@@ -25,7 +25,7 @@ cString getFrontendName(int cardIndex)
ioctl(fe, FE_GET_INFO, &value); ioctl(fe, FE_GET_INFO, &value);
close(fe); close(fe);
return (cString::sprintf("#%d %s", cardIndex, value.name)); return (cString::sprintf("%s on device #%d", value.name, cardIndex));
} }
cString getFrontendStatus(int cardIndex) cString getFrontendStatus(int cardIndex)
@@ -41,7 +41,7 @@ cString getFrontendStatus(int cardIndex)
CHECK(ioctl(fe, FE_READ_STATUS, &value)); CHECK(ioctl(fe, FE_READ_STATUS, &value));
close(fe); close(fe);
return (cString::sprintf("%s:%s:%s:%s:%s", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-")); return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", cardIndex));
} }
uint16_t getSignal(int cardIndex) uint16_t getSignal(int cardIndex)
@@ -108,20 +108,3 @@ uint32_t getUNC(int cardIndex)
return (value); return (value);
} }
double getVideoBitrate(void)
{
double value = 0.0;
// Not yet implemented.
return (value);
}
double getAudioBitrate(void)
{
double value = 0.0;
// Not yet implemented.
return (value);
}

View File

@@ -12,7 +12,7 @@
#include <stdint.h> #include <stdint.h>
#include <vdr/tools.h> #include <vdr/tools.h>
#ifdef FEMON_DEBUG #ifdef DEBUG
#define Dprintf(x...) printf(x); #define Dprintf(x...) printf(x);
#else #else
#define Dprintf(x...) ; #define Dprintf(x...) ;
@@ -26,7 +26,5 @@ uint16_t getSNR(int cardIndex = 0);
uint16_t getSignal(int cardIndex = 0); uint16_t getSignal(int cardIndex = 0);
uint32_t getBER(int cardIndex = 0); uint32_t getBER(int cardIndex = 0);
uint32_t getUNC(int cardIndex = 0); uint32_t getUNC(int cardIndex = 0);
double getVideoBitrate(void);
double getAudioBitrate(void);
#endif // __FEMONTOOLS_H #endif // __FEMONTOOLS_H

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * ar11_xpm[] = { static const char *const ar11_xpm[] = {
"26 18 2 1", "26 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * ar169_xpm[] = { static const char *const ar169_xpm[] = {
"38 18 2 1", "38 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * ar2211_xpm[] = { static const char *const ar2211_xpm[] = {
"52 18 2 1", "52 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * ar43_xpm[] = { static const char *const ar43_xpm[] = {
"31 18 2 1", "31 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * carrier_xpm[] = { static const char *const carrier_xpm[] = {
"96 19 2 1", "96 19 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * device_xpm[] = { static const char *const device_xpm[] = {
"14 18 2 1", "14 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * dolbydigital_xpm[] = { static const char *const dolbydigital_xpm[] = {
"31 18 2 1", "31 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * dolbydigital20_xpm[] = { static const char *const dolbydigital20_xpm[] = {
"55 18 2 1", "55 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * dolbydigital51_xpm[] = { static const char *const dolbydigital51_xpm[] = {
"51 18 2 1", "51 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * five_xpm[] = { static const char *const five_xpm[] = {
"15 18 2 1", "15 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * four_xpm[] = { static const char *const four_xpm[] = {
"15 18 2 1", "15 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * lock_xpm[] = { static const char *const lock_xpm[] = {
"96 19 2 1", "96 19 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * monoleft_xpm[] = { static const char *const monoleft_xpm[] = {
"17 18 2 1", "17 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * monoright_xpm[] = { static const char *const monoright_xpm[] = {
"17 18 2 1", "17 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * ntsc_xpm[] = { static const char *const ntsc_xpm[] = {
"19 18 2 1", "19 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * one_xpm[] = { static const char *const one_xpm[] = {
"15 18 2 1", "15 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * pal_xpm[] = { static const char *const pal_xpm[] = {
"18 18 2 1", "18 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * signal_xpm[] = { static const char *const signal_xpm[] = {
"96 19 2 1", "96 19 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * stereo_xpm[] = { static const char *const stereo_xpm[] = {
"17 18 2 1", "17 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * sync_xpm[] = { static const char *const sync_xpm[] = {
"96 19 2 1", "96 19 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * three_xpm[] = { static const char *const three_xpm[] = {
"15 18 2 1", "15 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * two_xpm[] = { static const char *const two_xpm[] = {
"15 18 2 1", "15 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * viterbi_xpm[] = { static const char *const viterbi_xpm[] = {
"96 19 2 1", "96 19 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",

View File

@@ -1,5 +1,5 @@
/* XPM */ /* XPM */
static char * zero_xpm[] = { static const char *const zero_xpm[] = {
"15 18 2 1", "15 18 2 1",
". c #FFFFFF", ". c #FFFFFF",
"+ c #000000", "+ c #000000",