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).
This commit is contained in:
Rolf Ahrenberg 2005-11-13 04:20:00 +02:00
parent e2fb9e994a
commit 7da8cb2110
16 changed files with 323 additions and 178 deletions

11
HISTORY
View File

@ -183,3 +183,14 @@ 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).

View File

@ -16,11 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).h | awk '{ pri
### 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:

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.

116
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(VDRVERSNUM) && VDRVERSNUM < 10336
#error "You don't exist! Go away! Upgrade yourself!" #error "You don't exist! Go away! Upgrade yourself!"
#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,9 @@ 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");
data = femonConfig;
Setup(); Setup();
} }
@ -192,21 +246,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 +268,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 +288,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();
} }

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 = "0.9.5";
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();
@ -43,6 +41,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

@ -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
@ -100,4 +105,16 @@ 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
},
}; };

View File

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

View File

@ -16,7 +16,7 @@ VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ pri
### 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:

View File

@ -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");

View File

@ -15,7 +15,7 @@ const tI18nPhrase Phrases[] = {
"Visualizza le informazioni sul segnale DVB", // Italiano "Visualizza le informazioni sul segnale DVB", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Affiche les informations du signal DVB", // Français
"", // Norsk "", // Norsk
"Signaalimittari (OSD)", // suomi "Signaalimittari (OSD)", // suomi
"", // Polski "", // Polski
@ -36,7 +36,7 @@ const tI18nPhrase Phrases[] = {
"Informazioni sul segnale", // Italiano "Informazioni sul segnale", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Signal DVB", // Français
"", // Norsk "", // Norsk
"Signaalimittari", // suomi "Signaalimittari", // suomi
"", // Polski "", // Polski
@ -57,7 +57,7 @@ const tI18nPhrase Phrases[] = {
"Posizione", // Italiano "Posizione", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Position", // Français
"", // Norsk "", // Norsk
"Sijainti", // suomi "Sijainti", // suomi
"", // Polski "", // Polski
@ -78,7 +78,7 @@ const tI18nPhrase Phrases[] = {
"Altezza", // Italiano "Altezza", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Hauteur", // Français
"", // Norsk "", // Norsk
"Korkeus", // suomi "Korkeus", // suomi
"", // Polski "", // Polski
@ -99,7 +99,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Déplacement horizontal", // Français
"", // Norsk "", // Norsk
"Vaakakeskitys", // suomi "Vaakakeskitys", // suomi
"", // Polski "", // Polski
@ -120,7 +120,7 @@ const tI18nPhrase Phrases[] = {
"Modo di visualizzazione standard", // Italiano "Modo di visualizzazione standard", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Affichage par défaut", // Français
"", // Norsk "", // Norsk
"Oletusnäyttötila", // suomi "Oletusnäyttötila", // suomi
"", // Polski "", // Polski
@ -141,7 +141,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "basique", // Français
"", // Norsk "", // Norsk
"perus", // suomi "perus", // suomi
"", // Polski "", // Polski
@ -162,7 +162,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "transpondeur", // Français
"", // Norsk "", // Norsk
"transponderi", // suomi "transponderi", // suomi
"", // Polski "", // Polski
@ -183,7 +183,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "flux", // Français
"", // Norsk "", // Norsk
"lähete", // suomi "lähete", // suomi
"", // Polski "", // Polski
@ -204,7 +204,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Skin", // Français
"", // Norsk "", // Norsk
"Ulkoasu", // suomi "Ulkoasu", // suomi
"", // Polski "", // Polski
@ -225,7 +225,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Thème", // Français
"", // Norsk "", // Norsk
"Teema", // suomi "Teema", // suomi
"", // Polski "", // Polski
@ -246,7 +246,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Classique", // Français
"", // Norsk "", // Norsk
"Klassinen", // suomi "Klassinen", // suomi
"", // Polski "", // Polski
@ -366,13 +366,34 @@ const tI18nPhrase Phrases[] = {
"EgalsTry", // Eesti "EgalsTry", // Eesti
"EgalsTry", // Dansk "EgalsTry", // Dansk
}, },
{ "Duotone", // English
"Duotone", // Deutsch
"Duotone", // Slovenski
"Duotone", // Italiano
"Duotone", // Nederlands
"Duotone", // Português
"Duotone", // Français
"Duotone", // Norsk
"Duotone", // suomi
"Duotone", // Polski
"Duotone", // Español
"Duotone", // ÅëëçíéêÜ (Greek)
"Duotone", // Svenska
"Duotone", // Romaneste
"Duotone", // Magyar
"Duotone", // Català
"Duotone", // ÀãááÚØÙ (Russian)
"Duotone", // Hrvatski (Croatian)
"Duotone", // Eesti
"Duotone", // Dansk
},
{ "Hide main menu entry", // English { "Hide main menu entry", // English
"Hauptmenüeintrag verstecken", // Deutsch "Hauptmenüeintrag verstecken", // Deutsch
"", // Slovenski "", // Slovenski
"Nascondi voce menů", // Italiano "Nascondi voce menů", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Masquer dans le menu principal", // Français
"", // Norsk "", // Norsk
"Piilota valinta päävalikosta", // suomi "Piilota valinta päävalikosta", // suomi
"", // Polski "", // Polski
@ -393,7 +414,7 @@ const tI18nPhrase Phrases[] = {
"Intervallo di aggiornamento [0.1s]", // Italiano "Intervallo di aggiornamento [0.1s]", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Intervalle de mise à jour (0,1s)", // Français
"", // Norsk "", // Norsk
"Näytön päivitysväli [0.1s]", // suomi "Näytön päivitysväli [0.1s]", // suomi
"", // Polski "", // Polski
@ -414,7 +435,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Analyser le flux", // Français
"", // Norsk "", // Norsk
"Lähetteen analysointi", // suomi "Lähetteen analysointi", // suomi
"", // Polski "", // Polski
@ -435,7 +456,7 @@ const tI18nPhrase Phrases[] = {
"Intervallo di calcolo [0.1s]", // Italiano "Intervallo di calcolo [0.1s]", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Intervalle de calcul (0,1s)", // Français
"", // Norsk "", // Norsk
"Laskennan päivitysväli [0.1s]", // suomi "Laskennan päivitysväli [0.1s]", // suomi
"", // Polski "", // Polski
@ -456,7 +477,7 @@ const tI18nPhrase Phrases[] = {
"Limite rosso [%]", // Italiano "Limite rosso [%]", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Limite du rouge (%)", // Français
"", // Norsk "", // Norsk
"Punaisen taso [%]", // suomi "Punaisen taso [%]", // suomi
"", // Polski "", // Polski
@ -477,7 +498,7 @@ const tI18nPhrase Phrases[] = {
"Limite verde [%]", // Italiano "Limite verde [%]", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Limite du vert (%)", // Français
"", // Norsk "", // Norsk
"Vihreän taso [%]", // suomi "Vihreän taso [%]", // suomi
"", // Polski "", // Polski
@ -498,7 +519,7 @@ const tI18nPhrase Phrases[] = {
"Informazioni transponder", // Italiano "Informazioni transponder", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Information transpondeur", // Français
"", // Norsk "", // Norsk
"Transponderin tiedot", // suomi "Transponderin tiedot", // suomi
"", // Polski "", // Polski
@ -519,7 +540,7 @@ const tI18nPhrase Phrases[] = {
"Scheda satellitare", // Italiano "Scheda satellitare", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Carte Satellite", // Français
"", // Norsk "", // Norsk
"Satelliittikortti", // suomi "Satelliittikortti", // suomi
"", // Polski "", // Polski
@ -540,7 +561,7 @@ const tI18nPhrase Phrases[] = {
"Scheda via cavo", // Italiano "Scheda via cavo", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Carte Câble", // Français
"", // Norsk "", // Norsk
"Kaapelikortti", // suomi "Kaapelikortti", // suomi
"", // Polski "", // Polski
@ -561,7 +582,7 @@ const tI18nPhrase Phrases[] = {
"Scheda terrestre", // Italiano "Scheda terrestre", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Carte TNT", // Français
"", // Norsk "", // Norsk
"Terrestiaalikortti", // suomi "Terrestiaalikortti", // suomi
"", // Polski "", // Polski
@ -582,7 +603,7 @@ const tI18nPhrase Phrases[] = {
"Registra su syslog", // Italiano "Registra su syslog", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Enregistrer les infos dans syslog", // Français
"", // Norsk "", // Norsk
"Kirjaa systeemilokiin", // suomi "Kirjaa systeemilokiin", // suomi
"", // Polski "", // Polski
@ -624,7 +645,7 @@ const tI18nPhrase Phrases[] = {
"Video", // Italiano "Video", // Italiano
"Video", // Nederlands "Video", // Nederlands
"Video", // Portuguęs "Video", // Portuguęs
"Video", // Français "Vidéo", // Français
"Video", // Norsk "Video", // Norsk
"Kuva", // suomi "Kuva", // suomi
"Video", // Polski "Video", // Polski
@ -666,7 +687,7 @@ const tI18nPhrase Phrases[] = {
"None", // Italiano "None", // Italiano
"None", // Nederlands "None", // Nederlands
"None", // Portuguęs "None", // Portuguęs
"None", // Français "Aucun", // Français
"None", // Norsk "None", // Norsk
"ei", // suomi "ei", // suomi
"None", // Polski "None", // Polski
@ -687,7 +708,7 @@ const tI18nPhrase Phrases[] = {
"Off", // Italiano "Off", // Italiano
"Off", // Nederlands "Off", // Nederlands
"Off", // Portuguęs "Off", // Portuguęs
"Off", // Français "Non", // Français
"Off", // Norsk "Off", // Norsk
"poissa", // suomi "poissa", // suomi
"Off", // Polski "Off", // Polski
@ -708,7 +729,7 @@ const tI18nPhrase Phrases[] = {
"On", // Italiano "On", // Italiano
"On", // Nederlands "On", // Nederlands
"On", // Portuguęs "On", // Portuguęs
"On", // Français "Oui", // Français
"On", // Norsk "On", // Norsk
"päällä", // suomi "päällä", // suomi
"On", // Polski "On", // Polski
@ -792,7 +813,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Information flux", // Français
"", // Norsk "", // Norsk
"Lähetteen tiedot", // suomi "Lähetteen tiedot", // suomi
"", // Polski "", // Polski
@ -813,7 +834,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "MPEG Layer", // Français
"", // Norsk "", // Norsk
"MPEG-taso", // suomi "MPEG-taso", // suomi
"", // Polski "", // Polski
@ -834,7 +855,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Flux vidéo", // Français
"", // Norsk "", // Norsk
"Kuvaraita", // suomi "Kuvaraita", // suomi
"", // Polski "", // Polski
@ -855,7 +876,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Bitrate", // Français
"", // Norsk "", // Norsk
"Bittinopeus", // suomi "Bittinopeus", // suomi
"", // Polski "", // Polski
@ -876,7 +897,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Rafraîchissement", // Français
"", // Norsk "", // Norsk
"Ruudunpäivitysnopeus", // suomi "Ruudunpäivitysnopeus", // suomi
"", // Polski "", // Polski
@ -918,7 +939,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Proportions d'image", // Français
"", // Norsk "", // Norsk
"Kuvasuhde", // suomi "Kuvasuhde", // suomi
"", // Polski "", // Polski
@ -939,7 +960,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "réservé", // Français
"", // Norsk "", // Norsk
"varattu", // suomi "varattu", // suomi
"", // Polski "", // Polski
@ -960,7 +981,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "libre", // Français
"", // Norsk "", // Norsk
"vapaa", // suomi "vapaa", // suomi
"", // Polski "", // Polski
@ -981,7 +1002,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Standard vidéo", // Français
"", // Norsk "", // Norsk
"Kuvaformaatti", // suomi "Kuvaformaatti", // suomi
"", // Polski "", // Polski
@ -1044,7 +1065,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "inconnu", // Français
"", // Norsk "", // Norsk
"tuntematon", // suomi "tuntematon", // suomi
"", // Polski "", // Polski
@ -1065,7 +1086,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Résolution", // Français
"", // Norsk "", // Norsk
"Resoluutio", // suomi "Resoluutio", // suomi
"", // Polski "", // Polski
@ -1086,7 +1107,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Flux audio", // Français
"", // Norsk "", // Norsk
"Ääniraita", // suomi "Ääniraita", // suomi
"", // Polski "", // Polski
@ -1107,7 +1128,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Fréquence d'échantillonage", // Français
"", // Norsk "", // Norsk
"Näytteenottotaajuus", // suomi "Näytteenottotaajuus", // suomi
"", // Polski "", // Polski
@ -1296,7 +1317,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "non indiqué", // Français
"", // Norsk "", // Norsk
"ei ilmaistu", // suomi "ei ilmaistu", // suomi
"", // Polski "", // Polski
@ -1338,7 +1359,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Flux AC-3", // Français
"", // Norsk "", // Norsk
"AC-3-ääniraita", // suomi "AC-3-ääniraita", // suomi
"", // Polski "", // Polski
@ -1359,7 +1380,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Taille de paquet", // Français
"", // Norsk "", // Norsk
"Kehyksen koko", // suomi "Kehyksen koko", // suomi
"", // Polski "", // Polski
@ -1380,7 +1401,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Mode bitstream", // Français
"", // Norsk "", // Norsk
"Lähetteen tyyppi", // suomi "Lähetteen tyyppi", // suomi
"", // Polski "", // Polski
@ -1401,7 +1422,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Mode de codage audio", // Français
"", // Norsk "", // Norsk
"Äänikoodaus", // suomi "Äänikoodaus", // suomi
"", // Polski "", // Polski
@ -1422,7 +1443,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Niveau sonore milieu", // Français
"", // Norsk "", // Norsk
"Keskikanavan taso", // suomi "Keskikanavan taso", // suomi
"", // Polski "", // Polski
@ -1443,7 +1464,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Niveau sonore surround", // Français
"", // Norsk "", // Norsk
"Tehostekanavien taso", // suomi "Tehostekanavien taso", // suomi
"", // Polski "", // Polski
@ -1464,7 +1485,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Mode Dolby Surround", // Français
"", // Norsk "", // Norsk
"Dolby Surround -tehoste", // suomi "Dolby Surround -tehoste", // suomi
"", // Polski "", // Polski
@ -1485,7 +1506,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Effets de basses", // Français
"", // Norsk "", // Norsk
"LFE-kanava", // suomi "LFE-kanava", // suomi
"", // Polski "", // Polski
@ -1506,7 +1527,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Normalisation des dialogues", // Français
"", // Norsk "", // Norsk
"Dialogin normalisointi", // suomi "Dialogin normalisointi", // suomi
"", // Polski "", // Polski
@ -1527,7 +1548,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Principal (CM)", // Français
"", // Norsk "", // Norsk
"Pääasiallinen (CM)", // suomi "Pääasiallinen (CM)", // suomi
"", // Polski "", // Polski
@ -1548,7 +1569,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Musique et effets (ME)", // Français
"", // Norsk "", // Norsk
"Musiikki ja tehosteet (ME)", // suomi "Musiikki ja tehosteet (ME)", // suomi
"", // Polski "", // Polski
@ -1569,7 +1590,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Malvoyants (VI)", // Français
"", // Norsk "", // Norsk
"Näkörajoitteinen (VI)", // suomi "Näkörajoitteinen (VI)", // suomi
"", // Polski "", // Polski
@ -1590,7 +1611,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Malentendants (HI)", // Français
"", // Norsk "", // Norsk
"Kuulorajoitteinen (HI)", // suomi "Kuulorajoitteinen (HI)", // suomi
"", // Polski "", // Polski
@ -1611,7 +1632,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Dialogue (D)", // Français
"", // Norsk "", // Norsk
"Vuoropuhelu (D)", // suomi "Vuoropuhelu (D)", // suomi
"", // Polski "", // Polski
@ -1632,7 +1653,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Commentaires (C)", // Français
"", // Norsk "", // Norsk
"Kommentointi (C)", // suomi "Kommentointi (C)", // suomi
"", // Polski "", // Polski
@ -1653,7 +1674,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Urgence (E)", // Français
"", // Norsk "", // Norsk
"Hätätiedote (E)", // suomi "Hätätiedote (E)", // suomi
"", // Polski "", // Polski
@ -1674,7 +1695,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Voix off (VO)", // Français
"", // Norsk "", // Norsk
"Päälle puhuttu (VO)", // suomi "Päälle puhuttu (VO)", // suomi
"", // Polski "", // Polski
@ -1695,7 +1716,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Karaoke", // Français
"", // Norsk "", // Norsk
"Karaoke", // suomi "Karaoke", // suomi
"", // Polski "", // Polski
@ -1716,7 +1737,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Can. 1", // Français
"", // Norsk "", // Norsk
"kan. 1", // suomi "kan. 1", // suomi
"", // Polski "", // Polski
@ -1737,7 +1758,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Can. 2", // Français
"", // Norsk "", // Norsk
"kan. 2", // suomi "kan. 2", // suomi
"", // Polski "", // Polski
@ -1758,7 +1779,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Centre", // Français
"", // Norsk "", // Norsk
"K", // suomi "K", // suomi
"", // Polski "", // Polski
@ -1779,7 +1800,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Gauche", // Français
"", // Norsk "", // Norsk
"V", // suomi "V", // suomi
"", // Polski "", // Polski
@ -1800,7 +1821,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Droite", // Français
"", // Norsk "", // Norsk
"O", // suomi "O", // suomi
"", // Polski "", // Polski
@ -1821,7 +1842,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Surround", // Français
"", // Norsk "", // Norsk
"T", // suomi "T", // suomi
"", // Polski "", // Polski
@ -1842,7 +1863,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Surround gauche", // Français
"", // Norsk "", // Norsk
"TV", // suomi "TV", // suomi
"", // Polski "", // Polski
@ -1863,7 +1884,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Surround droit", // Français
"", // Norsk "", // Norsk
"TO", // suomi "TO", // suomi
"", // Polski "", // Polski
@ -1884,7 +1905,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Système CA", // Français
"", // Norsk "", // Norsk
"Näytä salausjärjestelmä", // suomi "Näytä salausjärjestelmä", // suomi
"", // Polski "", // Polski
@ -1905,7 +1926,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Fixe", // Français
"", // Norsk "", // Norsk
"kiinteä", // suomi "kiinteä", // suomi
"", // Polski "", // Polski
@ -1926,7 +1947,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Analogique", // Français
"", // Norsk "", // Norsk
"analoginen", // suomi "analoginen", // suomi
"", // Polski "", // Polski
@ -1947,7 +1968,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Free To Air", // Français
"", // Norsk "", // Norsk
"salaamaton", // suomi "salaamaton", // suomi
"", // Polski "", // Polski
@ -1968,7 +1989,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "SECA/Mediaguard", // Français
"", // Norsk "", // Norsk
"SECA/Mediaguard", // suomi "SECA/Mediaguard", // suomi
"", // Polski "", // Polski
@ -1989,7 +2010,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Viaccess", // Français
"", // Norsk "", // Norsk
"Viaccess", // suomi "Viaccess", // suomi
"", // Polski "", // Polski
@ -2010,7 +2031,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Irdeto", // Français
"", // Norsk "", // Norsk
"Irdeto", // suomi "Irdeto", // suomi
"", // Polski "", // Polski
@ -2031,7 +2052,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "NDS/Videoguard", // Français
"", // Norsk "", // Norsk
"NDS/Videoguard", // suomi "NDS/Videoguard", // suomi
"", // Polski "", // Polski
@ -2052,7 +2073,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "Conax", // Français
"", // Norsk "", // Norsk
"Conax", // suomi "Conax", // suomi
"", // Polski "", // Polski
@ -2073,7 +2094,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "CryptoWorks", // Français
"", // Norsk "", // Norsk
"CryptoWorks", // suomi "CryptoWorks", // suomi
"", // Polski "", // Polski
@ -2094,7 +2115,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "PowerVu", // Français
"", // Norsk "", // Norsk
"PowerVu", // suomi "PowerVu", // suomi
"", // Polski "", // Polski
@ -2115,7 +2136,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "BetaCrypt", // Français
"", // Norsk "", // Norsk
"BetaCrypt", // suomi "BetaCrypt", // suomi
"", // Polski "", // Polski
@ -2136,7 +2157,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "NagraVision", // Français
"", // Norsk "", // Norsk
"NagraVision", // suomi "NagraVision", // suomi
"", // Polski "", // Polski
@ -2157,7 +2178,7 @@ const tI18nPhrase Phrases[] = {
"", // Italiano "", // Italiano
"", // Nederlands "", // Nederlands
"", // Portuguęs "", // Portuguęs
"", // Français "SkyCrypt", // Français
"", // Norsk "", // Norsk
"SkyCrypt", // suomi "SkyCrypt", // suomi
"", // Polski "", // Polski

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)
@ -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,69 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
} }
} }
bool cFemonOsd::DeviceSwitch(int direction)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
int device = cDevice::ActualDevice()->DeviceNumber();
direction = sgn(direction);
if (device >= 0) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
if (direction) {
if (++device >= cDevice::NumDevices()) device = 0;
}
else {
if (--device < 0) device = cDevice::NumDevices() - 1;
}
if (cDevice::GetDevice(device)->ProvidesChannel(channel)) {
Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
// here should be added some checks, if the device is really available (i.e. not recording)
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0);
cControl::Shutdown();
cDevice::GetDevice(device)->SwitchChannel(channel, true);
// does this work with primary devices ?
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
return (true);
}
}
}
return (false);
}
double cFemonOsd::GetVideoBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
value = m_Receiver->VideoBitrate();
return (value);
}
double cFemonOsd::GetAudioBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
value = m_Receiver->AudioBitrate();
return (value);
}
double cFemonOsd::GetDolbyBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
value = m_Receiver->AC3Bitrate();
return (value);
}
eOSState cFemonOsd::ProcessKey(eKeys Key) eOSState cFemonOsd::ProcessKey(eKeys Key)
{ {
eOSState state = cOsdObject::ProcessKey(Key); eOSState state = cOsdObject::ProcessKey(Key);
@ -1060,32 +1135,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: */

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

@ -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