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
825755281f Added Estonian translations (Thanks to Arthur Konovalov). 2005-01-24 04:20:00 +02:00
Rolf Ahrenberg
ab3f270eed Updated for vdr-1.3.19. 2005-01-23 04:20:00 +02:00
Rolf Ahrenberg
995b2567e5 Some minor cosmetic fixes. 2005-01-23 04:20:00 +02:00
Rolf Ahrenberg
6f9961f499 Updated for vdr-1.3.18.
Added DEBUG mode (make DEBUG=1 plugins).
OSD height is now user configurable.
Added audio channel selection into Yellow key.
2005-01-15 04:20:00 +02:00
Rolf Ahrenberg
c454189adf Updated for vdr-1.3.17.
Fixed receiver related crash (Thanks to Marco Schluessler).
2004-11-28 04:20:00 +02:00
Rolf Ahrenberg
5339f71b33 Yet Another Minor Release.
Integrated the CA system names patch: "Setup / Show CA System".
2004-09-11 04:20:00 +03:00
Rolf Ahrenberg
8e53fa8521 Fixed OSDSTATUSWIN_XC define.
Added preliminary NTSC support (make NTSC_SYSTEM=1 plugins).
Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting this one).
Added patches directory: CA system names by Lauri Tischler.
2004-08-18 04:20:00 +03:00
Rolf Ahrenberg
9514ed5387 Added some new symbols and beautified the old ones.
Added audio track selection feature.
Added preliminary device switching feature (disabled at the moment).
2004-06-24 04:20:00 +03:00
31 changed files with 1383 additions and 267 deletions

53
HISTORY
View File

@@ -1,5 +1,6 @@
===================================
VDR Plugin 'femon' Revision History
-----------------------------------
===================================
2004-02-15: Version 0.0.1
@@ -58,7 +59,13 @@ VDR Plugin 'femon' Revision History
- Backported the "AC3 Stream Information" feature from version 0.1.3.
-------------------------
2004-09-11: Version 0.0.7
- Backported changes and fixes from version 0.1.6.
===================================
VDR Plugin 'femon' Revision History
===================================
2004-05-18: Version 0.1.0
@@ -81,3 +88,45 @@ VDR Plugin 'femon' Revision History
2004-06-11: Version 0.1.3
- Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch).
2004-06-24: Version 0.1.4
- Added some new symbols and beautified the old ones.
- Added audio track selection feature.
- Added preliminary device switching feature (disabled at the moment).
2004-08-18: Version 0.1.5
- Fixed OSDSTATUSWIN_XC define.
- Added preliminary NTSC support (make NTSC_SYSTEM=1 plugins).
- Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting this one).
- Added patches directory: CA system names by Lauri Tischler.
2004-09-11: Version 0.1.6
- Yet Another Minor Release.
- Integrated the CA system names patch: "Setup / Show CA System".
2004-11-28: Version 0.1.7
- Updated for vdr-1.3.17.
- Fixed receiver related crash (Thanks to Marco Schluessler).
2005-01-15: Version 0.7.7
- Updated for vdr-1.3.18.
- Added DEBUG mode (make DEBUG=1 plugins).
- OSD height is now user configurable.
- Added audio channel selection into Yellow key.
2005-01-23: Version 0.7.9
- Some minor cosmetic fixes.
2005-01-23: Version 0.8.0
- Updated for vdr-1.3.19.
2005-01-24: Version 0.8.1
- Added Estonian translations (Thanks to Arthur Konovalov).

View File

@@ -11,12 +11,12 @@ PLUGIN = femon
### 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).h | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The C++ compiler and options:
CXX ?= g++
CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual
CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual -fPIC
### The directory environment:
@@ -44,6 +44,10 @@ INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
ifdef NTSC_SYSTEM
DEFINES += -DNTSC_SYSTEM
endif
### The object files (add further files here):
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o

40
README
View File

@@ -18,7 +18,6 @@ DVB Frontend Status Monitor is a plugin that displays some signal information
parameters of the current tuned channel on OSD. You can zap through all your
channels and the plugin should be monitoring always the right frontend. The
transponder and stream information are also available in advanced display modes.
User can switch between different display modes by pressing 'OK' key.
The plugin is based on a neat console frontend status monitor application
called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further
@@ -31,8 +30,8 @@ Metzler Brothers.
Terminology:
--------------------------------------------------------------
|## Channel Name ############################# DD 16:9 PAL ##|
|[=====Signal Strength in % =============|=================]|
|## Channel Name ########################## [AR][VF][A/DD][D]|
|[=====Signal Strength in % ==============|=================]|
|[=====Signal-to-Noise Ratio in % ========|=================]|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
@@ -44,7 +43,7 @@ SNR - Signal-to-noise ratio
BER - Bit error rate
UNC - Uncorrected blocks
Video - Calculated video bitrate in Mbit/s
Audio - Calculated audio / AC-3 bitrate in kbit/s (only first PID)
Audio - Calculated audio / AC-3 bitrate in kbit/s
LOCK - Everything's working...
SIGNAL - Found something above the noise level
@@ -52,22 +51,45 @@ CARRIER - Found a DVB signal
VITERBI - FEC (forward error correction) is stable
SYNC - Found sync bytes
AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional)
VF - Video format: PAL/NTSC (optional)
A/DD - Audio (0..5) / AC-3 track (optional)
D - Device number: 0..3 (optional)
Controls:
ChanUp/ChanDn - Switch channel up/down
Up/Down - Switch channel up/down
0-9 - Select channel
Ok - Switch between display modes: basic, transponder, stream, AC-3
Green - Select next audio track
Yellow - Select audio channel: stereo, mono left, mono right
Back - Exit plugin
(Left/Right - Switch to next/previous device that provides the current channel)
Installation:
cd /put/your/path/here/VDR/PLUGINS/src
tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tar.gz
tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz
ln -s femon-X.Y.Z femon
cd /put/your/path/here/VDR
make
make plugins
./vdr -Pfemon
./vdr -P femon
Notes:
- The plugin supports only those DVB cards with _one_ frontend (do any cards
with multiple frontends even exist?), because I haven't yet figured howto do
it without patching the VDR core.
- Sometimes (read always) ttxtsubs plugin messes up the OSD - user should disable
ttxtsubs, but closing and reopening the femon plugin might help temporarily as
well. Btw., this same thing happens with OSDTeletext plugin too :)
- Disable the stream analyze to speed up heavy zapping sessions.
- The signal strength and signal-to-noise ratio values are comparable only
between the same brand/model frontends. Due to the lack of proper frontend
specifications those values cannot be calculated into any real units.
- If the OSD isn't visible, you've configured the OSD height too big or too
small. Please, try to adjust the variable on the setup page before writing
any bug reports.
- There's a shrinked default OSD height for NTSC users: make NTSC_SYSTEM=1
- The device switching feature is still non-functional.
"Femon - A real womon who lives according to her natural feminine inclinations."

10
femon.c
View File

@@ -12,7 +12,7 @@
#include "femonosd.h"
#include "femon.h"
#if VDRVERSNUM < 10307
#if VDRVERSNUM && VDRVERSNUM < 10319
#error "You don't exist! Go away!"
#endif
@@ -71,6 +71,8 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "SyslogOutput")) femonConfig.syslogoutput = atoi(Value);
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
else if (!strcasecmp(Name, "OSDHeight")) femonConfig.osdheight = atoi(Value);
else if (!strcasecmp(Name, "ShowCASystem")) femonConfig.showcasystem = atoi(Value);
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
@@ -101,6 +103,8 @@ void cMenuFemonSetup::Setup(void)
Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes")));
Add(new cMenuEditStraItem( tr("Default Display Mode"), &femonConfig.displaymode, modeMaxNumber, dispmodes));
Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top")));
Add(new cMenuEditIntItem( tr("Height"), &femonConfig.osdheight, 400, 500));
Add(new cMenuEditBoolItem( tr("Show CA System"), &femonConfig.showcasystem, tr("no"), tr("yes")));
Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50));
Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100));
Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100));
@@ -116,8 +120,10 @@ void cMenuFemonSetup::Store(void)
{
SetupStore("HideMenu", femonConfig.hidemenu);
SetupStore("SyslogOutput", femonConfig.syslogoutput);
SetupStore("Position", femonConfig.position);
SetupStore("DisplayMode", femonConfig.displaymode);
SetupStore("Position", femonConfig.position);
SetupStore("OSDHeight", femonConfig.osdheight);
SetupStore("ShowCASystem", femonConfig.showcasystem);
SetupStore("RedLimit", femonConfig.redlimit);
SetupStore("GreenLimit", femonConfig.greenlimit);
SetupStore("UpdateInterval", femonConfig.updateinterval);

View File

@@ -11,7 +11,7 @@
#include <vdr/plugin.h>
static const char *VERSION = "0.1.3";
static const char *VERSION = "0.8.1";
static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)";
static const char *MAINMENUENTRY = "Signal Information";

View File

@@ -21,4 +21,10 @@ cFemonConfig::cFemonConfig(void)
analyzestream = 1;
calcinterval = 20;
syslogoutput = 0;
showcasystem = 0;
#ifdef NTSC_SYSTEM
osdheight = 420;
#else
osdheight = 480;
#endif
}

View File

@@ -9,6 +9,12 @@
#ifndef __FEMONCFG_H
#define __FEMONCFG_H
#ifdef DEBUG
#define debug(x) (x);
#else
#define debug(x) ;
#endif
enum dispModes {
modeBasic,
modeTransponder,
@@ -30,6 +36,8 @@ public:
int analyzestream;
int calcinterval;
int syslogoutput;
int showcasystem;
int osdheight;
};
extern cFemonConfig femonConfig;

View File

@@ -27,6 +27,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"DVB Signaalmonitor (OSD)", // Eesti
"", // Dansk
},
{ "Signal Information", // English
"Signalinformationen", // Deutsch
@@ -46,6 +48,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Signaaliinfo", // Eesti
"", // Dansk
},
{ "Position", // English
"Position", // Deutsch
@@ -65,6 +69,29 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Positsioon", // Eesti
"", // Dansk
},
{ "Height", // English
"H<EFBFBD>he", // Deutsch
"", // Slovenski
"Altezza", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Korkeus", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"K<EFBFBD>rgus", // Eesti
"", // Dansk
},
{ "Default Display Mode", // English
"Standard Anzeigemodus", // Deutsch
@@ -84,6 +111,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Vaikimisi displei moodus", // Eesti
"", // Dansk
},
{ "basic", // English
"Standard", // Deutsch
@@ -103,6 +132,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"standard", // Eesti
"", // Dansk
},
{ "transponder", // English
"Transponder", // Deutsch
@@ -122,6 +153,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"", // Eesti
"transponder", // Dansk
},
{ "stream", // English
"Stream", // Deutsch
@@ -141,6 +174,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"striim", // Eesti
"", // Dansk
},
{ "Hide Mainmenu Entry", // English
"Hauptmen<EFBFBD>eintrag verstecken", // Deutsch
@@ -160,6 +195,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Peida valik peamen<65><6E>s", // Eesti
"", // Dansk
},
{ "OSD Update Interval [0.1s]", // English
"OSD Updateintervall [0.1s]", // Deutsch
@@ -179,6 +216,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Uuendusintervall [0,1s]", // Eesti
"", // Dansk
},
{ "Analyze Stream", // English
"Stream analysieren", // Deutsch
@@ -198,6 +237,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Striimi anal<61><6C>s", // Eesti
"", // Dansk
},
{ "Calculation Interval [0.1s]", // English
"Berechnungsintervall [0.1s]", // Deutsch
@@ -217,6 +258,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kalkulatsiooni intervall [0,1s]", // Eesti
"", // Dansk
},
{ "Red Limit [%]", // English
"Grenze Rot [%]", // Deutsch
@@ -236,6 +279,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Punase limiit [%]", // Eesti
"", // Dansk
},
{ "Green Limit [%]", // English
"Grenze Gr<47>n [%]", // Deutsch
@@ -255,6 +300,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Rohelise limiit [%]", // Eesti
"", // Dansk
},
{ "Transponder Information", // English
"Transponderinformation", // Deutsch
@@ -274,6 +321,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Transponderi info", // Eesti
"", // Dansk
},
{ "Satellite Card", // English
"Satellitenkarte", // Deutsch
@@ -293,6 +342,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Satelliidikaart", // Eesti
"", // Dansk
},
{ "Cable Card", // English
"Kabelkarte", // Deutsch
@@ -312,6 +363,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kaablikaart", // Eesti
"", // Dansk
},
{ "Terrestial Card", // English
"Terrestrische Karte", // Deutsch
@@ -331,6 +384,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Terrestiaalkaart", // Eesti
"", // Dansk
},
{ "Use Syslog Output", // English
"Benutze syslog Ausgabe", // Deutsch
@@ -350,6 +405,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> syslog", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kirjuta s<>steemilogisse", // Eesti
"", // Dansk
},
{ "LOCK", // English
"LOCK", // Deutsch
@@ -369,6 +426,8 @@ const tI18nPhrase Phrases[] = {
"LOCK", // Catal<61>
"<EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"LOCK", // Hrvatski (Croatian)
"LOCK", // Eesti
"LOCK", // Dansk
},
{ "SIGNAL", // English
"SIGNAL", // Deutsch
@@ -388,6 +447,8 @@ const tI18nPhrase Phrases[] = {
"SIGNAL", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"SIGNAL", // Hrvatski (Croatian)
"SIGNAL", // Eesti
"SIGNAL", // Dansk
},
{ "CARRIER", // English
"CARRIER", // Deutsch
@@ -407,6 +468,8 @@ const tI18nPhrase Phrases[] = {
"CARRIER", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"CARRIER", // Hrvatski (Croatian)
"CARRIER", // Eesti
"CARRIER", // Dansk
},
{ "VITERBI", // English
"VITERBI", // Deutsch
@@ -426,6 +489,8 @@ const tI18nPhrase Phrases[] = {
"VITERBI", // Catal<61>
"<EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"VITERBI", // Hrvatski (Croatian)
"VITERBI", // Eesti
"VITERBI", // Dansk
},
{ "SYNC", // English
"SYNC", // Deutsch
@@ -445,6 +510,8 @@ const tI18nPhrase Phrases[] = {
"SYNC", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"SYNC", // Hrvatski (Croatian)
"SYNC", // Eesti
"SYNC", // Dansk
},
{ "Audio", // English
"Audio", // Deutsch
@@ -464,6 +531,8 @@ const tI18nPhrase Phrases[] = {
"Audio", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Audio", // Hrvatski (Croatian)
"Audio", // Eesti
"Audio", // Dansk
},
{ "Video", // English
"Video", // Deutsch
@@ -483,6 +552,8 @@ const tI18nPhrase Phrases[] = {
"Video", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Video", // Hrvatski (Croatian)
"Video", // Eesti
"Video", // Dansk
},
{ "Auto", // English
"Auto", // Deutsch
@@ -502,6 +573,8 @@ const tI18nPhrase Phrases[] = {
"Auto", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Auto", // Hrvatski (Croatian)
"Auto", // Eesti
"Auto", // Dansk
},
{ "None", // English
"None", // Deutsch
@@ -521,6 +594,8 @@ const tI18nPhrase Phrases[] = {
"None", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"None", // Hrvatski (Croatian)
"Ei", // Eesti
"None", // Dansk
},
{ "Off", // English
"Off", // Deutsch
@@ -540,6 +615,8 @@ const tI18nPhrase Phrases[] = {
"Off", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Off", // Hrvatski (Croatian)
"V<EFBFBD>ljas", // Eesti
"Off", // Dansk
},
{ "On", // English
"On", // Deutsch
@@ -559,6 +636,8 @@ const tI18nPhrase Phrases[] = {
"On", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"On", // Hrvatski (Croatian)
"Sees", // Eesti
"On", // Dansk
},
{ "MHz", // English
"MHz", // Deutsch
@@ -578,6 +657,8 @@ const tI18nPhrase Phrases[] = {
"MHz", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"MHz", // Hrvatski (Croatian)
"MHz", // Eesti
"MHz", // Dansk
},
{ "Mbit/s", // English
"Mbit/s", // Deutsch
@@ -597,6 +678,8 @@ const tI18nPhrase Phrases[] = {
"Mbit/s", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Mbit/s", // Hrvatski (Croatian)
"Mbit/s", // Eesti
"Mbit/s", // Dansk
},
{ "kbit/s", // English
"kbit/s", // Deutsch
@@ -616,6 +699,8 @@ const tI18nPhrase Phrases[] = {
"kbit/s", // Catal<61>
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"kbit/s", // Hrvatski (Croatian)
"kbit/s", // Eesti
"kbit/s", // Dansk
},
{ "Stream Information", // English
"Streaminformation", // Deutsch
@@ -635,6 +720,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Striimi info", // Eesti
"", // Dansk
},
{ "MPEG Layer", // English
"MPEG Layer", // Deutsch
@@ -654,6 +741,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"MPEG tase", // Eesti
"", // Dansk
},
{ "Video Stream", // English
"Video Stream", // Deutsch
@@ -673,6 +762,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Videostriim", // Eesti
"", // Dansk
},
{ "Bitrate", // English
"Bitrate", // Deutsch
@@ -692,6 +783,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Bitikiirus", // Eesti
"", // Dansk
},
{ "Frame Rate", // English
"Bildrate", // Deutsch
@@ -711,6 +804,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kaadrisagedus", // Eesti
"", // Dansk
},
{ "Hz", // English
"Hz", // Deutsch
@@ -730,6 +825,8 @@ const tI18nPhrase Phrases[] = {
"Hz", // Catal<61>
"<EFBFBD><EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Hz", // Hrvatski (Croatian)
"Hz", // Eesti
"Hz", // Dansk
},
{ "Aspect Ratio", // English
"Seitenverh<EFBFBD>ltnis", // Deutsch
@@ -749,6 +846,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"K<EFBFBD>lgsuhe", // Eesti
"", // Dansk
},
{ "reserved", // English
"belegt", // Deutsch
@@ -768,6 +867,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"reserveeritud", // Eesti
"", // Dansk
},
{ "free", // English
"frei", // Deutsch
@@ -787,6 +888,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"vaba", // Eesti
"", // Dansk
},
{ "Video Format", // English
"Bildformat", // Deutsch
@@ -806,6 +909,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Videoformaat", // Eesti
"", // Dansk
},
{ "PAL", // English
"PAL", // Deutsch
@@ -825,6 +930,8 @@ const tI18nPhrase Phrases[] = {
"PAL", // Catal<61>
"PAL", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"PAL", // Hrvatski (Croatian)
"PAL", // Eesti
"PAL", // Dansk
},
{ "NTSC", // English
"NTSC", // Deutsch
@@ -844,6 +951,8 @@ const tI18nPhrase Phrases[] = {
"NTSC", // Catal<61>
"NTSC", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"NTSC", // Hrvatski (Croatian)
"NTSC", // Eesti
"NTSC", // Dansk
},
{ "unknown", // English
"unbekannt", // Deutsch
@@ -863,6 +972,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"tundmatu", // Eesti
"", // Dansk
},
{ "Resolution", // English
"Aufl<EFBFBD>sung", // Deutsch
@@ -882,6 +993,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Resolutsioon", // Eesti
"", // Dansk
},
{ "Audio Stream", // English
"Audio Stream", // Deutsch
@@ -901,6 +1014,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Audiostriim", // Eesti
"", // Dansk
},
{ "Sampling Frequency", // English
"Abtastrate", // Deutsch
@@ -920,6 +1035,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"S<EFBFBD>mplimissagedus", // Eesti
"", // Dansk
},
{ "kHz", // English
"kHz", // Deutsch
@@ -939,6 +1056,50 @@ const tI18nPhrase Phrases[] = {
"kHz", // Catal<61>
"ڳ<EFBFBD>", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"kHz", // Hrvatski (Croatian)
"kHz", // Eesti
"kHz", // Dansk
},
{ "Apid", // English
"Apid", // Deutsch
"Apid", // Slovenski
"Apid", // Italiano
"Apid", // Nederlands
"Apid", // Portugu<67>s
"Apid", // Fran<61>ais
"Apid", // Norsk
"<EFBFBD><EFBFBD>ni PID", // suomi
"Apid", // Polski
"Apid", // Espa<70>ol
"Apid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"Apid", // Svenska
"Apid", // Romaneste
"Apid", // Magyar
"Apid", // Catal<61>
"Apid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Apid", // Hrvatski (Croatian)
"Apid", // Eesti
"Apid", // Dansk
},
{ "Dpid", // English
"Dpid", // Deutsch
"Dpid", // Slovenski
"Dpid", // Italiano
"Dpid", // Nederlands
"Dpid", // Portugu<67>s
"Dpid", // Fran<61>ais
"Dpid", // Norsk
"Dolby PID", // suomi
"Dpid", // Polski
"Dpid", // Espa<70>ol
"Dpid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"Dpid", // Svenska
"Dpid", // Romaneste
"Dpid", // Magyar
"Dpid", // Catal<61>
"Dpid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Dpid", // Hrvatski (Croatian)
"Dpid", // Eesti
"Dpid", // Dansk
},
{ "Nid", // English
"Nid", // Deutsch
@@ -958,6 +1119,8 @@ const tI18nPhrase Phrases[] = {
"Nid", // Catal<61>
"Nid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Nid", // Hrvatski (Croatian)
"Nid", // Eesti
"Nid", // Dansk
},
{ "Tid", // English
"Tid", // Deutsch
@@ -977,6 +1140,8 @@ const tI18nPhrase Phrases[] = {
"Tid", // Catal<61>
"Tid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Tid", // Hrvatski (Croatian)
"Tid", // Eesti
"Tid", // Dansk
},
{ "Rid", // English
"Rid", // Deutsch
@@ -996,6 +1161,8 @@ const tI18nPhrase Phrases[] = {
"Rid", // Catal<61>
"Rid", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"Rid", // Hrvatski (Croatian)
"Rid", // Eesti
"Rid", // Dansk
},
{ "dB", // English
"dB", // Deutsch
@@ -1015,6 +1182,8 @@ const tI18nPhrase Phrases[] = {
"dB", // Catal<61>
"dB", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"dB", // Hrvatski (Croatian)
"dB", // Eesti
"dB", // Dansk
},
{ "not indicated", // English
"", // Deutsch
@@ -1034,6 +1203,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"m<EFBFBD>rkimata", // Eesti
"", // Dansk
},
{ "AC-3", // English
"AC-3", // Deutsch
@@ -1053,6 +1224,8 @@ const tI18nPhrase Phrases[] = {
"AC-3", // Catal<61>
"AC-3", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"AC-3", // Hrvatski (Croatian)
"AC-3", // Eesti
"AC-3", // Dansk
},
{ "AC-3 Stream", // English
"AC-3 Stream", // Deutsch
@@ -1072,6 +1245,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"AC-3 striim", // Eesti
"", // Dansk
},
{ "Frame Size", // English
"Frame Gr<47><72>e", // Deutsch
@@ -1091,6 +1266,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kaadri suurus", // Eesti
"", // Dansk
},
{ "Bit Stream Mode", // English
"Bitstream Modus", // Deutsch
@@ -1110,6 +1287,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Bitistriimi t<><74>p", // Eesti
"", // Dansk
},
{ "Audio Coding Mode", // English
"Audio Coding Modus", // Deutsch
@@ -1129,6 +1308,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Audiokodeering", // Eesti
"", // Dansk
},
{ "Center Mix Level", // English
"Center Mix Pegel", // Deutsch
@@ -1148,6 +1329,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Keskmise kanali tase", // Eesti
"", // Dansk
},
{ "Surround Mix Level", // English
"Surround Mix Pegel", // Deutsch
@@ -1167,6 +1350,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Surround kanali tase", // Eesti
"", // Dansk
},
{ "Dolby Surround Mode", // English
"Dolby Surround Modus", // Deutsch
@@ -1186,6 +1371,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Dolby Surround'i t<><74>p", // Eesti
"", // Dansk
},
{ "Low Frequency Effects", // English
"Tieft<EFBFBD>ner Effekte", // Deutsch
@@ -1205,6 +1392,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"LFE kanal", // Eesti
"", // Dansk
},
{ "Dialogue Normalization", // English
"Dialog Normalisierung", // Deutsch
@@ -1224,6 +1413,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Dialoogi normalisatsioon", // Eesti
"", // Dansk
},
{ "Complete Main (CM)", // English
"Complete Main (CM)", // Deutsch
@@ -1243,6 +1434,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"CM", // Eesti
"", // Dansk
},
{ "Music and Effects (ME)", // English
"Musik und Effekte (ME)", // Deutsch
@@ -1262,6 +1455,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Muusika ja efektid (ME)", // Eesti
"", // Dansk
},
{ "Visually Impaired (VI)", // English
"Sehbehindert (VI)", // Deutsch
@@ -1281,6 +1476,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Vaegn<EFBFBD>gemine (VE)", // Eesti
"", // Dansk
},
{ "Hearing Impaired (HI)", // English
"H<EFBFBD>rbehindert (HI)", // Deutsch
@@ -1300,6 +1497,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Vaegkuulmine (HI)", // Eesti
"", // Dansk
},
{ "Dialogue (D)", // English
"Dialog (D)", // Deutsch
@@ -1319,6 +1518,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Dialoog (D)", // Eesti
"", // Dansk
},
{ "Commentary (C)", // English
"Kommentar (C)", // Deutsch
@@ -1338,6 +1539,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kommentaar (C)", // Eesti
"", // Dansk
},
{ "Emergency (E)", // English
"Notfall (E)", // Deutsch
@@ -1357,6 +1560,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"H<EFBFBD>dateade (E)", // Eesti
"", // Dansk
},
{ "Voice Over (VO)", // English
"<EFBFBD>berlagerte Stimme (VO)", // Deutsch
@@ -1376,6 +1581,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Pealer<EFBFBD><EFBFBD>kimine (VO)", // Eesti
"", // Dansk
},
{ "Karaoke", // English
"Karaoke", // Deutsch
@@ -1395,6 +1602,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Karaoke", // Eesti
"", // Dansk
},
{ "Ch1", // English "Channel 1"
"Kan1", // Deutsch
@@ -1414,6 +1623,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kan. 1", // Eesti
"", // Dansk
},
{ "Ch2", // English "Channel 2"
"Kan2", // Deutsch
@@ -1433,6 +1644,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Kan. 2", // Eesti
"", // Dansk
},
{ "C", // English "Center"
"C", // Deutsch
@@ -1452,6 +1665,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"K", // Eesti
"", // Dansk
},
{ "L", // English "Left"
"L", // Deutsch
@@ -1471,6 +1686,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"L", // Eesti
"", // Dansk
},
{ "R", // English "Right"
"R", // Deutsch
@@ -1490,6 +1707,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"R", // Eesti
"", // Dansk
},
{ "S", // English "Surround"
"S", // Deutsch
@@ -1509,6 +1728,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"S", // Eesti
"", // Dansk
},
{ "SL", // English "Surround Left"
"SL", // Deutsch
@@ -1528,6 +1749,8 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"SL", // Eesti
"", // Dansk
},
{ "SR", // English "Surround Right"
"SR", // Deutsch
@@ -1547,6 +1770,281 @@ const tI18nPhrase Phrases[] = {
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"SR", // Eesti
"", // Dansk
},
{ "Show CA System", // English
"CA System anzeigen", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"N<EFBFBD>yt<EFBFBD> salausj<73>rjestelm<6C>", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"N<EFBFBD>ita CA s<>steemi", // Eesti
"", // Dansk
},
{ "Fixed", // English
"Fest", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"kiinte<EFBFBD>", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Fikseeritud", // Eesti
"", // Dansk
},
{ "Free to Air", // English
"Free to Air", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"salaamaton", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"FTA", // Eesti
"", // Dansk
},
{ "SECA/Mediaguard", // English
"SECA/Mediaguard", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"SECA/Mediaguard", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"SECA/Mediaguard", // Eesti
"", // Dansk
},
{ "Viaccess", // English
"Viaccess", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Viaccess", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Viaccess", // Eesti
"", // Dansk
},
{ "Irdeto", // English
"Irdeto", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Irdeto", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Irdeto", // Eesti
"", // Dansk
},
{ "NDS/Videoguard", // English
"NDS/Videoguard", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"NDS/Videoguard", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"NDS/Videoguard", // Eesti
"", // Dansk
},
{ "Conax", // English
"Conax", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"Conax", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"Conax", // Eesti
"", // Dansk
},
{ "CryptoWorks", // English
"CryptoWorks", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"CryptoWorks", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"CryptoWorks", // Eesti
"", // Dansk
},
{ "PowerVu", // English
"PowerVu", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"PowerVu", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"PowerVu", // Eesti
"", // Dansk
},
{ "BetaCrypt", // English
"BetaCrypt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"BetaCrypt", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"BetaCrypt", // Eesti
"", // Dansk
},
{ "NagraVision", // English
"NagraVision", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"NagraVision", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"NagraVision", // Eesti
"", // Dansk
},
{ "SkyCrypt", // English
"SkyCrypt", // Deutsch
"", // Slovenski
"", // Italiano
"", // Nederlands
"", // Portugu<67>s
"", // Fran<61>ais
"", // Norsk
"SkyCrypt", // suomi
"", // Polski
"", // Espa<70>ol
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Greek)
"", // Svenska
"", // Romaneste
"", // Magyar
"", // Catal<61>
"", // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Russian)
"", // Hrvatski (Croatian)
"SkyCrypt", // Eesti
"", // Dansk
},
{ NULL }
};

View File

@@ -12,6 +12,16 @@
#include "femonreceiver.h"
#include "femonosd.h"
#include "symbols/device.xpm"
#include "symbols/stereo.xpm"
#include "symbols/monoleft.xpm"
#include "symbols/monoright.xpm"
#include "symbols/zero.xpm"
#include "symbols/one.xpm"
#include "symbols/two.xpm"
#include "symbols/three.xpm"
#include "symbols/four.xpm"
#include "symbols/five.xpm"
#include "symbols/ar11.xpm"
#include "symbols/ar169.xpm"
#include "symbols/ar2211.xpm"
@@ -25,23 +35,31 @@
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
#define CHANNELINPUT_TIMEOUT 1000
#define SCREENWIDTH 720 // in pixels
#define SCREENHEIGHT 576 // in pixels
#define OSDWIDTH 600 // in pixels
#define OSDHEIGHT 480 // in pixels
#define OSDHEIGHT femonConfig.osdheight // in pixels
#define OSDWIDTH 600 // in pixels
#define OSDINFOHEIGHT (m_Font->Height() * 11) // in pixels (11 rows)
#define OSDSTATUSHEIGHT (m_Font->Height() * 6) // in pixels (6 rows)
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
#define OSDINFOWIN_X(col) ((col == 4) ? 470 : (col == 3) ? 300 : (col==2) ? 180 : 15)
#define OSDINFOWIN_X(col) ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 15)
#define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset))
#define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col==2) ? 70 : 15)
#define OSDSTATUSWIN_XC(col,txt) (((col - 1) * SCREENWIDTH / 6) + ((SCREENWIDTH / 6 - m_Font->Width(txt)) / 2))
#define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col == 2) ? 70 : 15)
#define OSDSTATUSWIN_XC(col,txt) (((col - 1) * OSDWIDTH / 5) + ((OSDWIDTH / 5 - m_Font->Width(txt)) / 2))
#define BARWIDTH(x) (OSDWIDTH * x / 100)
#define SPACING 5
#define clrBackground clrGray50 // this should be tied somehow into current theme
cBitmap cFemonOsd::bmDevice(device_xpm);
cBitmap cFemonOsd::bmStereo(stereo_xpm);
cBitmap cFemonOsd::bmMonoLeft(monoleft_xpm);
cBitmap cFemonOsd::bmMonoRight(monoright_xpm);
cBitmap cFemonOsd::bmZero(zero_xpm);
cBitmap cFemonOsd::bmOne(one_xpm);
cBitmap cFemonOsd::bmTwo(two_xpm);
cBitmap cFemonOsd::bmThree(three_xpm);
cBitmap cFemonOsd::bmFour(four_xpm);
cBitmap cFemonOsd::bmFive(five_xpm);
cBitmap cFemonOsd::bmAspectRatio_1_1(ar11_xpm);
cBitmap cFemonOsd::bmAspectRatio_16_9(ar169_xpm);
cBitmap cFemonOsd::bmAspectRatio_2_21_1(ar2211_xpm);
@@ -55,26 +73,33 @@ cBitmap cFemonOsd::bmDD51(dolbydigital51_xpm);
cFemonOsd::cFemonOsd(void)
:cOsdObject(true), cThread("femon osd")
{
//printf("cFemonOsd::cFemonOsd()\n");
debug(printf("cFemonOsd::cFemonOsd()\n"));
m_Osd = NULL;
m_Receiver = NULL;
m_Frontend = -1;
m_Active = false;
m_Number = 0;
m_OldNumber = 0;
m_InputTime = 0;
m_Signal = 0;
m_SNR = 0;
m_BER = 0;
m_UNC = 0;
m_DisplayMode = femonConfig.displaymode;
m_Font = cFont::GetFont(fontSml);
m_InputTime.Set(0);
m_Mutex = new cMutex();
if (Setup.UseSmallFont == 0) {
// Dirty hack to force the small fonts...
Setup.UseSmallFont = 1;
m_Font = cFont::GetFont(fontSml);
Setup.UseSmallFont = 0;
}
else
m_Font = cFont::GetFont(fontSml);
}
cFemonOsd::~cFemonOsd(void)
{
//printf("cFemonOsd::~cFemonOsd()\n");
debug(printf("cFemonOsd::~cFemonOsd()\n"));
if (m_Active) {
m_Active = false;
Cancel(3);
@@ -88,22 +113,131 @@ cFemonOsd::~cFemonOsd(void)
void cFemonOsd::DrawStatusWindow(void)
{
cMutexLock lock(m_Mutex);
//printf("cFemonOsd::DrawStatusWindow()\n");
debug(printf("cFemonOsd::DrawStatusWindow()\n"));
char buf[128];
int snr = m_SNR / 655;
int signal = m_Signal / 655;
int offset = 0;
int x = OSDWIDTH - SPACING;
int x = OSDWIDTH;
int y = 0;
int value = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd) {
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrBackground);
snprintf(buf, sizeof(buf), "%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->Name());
snprintf(buf, sizeof(buf), "%d%s %s (%s)", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true), channel->Provider());
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+m_Font->Height()-1), clrWhite);
m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), buf, clrBlack, clrWhite, m_Font);
if (m_Receiver) {
int value = m_Receiver->VideoFormat();
value = cDevice::ActualDevice()->CardIndex();
if (value == 1) {
x -= bmOne.Width() + SPACING;
y = (m_Font->Height() - bmOne.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmOne, clrBlack, clrWhite);
}
else if (value == 2) {
x -= bmTwo.Width() + SPACING;
y = (m_Font->Height() - bmTwo.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmTwo, clrBlack, clrWhite);
}
else if (value == 3) {
x -= bmThree.Width() + SPACING;
y = (m_Font->Height() - bmThree.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmThree, clrBlack, clrWhite);
}
else {
x -= bmZero.Width() + SPACING;
y = (m_Font->Height() - bmZero.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmZero, clrBlack, clrWhite);
}
x -= bmDevice.Width();
y = (m_Font->Height() - bmDevice.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDevice, clrBlack, clrWhite);
if (IS_AUDIO_TRACK(track)) {
value = int(track - ttAudioFirst);
if (value == 1) {
x -= bmOne.Width() + SPACING;
y = (m_Font->Height() - bmOne.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmOne, clrBlack, clrWhite);
}
else if (value == 2) {
x -= bmTwo.Width() + SPACING;
y = (m_Font->Height() - bmTwo.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmTwo, clrBlack, clrWhite);
}
else if (value == 3) {
x -= bmThree.Width() + SPACING;
y = (m_Font->Height() - bmThree.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmThree, clrBlack, clrWhite);
}
else if (value == 4) {
x -= bmFour.Width() + SPACING;
y = (m_Font->Height() - bmFour.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmFour, clrBlack, clrWhite);
}
else if (value == 5) {
x -= bmFive.Width() + SPACING;
y = (m_Font->Height() - bmFive.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmFive, clrBlack, clrWhite);
}
else {
x -= bmZero.Width() + SPACING;
y = (m_Font->Height() - bmZero.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmZero, clrBlack, clrWhite);
}
value = cDevice::PrimaryDevice()->GetAudioChannel();
if (value == 1) {
x -= bmMonoLeft.Width();
y = (m_Font->Height() - bmMonoLeft.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmMonoLeft, clrBlack, clrWhite);
}
else if (value == 2) {
x -= bmMonoRight.Width();
y = (m_Font->Height() - bmMonoRight.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmMonoRight, clrBlack, clrWhite);
}
else {
x -= bmStereo.Width();
y = (m_Font->Height() - bmStereo.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmStereo, clrBlack, clrWhite);
}
}
else if (m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) {
if (m_Receiver->AC3_5_1()) {
x -= bmDD51.Width() + SPACING;
y = (m_Font->Height() - bmDD51.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD51, clrBlack, clrWhite);
}
else if (m_Receiver->AC3_2_0()) {
x -= bmDD20.Width() + SPACING;
y = (m_Font->Height() - bmDD20.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD20, clrBlack, clrWhite);
}
else {
x -= bmDD.Width() + SPACING;
y = (m_Font->Height() - bmDD.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD, clrBlack, clrWhite);
}
}
value = m_Receiver->VideoFormat();
if (value == VF_PAL) {
x -= bmPAL.Width() + SPACING;
y = (m_Font->Height() - bmPAL.Height()) / 2;
@@ -141,26 +275,6 @@ void cFemonOsd::DrawStatusWindow(void)
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_2_21_1, clrBlack, clrWhite);
}
if (m_Receiver && m_Receiver->AC3Valid()) {
if (m_Receiver->AC3_5_1()) {
x -= bmDD51.Width() + SPACING;
y = (m_Font->Height() - bmDD51.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD51, clrBlack, clrWhite);
}
else if (m_Receiver->AC3_2_0()) {
x -= bmDD20.Width() + SPACING;
y = (m_Font->Height() - bmDD20.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD20, clrBlack, clrWhite);
}
else {
x -= bmDD.Width() + SPACING;
y = (m_Font->Height() - bmDD.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD, clrBlack, clrWhite);
}
}
}
offset += m_Font->Height();
if (signal > 0) {
@@ -207,9 +321,9 @@ void cFemonOsd::DrawStatusWindow(void)
m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%08x", m_UNC);
m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%s:", (m_Receiver && m_Receiver->AC3Valid()) ? tr("AC-3") : tr("Audio"));
snprintf(buf, sizeof(buf), "%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio"));
m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.0f %s", m_Receiver->AC3Valid() ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate(), tr("kbit/s"));
if (m_Receiver) snprintf(buf, sizeof(buf), "%.0f %s", (m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate(), tr("kbit/s"));
else snprintf(buf, sizeof(buf), "--- %s", tr("kbit/s"));
m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
offset += m_Font->Height();
@@ -225,13 +339,14 @@ void cFemonOsd::DrawStatusWindow(void)
void cFemonOsd::DrawInfoWindow(void)
{
cMutexLock lock(m_Mutex);
//printf("cFemonOsd::DrawInfoWindow()\n");
debug(printf("cFemonOsd::DrawInfoWindow()\n"));
char buf[128];
char buf2[20];
int offset = 0;
int value = 0;
double dvalue = 0.0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Osd) {
if (m_DisplayMode == modeTransponder) {
@@ -246,19 +361,93 @@ void cFemonOsd::DrawInfoWindow(void)
snprintf(buf, sizeof(buf), "%d", channel->Ppid());
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid1"), clrWhite, clrBackground, m_Font);
value = channel->Apid2();
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Apid1(), value);
else snprintf(buf, sizeof(buf), "%d", channel->Apid1());
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Apid(0));
value = 1;
while (channel->Apid(value) && (value < MAXAPIDS)) {
snprintf(buf2, sizeof(buf2), ", %d", channel->Apid(value++));
strncat(buf, buf2, sizeof(buf));
}
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid1"), clrWhite, clrBackground, m_Font);
value = channel->Dpid2();
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Dpid1(), value);
else snprintf(buf, sizeof(buf), "%d", channel->Dpid1());
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Dpid(0));
value = 1;
while (channel->Dpid(value) && (value < MAXDPIDS)) {
snprintf(buf2, sizeof(buf2), ", %d", channel->Dpid(value++));
strncat(buf, buf2, sizeof(buf));
}
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Ca());
value = channel->Ca();
if (femonConfig.showcasystem) {
/* http://www.dvb.org/index.php?id=174 */
switch (value) {
case 0x0000:
/* Reserved */
snprintf(buf, sizeof(buf), "%s", tr("Free to Air"));
break;
case 0x0001 ... 0x00FF:
/* Standardized systems */
snprintf(buf, sizeof(buf), "%s", tr("Fixed"));
break;
case 0x0100 ... 0x01FF:
/* Canal Plus */
snprintf(buf, sizeof(buf), "%s", tr("SECA/Mediaguard"));
break;
case 0x0500 ... 0x05FF:
/* France Telecom */
snprintf(buf, sizeof(buf), "%s", tr("Viaccess"));
break;
case 0x0600 ... 0x06FF:
/* Irdeto */
snprintf(buf, sizeof(buf), "%s", tr("Irdeto"));
break;
case 0x0900 ... 0x09FF:
/* News Datacom */
snprintf(buf, sizeof(buf), "%s", tr("NDS/Videoguard"));
break;
case 0x0B00 ... 0x0BFF:
/* Norwegian Telekom */
snprintf(buf, sizeof(buf), "%s", tr("Conax"));
break;
case 0x0D00 ... 0x0DFF:
/* Philips */
snprintf(buf, sizeof(buf), "%s", tr("CryptoWorks"));
break;
case 0x0E00 ... 0x0EFF:
/* Scientific Atlanta */
snprintf(buf, sizeof(buf), "%s", tr("PowerVu"));
break;
case 0x1200 ... 0x12FF:
/* BellVu Express */
snprintf(buf, sizeof(buf), "%s", tr("NagraVision"));
break;
case 0x1700 ... 0x17FF:
/* BetaTechnik */
snprintf(buf, sizeof(buf), "%s", tr("BetaCrypt"));
break;
case 0x1800 ... 0x18FF:
/* Kudelski SA */
snprintf(buf, sizeof(buf), "%s", tr("NagraVision"));
break;
case 0x4A60 ... 0x4A6F:
/* @Sky */
snprintf(buf, sizeof(buf), "%s", tr("SkyCrypt"));
break;
default:
snprintf(buf, sizeof(buf), "%X", value);
break;
}
}
else {
snprintf(buf, sizeof(buf), "%X", value);
value = 1;
while (channel->Ca(value) && (value < MAXCAIDS)) {
snprintf(buf2, sizeof(buf2), ", %X", channel->Ca(value++));
strncat(buf, buf2, sizeof(buf));
}
}
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Tpid());
@@ -289,7 +478,7 @@ void cFemonOsd::DrawInfoWindow(void)
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source()));
snprintf(buf, sizeof(buf), "%s", *cSource::ToString(channel->Source()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_Font);
@@ -330,7 +519,7 @@ void cFemonOsd::DrawInfoWindow(void)
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source()));
snprintf(buf, sizeof(buf), "%s", *cSource::ToString(channel->Source()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_Font);
@@ -500,7 +689,7 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), clrYellow, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "#%d", channel->Apid1());
snprintf(buf, sizeof(buf), "#%d %s", IS_AUDIO_TRACK(track) ? channel->Apid(int(track - ttAudioFirst)) : channel->Apid(0), IS_AUDIO_TRACK(track) ? channel->Alang(int(track - ttAudioFirst)) : channel->Alang(0));
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += m_Font->Height();
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_Font);
@@ -531,10 +720,10 @@ void cFemonOsd::DrawInfoWindow(void)
else if (m_DisplayMode == modeAC3) {
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground);
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+m_Font->Height()-1), clrWhite);
snprintf(buf, sizeof(buf), "%s - %s #%d", tr("Stream Information"), tr("AC-3 Stream"), channel->Dpid1());
snprintf(buf, sizeof(buf), "%s - %s #%d %s", tr("Stream Information"), tr("AC-3 Stream"), IS_DOLBY_TRACK(track) ? channel->Dpid(int(track - ttDolbyFirst)) : channel->Dpid(0), IS_DOLBY_TRACK(track) ? channel->Dlang(int(track - ttDolbyFirst)) : channel->Dlang(0));
m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrBackground, clrWhite, m_Font);
offset += m_Font->Height();
if (m_Receiver && m_Receiver->AC3Valid()) {
if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) {
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%.0f %s (%0.f %s)", m_Receiver->AC3StreamBitrate(), tr("kbit/s"), m_Receiver->AC3Bitrate(), tr("kbit/s"));
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
@@ -629,9 +818,11 @@ void cFemonOsd::DrawInfoWindow(void)
void cFemonOsd::Action(void)
{
//printf("cFemonOsd::Action()\n");
debug(printf("cFemonOsd::Action()\n"));
cTimeMs t;
m_Active = true;
while (m_Active) {
t.Set(0);
if (m_Frontend != -1) {
CHECK(ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus));
CHECK(ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal));
@@ -644,14 +835,17 @@ void cFemonOsd::Action(void)
isyslog("Card #%d (%s) STR: %04x SNR: %04x BER: %08x UNC: %08x |%c|%c|%c|%c|%c|", cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name, m_Signal, m_SNR, m_BER, m_UNC, (m_FrontendStatus & FE_HAS_LOCK) ? 'L' : ' ', (m_FrontendStatus & FE_HAS_SIGNAL) ? 'S' : ' ', (m_FrontendStatus & FE_HAS_CARRIER) ? 'C' : ' ', (m_FrontendStatus & FE_HAS_VITERBI) ? 'V' : ' ', (m_FrontendStatus & FE_HAS_SYNC) ? 'Z' : ' ');
}
}
usleep(100000L * femonConfig.updateinterval);
cCondWait::SleepMs(100 * femonConfig.updateinterval - t.Elapsed());
}
}
void cFemonOsd::Show(void)
{
//printf("cFemonOsd::Show()\n");
debug(printf("cFemonOsd::Show()\n"));
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
char *dev = NULL;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
asprintf(&dev, FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
free(dev);
@@ -684,7 +878,9 @@ void cFemonOsd::Show(void)
delete m_Receiver;
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), channel->Apid1(), channel->Dpid1());
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), apid, dpid);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
Start();
@@ -693,8 +889,11 @@ void cFemonOsd::Show(void)
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
{
//printf("cFemonOsd::ChannelSwitch()\n");
debug(printf("cFemonOsd::ChannelSwitch()\n"));
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
char *dev = NULL;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber)
return;
close(m_Frontend);
@@ -716,7 +915,26 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
delete m_Receiver;
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), channel->Apid1(), channel->Dpid1());
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), apid, dpid);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
{
debug(printf("cFemonOsd::SetAudioTrack()\n"));
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Receiver)
delete m_Receiver;
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), apid, dpid);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -724,9 +942,8 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
eOSState cFemonOsd::ProcessKey(eKeys Key)
{
eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) {
switch (Key & ~k_Repeat) {
switch (Key) {
case k0:
if ((m_Number == 0) && (m_OldNumber != 0)) {
m_Number = m_OldNumber;
@@ -741,7 +958,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
if (m_Number > 0) {
DrawStatusWindow();
cChannel *ch = Channels.GetByNumber(m_Number);
m_InputTime = time_ms();
m_InputTime.Set(0);
// Lets see if there can be any useful further input:
int n = ch ? m_Number * 10 : 0;
while (ch && (ch = Channels.Next(ch)) != NULL) {
@@ -765,6 +982,66 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
break;
case kBack:
return osEnd;
case kGreen:
{
eTrackType types[ttMaxTrackTypes];
eTrackType CurrentAudioTrack = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
int numTracks = 0;
int oldTrack = 0;
int track = 0;
for (int i = ttAudioFirst; i <= ttDolbyLast; i++) {
const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(i));
if (TrackId && TrackId->id) {
types[numTracks] = eTrackType(i);
if (i == CurrentAudioTrack)
track = numTracks;
numTracks++;
}
}
oldTrack = track;
if (++track >= numTracks)
track = 0;
if (track != oldTrack) {
cDevice::PrimaryDevice()->SetCurrentAudioTrack(types[track]);
Setup.CurrentDolby = IS_DOLBY_TRACK(types[track]);
}
}
break;
case kYellow:
if (IS_AUDIO_TRACK(cDevice::PrimaryDevice()->GetCurrentAudioTrack())) {
int audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
int oldAudioChannel = audioChannel;
if (++audioChannel > 2)
audioChannel = 0;
if (audioChannel != oldAudioChannel) {
cDevice::PrimaryDevice()->SetAudioChannel(audioChannel);
}
}
break;
case kRight:
case kLeft:
{
int device = cDevice::ActualDevice()->DeviceNumber();
if (device >= 0) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
if (NORMALKEY(Key) == kBlue) {
if (++device >= cDevice::NumDevices()) device = 0;
}
else {
if (--device < 0) device = cDevice::NumDevices() - 1;
}
if (cDevice::GetDevice(device)->ProvidesChannel(channel)) {
//cStatus::MsgChannelSwitch(cDevice::GetDevice(device), 0);
//implement some tuning mechanism here
//cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apid(0), channel->Apid(1), channel->Dpid(0), channel->Dpid(1)));
//cStatus::MsgChannelSwitch(cDevice::GetDevice(device), channel->Number());
break;
}
}
}
}
break;
case kUp|k_Repeat:
case kUp:
case kDown|k_Repeat:
@@ -774,21 +1051,21 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
m_Number = 0;
break;
case kNone:
if (m_Number && (time_ms() - m_InputTime > CHANNELINPUT_TIMEOUT)) {
if (m_Number && (m_InputTime.Elapsed() > CHANNELINPUT_TIMEOUT)) {
if (Channels.GetByNumber(m_Number)) {
m_OldNumber = cDevice::CurrentChannel();
Channels.SwitchTo(m_Number);
m_Number = 0;
}
else {
m_InputTime = time_ms();
m_InputTime.Set(0);
m_Number = 0;
}
}
break;
case kOk:
// toggle between display modes
if (++m_DisplayMode == modeAC3 && !Channels.GetByNumber(cDevice::CurrentChannel())->Dpid1()) m_DisplayMode++;
if (++m_DisplayMode == modeAC3 && !Channels.GetByNumber(cDevice::CurrentChannel())->Dpid(0)) m_DisplayMode++;
if (m_DisplayMode >= modeMaxNumber) m_DisplayMode = 0;
DrawInfoWindow();
break;

View File

@@ -16,6 +16,8 @@
#include <vdr/thread.h>
#include <vdr/status.h>
#include <vdr/channels.h>
#include <vdr/transfer.h>
#include <vdr/tools.h>
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private:
@@ -26,7 +28,6 @@ private:
struct dvb_frontend_info m_FrontendInfo;
int m_Number;
int m_OldNumber;
int m_InputTime;
uint16_t m_SNR;
uint16_t m_Signal;
uint32_t m_BER;
@@ -34,14 +35,18 @@ private:
fe_status_t m_FrontendStatus;
int m_DisplayMode;
const cFont *m_Font;
cTimeMs m_InputTime;
cMutex* m_Mutex;
static cBitmap bmDD, bmDD20, bmDD51, bmPAL, bmNTSC, bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3;
static cBitmap bmStereo, bmMonoLeft, bmMonoRight, bmDD, bmDD20, bmDD51;
static cBitmap bmZero, bmDevice, bmPAL, bmNTSC, bmOne, bmTwo, bmThree, bmFour, bmFive;
static cBitmap bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3;
void DrawStatusWindow(void);
void DrawInfoWindow(void);
protected:
virtual void Action(void);
virtual void ChannelSwitch(const cDevice * device, int channelNumber);
virtual void SetAudioTrack(int Index, const char * const *Tracks);
public:
cFemonOsd(void);

View File

@@ -7,6 +7,7 @@
*/
#include <unistd.h>
#include <vdr/tools.h>
#include "femoncfg.h"
#include "femonreceiver.h"
@@ -16,14 +17,14 @@
#define PAYLOAD 0x10
#define PTS_DTS_FLAGS 0xC0
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid)
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid), cThread("femon receiver")
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid[], int Dpid[])
:cReceiver(Ca, -1, Vpid, Apid, Dpid, NULL), cThread("femon receiver")
{
//printf("cFemonReceiver::cFemonReceiver()\n");
debug(printf("cFemonReceiver::cFemonReceiver()\n"));
m_Active = false;
m_VideoPid = Vpid;
m_AudioPid = Apid;
m_AC3Pid = Dpid;
m_AudioPid = Apid[0];
m_AC3Pid = Dpid[0];
m_VideoValid = false;
m_VideoPacketCount = 0;
m_VideoHorizontalSize = 0;
@@ -57,7 +58,8 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid)
cFemonReceiver::~cFemonReceiver(void)
{
//printf("cFemonReceiver::~cFemonReceiver()\n");
debug(printf("cFemonReceiver::~cFemonReceiver()\n"));
Detach();
if (m_Active) {
m_Active = false;
Cancel(0);
@@ -67,7 +69,7 @@ cFemonReceiver::~cFemonReceiver(void)
/* The following function originates from libdvbmpeg: */
void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
{
//printf("cFemonReceiver::GetVideoInfo()\n");
debug(printf("cFemonReceiver::GetVideoInfo()\n"));
uint8_t *headr;
int found = 0;
int c = 0;
@@ -160,7 +162,7 @@ static unsigned int samplerates[4] =
/* The following function originates from libdvbmpeg: */
void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
{
//printf("cFemonReceiver::GetAudioInfo()\n");
debug(printf("cFemonReceiver::GetAudioInfo()\n"));
uint8_t *headr;
int found = 0;
int c = 0;
@@ -252,13 +254,20 @@ void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count)
void cFemonReceiver::Activate(bool On)
{
//printf("cFemonReceiver::Activate()\n");
Start();
debug(printf("cFemonReceiver::Activate()\n"));
if (On) {
if (!m_Active)
Start();
}
else if (m_Active) {
m_Active = false;
Cancel(0);
}
}
void cFemonReceiver::Receive(uchar *Data, int Length)
{
//printf("cFemonReceiver::Receive()\n");
debug(printf("cFemonReceiver::Receive()\n"));
// TS packet length: TS_SIZE
if (Length == TS_SIZE) {
int pid = ((Data[1] & 0x1f) << 8) | (Data[2]);
@@ -301,9 +310,11 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
void cFemonReceiver::Action(void)
{
//printf("cFemonReceiver::Action()\n");
debug(printf("cFemonReceiver::Action()\n"));
cTimeMs t;
m_Active = true;
while (m_Active) {
t.Set(0);
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
m_VideoBitrate = (8.0 * 184.0 * m_VideoPacketCount) / (femonConfig.calcinterval * 100000.0);
m_VideoPacketCount = 0;
@@ -311,6 +322,6 @@ void cFemonReceiver::Action(void)
m_AudioPacketCount = 0;
m_AC3Bitrate = (8.0 * 184.0 * m_AC3PacketCount) / (femonConfig.calcinterval * 100.0);
m_AC3PacketCount = 0;
usleep(100000L * femonConfig.calcinterval);
cCondWait::SleepMs(100 * femonConfig.calcinterval - t.Elapsed());
}
}

View File

@@ -95,7 +95,7 @@ protected:
virtual void Action(void);
public:
cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid);
cFemonReceiver(int Ca, int Vpid, int Apid[], int Dpid[]);
virtual ~cFemonReceiver();
bool VideoValid(void) { return m_VideoValid; }; // boolean

View File

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

View File

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

View File

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

View File

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

23
symbols/device.xpm Normal file
View File

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

View File

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

View File

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

View File

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

23
symbols/five.xpm Normal file
View File

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

23
symbols/four.xpm Normal file
View File

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

23
symbols/monoleft.xpm Normal file
View File

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

23
symbols/monoright.xpm Normal file
View File

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

View File

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

23
symbols/one.xpm Normal file
View File

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

View File

@@ -1,23 +1,23 @@
/* XPM */
static char * pal_xpm[] = {
"30 18 2 1",
"18 18 2 1",
". c #FFFFFF",
"+ c #000000",
"..............................",
"..............................",
"..+++++++....+++++...++.......",
"..+++..+++..+++++++..++.......",
"..++....++..++...++..++.......",
"..++....++.+++...+++.++.......",
"..++....++.++.....++.++.......",
"..++....++.++.....++.++.......",
"..++....++.++.....++.++.......",
"..+++..+++.+++++++++.++.......",
"..+++++++..+++++++++.++.......",
"..++.......++.....++.++.......",
"..++.......++.....++.++.......",
"..++.......++.....++.++.......",
"..++.......++.....++.+++++++..",
"..++.......++.....++.+++++++..",
"..............................",
".............................."};
"++++++++++++++++++",
"+................+",
"+...++++++++.....+",
"+...+++++++++....+",
"+...++.....+++...+",
"+...++......++...+",
"+...++......++...+",
"+...++.....+++...+",
"+...+++++++++....+",
"+...++++++++.....+",
"+...++...........+",
"+...++...........+",
"+...++...........+",
"+...++...........+",
"+...++...........+",
"+...++...........+",
"+................+",
"++++++++++++++++++"};

23
symbols/stereo.xpm Normal file
View File

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

23
symbols/three.xpm Normal file
View File

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

23
symbols/two.xpm Normal file
View File

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

23
symbols/zero.xpm Normal file
View File

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