From b08205607c429c58d0bbfbd991fa7ff64858d736 Mon Sep 17 00:00:00 2001 From: Rolf Ahrenberg Date: Mon, 31 May 2004 04:20:00 +0300 Subject: [PATCH] Backported "stream information" feature (from version 0.1.1). --- HISTORY | 22 +- README | 23 +-- femon.c | 36 ++-- femon.h | 3 +- femoncfg.c | 2 +- femoncfg.h | 9 +- femoni18n.c | 532 +++++++++++++++++++++++++++++++++++++++++------- femonosd.c | 414 ++++++++++++++++++++++--------------- femonosd.h | 1 + femonreceiver.c | 162 ++++++++++++++- femonreceiver.h | 27 ++- 11 files changed, 951 insertions(+), 280 deletions(-) diff --git a/HISTORY b/HISTORY index 3b21050..ccef7fc 100644 --- a/HISTORY +++ b/HISTORY @@ -43,5 +43,23 @@ VDR Plugin 'femon' Revision History 2004-04-04: Version 0.0.3c -- Fixed minor bitrate calculation errors -- Added russian translation (Thanks to Vyacheslav Dikonov) +- Fixed minor bitrate calculation errors. +- Added russian translation (Thanks to Vyacheslav Dikonov). + +2004-05-31: Version 0.0.4 + +- Backported "stream information" feature (from version 0.1.1). + +------------------------- + +2004-05-18: Version 0.1.0 + +- Updated for vdr-1.3.7 and removed compability with older versions. + +2004-05-30: Version 0.1.1 + +- Added "Stream Information" display mode. + Toggle between different modes with 'OK' key: + .-> basic -> transponder -> stream -. + `-----------------------------------´ +- Added missing german translations (Thanks to Peter Marquardt). diff --git a/README b/README index 660b978..1d4c54d 100644 --- a/README +++ b/README @@ -12,34 +12,31 @@ Requirements: Ph.D. in Astro Physics and preferably a six-pack waiting in a fridge. Never trust a Klingon. "Qu'vaD lI' De'vam". Beam me up, Scotty! +You're number six! I'm number two. Description: 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 information is also available in advanced display mode. User can -switch between simple and advanced display modes by pressing 'OK' key. +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 information). The other parts of plugin code are borrowed from the -excellent 'OSD Picture-In-Picture' plugin by Sascha Volkenandt -and Andreas Regel . The bitrate calculation algorithm -originates from the 'dvbstream' application by Dave Chapman . +excellent 'OSD Picture-In-Picture' plugin by Sascha Volkenandt and Andreas Regel. +The bitrate calculation algorithm originates from the 'dvbstream' application by +Dave Chapman and the stream information routines from the 'libdvb' library by +Metzler Brothers. -Shortcomings / Todo list / Notes: +Shortcomings / Todo list / Important Notes: -- The current version is a kind of Proof In Concept to replace the old 'tech - patch', and it's now eating many unnecessary cpu clock cycles - this will be - fixed later... - 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 :) -- The plugin GUI is designed for _small fonts_, so stable vdr-1.2.6 users should - consider a small font patch (e.g. ElchiAIO4a) to maximize the visual effect :) -- The stream information is still missing. -- Disable bitrate calculation to speed up heavy zapping sessions. +- Disable the stream analyze to speed up heavy zapping sessions. +- If you're using VDR version 1.3.6 or older, you'll have to stick with femon-0.0.4! diff --git a/femon.c b/femon.c index 3d35388..ec38154 100644 --- a/femon.c +++ b/femon.c @@ -12,6 +12,10 @@ #include "femonosd.h" #include "femon.h" +#if VDRVERSNUM >= 10307 +#error "You don't exist! Go away!" +#endif + cPluginFemon::cPluginFemon(void) { // Initialize any member variables here. @@ -70,16 +74,20 @@ bool cPluginFemon::SetupParse(const char *Name, const char *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); - else if (!strcasecmp(Name, "ShowBitRate")) femonConfig.showbitrate = atoi(Value); + else if (!strcasecmp(Name, "AnalStream")) femonConfig.analyzestream = atoi(Value); else if (!strcasecmp(Name, "CalcInterval")) femonConfig.calcinterval = atoi(Value); else return false; + if (femonConfig.displaymode < 0 || femonConfig.displaymode >= modeMaxNumber) femonConfig.displaymode = 0; return true; } cMenuFemonSetup::cMenuFemonSetup(void) { + dispmodes[0] = tr("basic"); + dispmodes[1] = tr("transponder"); + dispmodes[2] = tr("stream"); Setup(); } @@ -88,16 +96,16 @@ void cMenuFemonSetup::Setup(void) int current = Current(); Clear(); - Add(new cMenuEditBoolItem( tr("Hide Mainmenu Entry"), &femonConfig.hidemenu, tr("no"), tr("yes"))); - Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes"))); - Add(new cMenuEditBoolItem( tr("Default Display Mode"), &femonConfig.displaymode, tr("simple"), tr("advanced"))); - Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top"))); - Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50)); - Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100)); - Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100)); - Add(new cMenuEditBoolItem( tr("Bitrate Calculation"), &femonConfig.showbitrate, tr("no"), tr("yes"))); - if (femonConfig.showbitrate) - Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100)); + Add(new cMenuEditBoolItem( tr("Hide Mainmenu Entry"), &femonConfig.hidemenu, tr("no"), tr("yes"))); + Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes"))); + Add(new cMenuEditStraItem( tr("Default Display Mode"), &femonConfig.displaymode, modeMaxNumber, dispmodes)); + Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top"))); + Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50)); + Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100)); + Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100)); + Add(new cMenuEditBoolItem( tr("Analyze Stream"), &femonConfig.analyzestream, tr("no"), tr("yes"))); + if (femonConfig.analyzestream) + Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100)); SetCurrent(Get(current)); Display(); @@ -112,17 +120,17 @@ void cMenuFemonSetup::Store(void) SetupStore("RedLimit", femonConfig.redlimit); SetupStore("GreenLimit", femonConfig.greenlimit); SetupStore("UpdateInterval", femonConfig.updateinterval); - SetupStore("ShowBitRate", femonConfig.showbitrate); + SetupStore("AnalStream", femonConfig.analyzestream); SetupStore("CalcInterval", femonConfig.calcinterval); } eOSState cMenuFemonSetup::ProcessKey(eKeys Key) { - int oldShowbitrate = femonConfig.showbitrate; + int oldAnalyzestream = femonConfig.analyzestream; eOSState state = cMenuSetupPage::ProcessKey(Key); - if (Key != kNone && (femonConfig.showbitrate != oldShowbitrate)) { + if (Key != kNone && (femonConfig.analyzestream != oldAnalyzestream)) { Setup(); } diff --git a/femon.h b/femon.h index c301719..9f53d1c 100644 --- a/femon.h +++ b/femon.h @@ -11,7 +11,7 @@ #include -static const char *VERSION = "0.0.3c"; +static const char *VERSION = "0.0.4"; static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)"; static const char *MAINMENUENTRY = "Signal Information"; @@ -36,6 +36,7 @@ public: class cMenuFemonSetup : public cMenuSetupPage { private: + const char *dispmodes[modeMaxNumber]; virtual void Setup(void); protected: virtual eOSState ProcessKey(eKeys Key); diff --git a/femoncfg.c b/femoncfg.c index 5d7f40c..3d0b7d8 100644 --- a/femoncfg.c +++ b/femoncfg.c @@ -18,7 +18,7 @@ cFemonConfig::cFemonConfig(void) redlimit = 33; greenlimit = 66; updateinterval = 5; - showbitrate = 1; + analyzestream = 1; calcinterval = 20; syslogoutput = 0; } diff --git a/femoncfg.h b/femoncfg.h index 39efeaf..b8a9407 100644 --- a/femoncfg.h +++ b/femoncfg.h @@ -9,6 +9,13 @@ #ifndef __FEMONCFG_H #define __FEMONCFG_H +enum dispModes { + modeBasic, + modeTransponder, + modeStream, + modeMaxNumber + }; + struct cFemonConfig { public: @@ -19,7 +26,7 @@ public: int redlimit; int greenlimit; int updateinterval; - int showbitrate; + int analyzestream; int calcinterval; int syslogoutput; }; diff --git a/femoni18n.c b/femoni18n.c index 758ac06..8a8b9f6 100644 --- a/femoni18n.c +++ b/femoni18n.c @@ -25,8 +25,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "¼ÞÝØâÞà ÚÐçÕáâÒÐ áØÓÝÐÛÐ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "¼ÞÝØâÞà ÚÐçÕáâÒÐ áØÓÝÐÛÐ", // ÀãááÚØÙ (Russian) #endif }, { "Signal Information", // English @@ -45,8 +45,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÁØÓÝÐÛ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÁØÓÝÐÛ", // ÀãááÚØÙ (Russian) #endif }, { "Position", // English @@ -65,8 +65,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÀÐ×ÜÕéÕÝØÕ ÞÚÝÐ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÀÐ×ÜÕéÕÝØÕ ÞÚÝÐ", // ÀãááÚØÙ (Russian) #endif }, { "Default Display Mode", // English @@ -85,19 +85,19 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÀÕÖØÜ ßÞ ãÜÞÛçÐÝØî" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÀÕÖØÜ ßÞ ãÜÞÛçÐÝØî", // ÀãááÚØÙ (Russian) #endif }, - { "simple", // English - "einfach", // Deutsch + { "basic", // English + "Standard", // Deutsch "", // Slovenski - "semplice", // Italiano + "", // Italiano "", // Nederlands "", // Português "", // Français "", // Norsk - "suppea", // suomi + "perus", // suomi "", // Polski "", // Español "", // ÅëëçíéêÜ (Greek) @@ -105,19 +105,19 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ßàÞáâÞÙ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) #endif }, - { "advanced", // English - "fortgeschritten", // Deutsch + { "transponder", // English + "Transponder", // Deutsch "", // Slovenski - "avanzato", // Italiano + "", // Italiano "", // Nederlands "", // Português "", // Français "", // Norsk - "laaja", // suomi + "transponderi", // suomi "", // Polski "", // Español "", // ÅëëçíéêÜ (Greek) @@ -125,8 +125,28 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "àÐáèØàÕÝÝëÙ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "stream", // English + "Stream", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "lähete", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) #endif }, { "Hide Mainmenu Entry", // English @@ -145,8 +165,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÁÚàëâì ÚÞÜÐÝÔã Ò ÓÛÐÒÝÞÜ ÜÕÝî" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÁÚàëâì ÚÞÜÐÝÔã Ò ÓÛÐÒÝÞÜ ÜÕÝî", // ÀãááÚØÙ (Russian) #endif }, { "OSD Update Interval [0.1s]", // English @@ -165,19 +185,19 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÇÐáâÞâÐ ÞÑÝÞÒÛÕÝØï (0,1 áÕÚ)" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÇÐáâÞâÐ ÞÑÝÞÒÛÕÝØï (0,1 áÕÚ)", // ÀãááÚØÙ (Russian) #endif }, - { "Bitrate Calculation", // English - "Bitratenberechnung", // Deutsch + { "Analyze Stream", // English + "Stream analysieren", // Deutsch "", // Slovenski - "Calcolo Bitrate", // Italiano + "", // Italiano "", // Nederlands "", // Português "", // Français "", // Norsk - "Siirtonopeuden laskenta", // suomi + "Lähetteen analysointi", // suomi "", // Polski "", // Español "", // ÅëëçíéêÜ (Greek) @@ -185,8 +205,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÀÐáçñâ áÚÞàÞáâØ ßÞâÞÚÐ ÔÐÝÝëå" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÀÐáçñâ áÚÞàÞáâØ ßÞâÞÚÐ ÔÐÝÝëå", // ÀãááÚØÙ (Russian) #endif }, { "Calculation Interval [0.1s]", // English @@ -205,8 +225,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÇÐáâÞâÐ ßÕàÕáçñâÐ (0,1 áÕÚ)" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÇÐáâÞâÐ ßÕàÕáçñâÐ (0,1 áÕÚ)", // ÀãááÚØÙ (Russian) #endif }, { "Red Limit [%]", // English @@ -225,8 +245,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ºàÐáÝÐï ×ÞÝÐ áÛÐÑÞÓÞ áØÓÝÐÛÐ ÔÞ (%)" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ºàÐáÝÐï ×ÞÝÐ áÛÐÑÞÓÞ áØÓÝÐÛÐ ÔÞ (%)", // ÀãááÚØÙ (Russian) #endif }, { "Green Limit [%]", // English @@ -245,8 +265,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "·ÕÛñÝÐï ×ÞÝÐ áØÛìÝÞÓÞ áØÓÝÐÛÐ Þâ (%)" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "·ÕÛñÝÐï ×ÞÝÐ áØÛìÝÞÓÞ áØÓÝÐÛÐ Þâ (%)", // ÀãááÚØÙ (Russian) #endif }, { "Transponder Information", // English @@ -265,8 +285,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "ÁÒÕÔÕÝØï Þ ÚÐÝÐÛÕ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÁÒÕÔÕÝØï Þ ÚÐÝÐÛÕ", // ÀãááÚØÙ (Russian) #endif }, { "Satellite Card", // English @@ -285,8 +305,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "¿ÛÐâÐ áßãâÝØÚÞÒÞÓÞ ßàØñÜÐ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "¿ÛÐâÐ áßãâÝØÚÞÒÞÓÞ ßàØñÜÐ", // ÀãááÚØÙ (Russian) #endif }, { "Cable Card", // English @@ -305,8 +325,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "¿ÛÐâÐ ÚÐÑÕÛìÝÞÓÞ ßàØñÜÐ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "¿ÛÐâÐ ÚÐÑÕÛìÝÞÓÞ ßàØñÜÐ", // ÀãááÚØÙ (Russian) #endif }, { "Terrestial Card", // English @@ -325,8 +345,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "¿ÛÐâÐ íäØàÝÞÓÞ ßàØñÜÐ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "¿ÛÐâÐ íäØàÝÞÓÞ ßàØñÜÐ", // ÀãááÚØÙ (Russian) #endif }, { "Use Syslog Output", // English @@ -345,8 +365,8 @@ const tI18nPhrase Phrases[] = { "", // Romaneste "", // Magyar "", // Català -#if VDRVERSNUM >= 10300 - "¸áßÞÛì×ÞÒÐâì áÛãÖÑã syslog" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "¸áßÞÛì×ÞÒÐâì áÛãÖÑã syslog", // ÀãááÚØÙ (Russian) #endif }, { "LOCK", // English @@ -365,8 +385,8 @@ const tI18nPhrase Phrases[] = { "LOCK", // Romaneste "LOCK", // Magyar "LOCK", // Català -#if VDRVERSNUM >= 10300 - "·°Å²°Â" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "·°Å²°Â", // ÀãááÚØÙ (Russian) #endif }, { "SIGNAL", // English @@ -385,8 +405,8 @@ const tI18nPhrase Phrases[] = { "SIGNAL", // Romaneste "SIGNAL", // Magyar "SIGNAL", // Català -#if VDRVERSNUM >= 10300 - "Á¸³½°»" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "Á¸³½°»", // ÀãááÚØÙ (Russian) #endif }, { "CARRIER", // English @@ -405,8 +425,8 @@ const tI18nPhrase Phrases[] = { "CARRIER", // Romaneste "CARRIER", // Magyar "CARRIER", // Català -#if VDRVERSNUM >= 10300 - "½µÁÃɰÏ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "½µÁÃɰÏ", // ÀãááÚØÙ (Russian) #endif }, { "VITERBI", // English @@ -425,8 +445,8 @@ const tI18nPhrase Phrases[] = { "VITERBI", // Romaneste "VITERBI", // Magyar "VITERBI", // Català -#if VDRVERSNUM >= 10300 - "²¸ÂµÀ±¸" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "²¸ÂµÀ±¸", // ÀãááÚØÙ (Russian) #endif }, { "SYNC", // English @@ -445,8 +465,8 @@ const tI18nPhrase Phrases[] = { "SYNC", // Romaneste "SYNC", // Magyar "SYNC", // Català -#if VDRVERSNUM >= 10300 - "Á¸½ÅÀ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "Á¸½ÅÀ", // ÀãááÚØÙ (Russian) #endif }, { "Audio", // English @@ -457,7 +477,7 @@ const tI18nPhrase Phrases[] = { "Audio", // Português "Audio", // Français "Audio", // Norsk - "Audio", // suomi + "Ääni", // suomi "Audio", // Polski "Audio", // Español "Audio", // ÅëëçíéêÜ (Greek) @@ -465,8 +485,8 @@ const tI18nPhrase Phrases[] = { "Audio", // Romaneste "Audio", // Magyar "Audio", // Català -#if VDRVERSNUM >= 10300 - "°ãÔØÞ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "°ãÔØÞ", // ÀãááÚØÙ (Russian) #endif }, { "Video", // English @@ -477,7 +497,7 @@ const tI18nPhrase Phrases[] = { "Video", // Português "Video", // Français "Video", // Norsk - "Video", // suomi + "Kuva", // suomi "Video", // Polski "Video", // Español "Video", // ÅëëçíéêÜ (Greek) @@ -485,8 +505,8 @@ const tI18nPhrase Phrases[] = { "Video", // Romaneste "Video", // Magyar "Video", // Català -#if VDRVERSNUM >= 10300 - "²ØÔÕÞ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "²ØÔÕÞ", // ÀãááÚØÙ (Russian) #endif }, { "Auto", // English @@ -505,8 +525,8 @@ const tI18nPhrase Phrases[] = { "Auto", // Romaneste "Auto", // Magyar "Auto", // Català -#if VDRVERSNUM >= 10300 - "ÐÒâÞ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÐÒâÞ", // ÀãááÚØÙ (Russian) #endif }, { "None", // English @@ -525,8 +545,8 @@ const tI18nPhrase Phrases[] = { "None", // Romaneste "None", // Magyar "None", // Català -#if VDRVERSNUM >= 10300 - "ÝÕâ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÝÕâ", // ÀãááÚØÙ (Russian) #endif }, { "Off", // English @@ -545,8 +565,8 @@ const tI18nPhrase Phrases[] = { "Off", // Romaneste "Off", // Magyar "Off", // Català -#if VDRVERSNUM >= 10300 - "ÒëÚÛ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÒëÚÛ", // ÀãááÚØÙ (Russian) #endif }, { "On", // English @@ -565,8 +585,8 @@ const tI18nPhrase Phrases[] = { "On", // Romaneste "On", // Magyar "On", // Català -#if VDRVERSNUM >= 10300 - "ÒÚÛ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÒÚÛ", // ÀãááÚØÙ (Russian) #endif }, { "MHz", // English @@ -585,8 +605,8 @@ const tI18nPhrase Phrases[] = { "MHz", // Romaneste "MHz", // Magyar "MHz", // Català -#if VDRVERSNUM >= 10300 - "¼³æ" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "¼³æ", // ÀãááÚØÙ (Russian) #endif }, { "Mbit/s", // English @@ -605,8 +625,8 @@ const tI18nPhrase Phrases[] = { "Mbit/s", // Romaneste "Mbit/s", // Magyar "Mbit/s", // Català -#if VDRVERSNUM >= 10300 - "¼ÑØâ/á" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "¼ÑØâ/á", // ÀãááÚØÙ (Russian) #endif }, { "kbit/s", // English @@ -625,8 +645,368 @@ const tI18nPhrase Phrases[] = { "kbit/s", // Romaneste "kbit/s", // Magyar "kbit/s", // Català -#if VDRVERSNUM >= 10300 - "ÚÑØâ/á" // ÀãááÚØÙ (Russian) +#if VDRVERSNUM >= 10302 + "ÚÑØâ/á", // ÀãááÚØÙ (Russian) +#endif + }, + { "Stream Information", // English + "Streaminformation", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Lähetteen tiedot", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "MPEG Layer", // English + "MPEG Layer", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "MPEG-taso", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Video Stream", // English + "Video Stream", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Kuvaraita", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Bitrate", // English + "Bitrate", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Bittinopeus", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Frame Rate", // English + "Bildrate", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Ruudunpäivitysnopeus", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Hz", // English + "Hz", // Deutsch + "Hz", // Slovenski + "Hz", // Italiano + "Hz", // Nederlands + "Hz", // Português + "Hz", // Français + "Hz", // Norsk + "Hz", // suomi + "Hz", // Polski + "Hz", // Español + "Hz", // ÅëëçíéêÜ (Greek) + "Hz", // Svenska + "Hz", // Romaneste + "Hz", // Magyar + "Hz", // Català +#if VDRVERSNUM >= 10302 + "Hz", // ÀãááÚØÙ (Russian) +#endif + }, + { "Aspect Ratio", // English + "Seitenverhältnis", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Kuvasuhde", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "reserved", // English + "belegt", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "varattu", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "free", // English + "frei", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "vapaa", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Video Format", // English + "Bildformat", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Kuvaformaatti", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "PAL", // English + "PAL", // Deutsch + "PAL", // Slovenski + "PAL", // Italiano + "PAL", // Nederlands + "PAL", // Português + "PAL", // Français + "PAL", // Norsk + "PAL", // suomi + "PAL", // Polski + "PAL", // Español + "PAL", // ÅëëçíéêÜ (Greek) + "PAL", // Svenska + "PAL", // Romaneste + "PAL", // Magyar + "PAL", // Català +#if VDRVERSNUM >= 10302 + "PAL", // ÀãááÚØÙ (Russian) +#endif + }, + { "NTSC", // English + "NTSC", // Deutsch + "NTSC", // Slovenski + "NTSC", // Italiano + "NTSC", // Nederlands + "NTSC", // Português + "NTSC", // Français + "NTSC", // Norsk + "NTSC", // suomi + "NTSC", // Polski + "NTSC", // Español + "NTSC", // ÅëëçíéêÜ (Greek) + "NTSC", // Svenska + "NTSC", // Romaneste + "NTSC", // Magyar + "NTSC", // Català +#if VDRVERSNUM >= 10302 + "NTSC", // ÀãááÚØÙ (Russian) +#endif + }, + { "unknown", // English + "unbekannt", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "tuntematon", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Resolution", // English + "Auflösung", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Resoluutio", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Audio Stream", // English + "Audio Stream", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Ääniraita", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Sampling Frequency", // English + "Abtastrate", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Näytteenottotaajuus", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "kHz", // English + "kHz", // Deutsch + "kHz", // Slovenski + "kHz", // Italiano + "kHz", // Nederlands + "kHz", // Português + "kHz", // Français + "kHz", // Norsk + "kHz", // suomi + "kHz", // Polski + "kHz", // Español + "kHz", // ÅëëçíéêÜ (Greek) + "kHz", // Svenska + "kHz", // Romaneste + "kHz", // Magyar + "kHz", // Català +#if VDRVERSNUM >= 10302 + "kHz", // ÀãááÚØÙ (Russian) +#endif + }, + { "MPEG Layer", // English + "MPEG Layer", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "MPEG-kerros", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) #endif }, { NULL } diff --git a/femonosd.c b/femonosd.c index 2746125..803592a 100644 --- a/femonosd.c +++ b/femonosd.c @@ -16,32 +16,22 @@ #warning You should consider using the small fonts! #endif -#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" -#define CHANNELINPUT_TIMEOUT 1000 +#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" +#define CHANNELINPUT_TIMEOUT 1000 -#define SCREENWIDTH 720 -#define SCREENHEIGHT 576 +#define SCREENWIDTH 720 // in pixels +#define SCREENHEIGHT 576 // in pixels +#define OSDWIDTH 600 // in pixels +#define OSDHEIGHT 480 // in pixels +#define OSDINFOHEIGHT ((cOsd::LineHeight() - 2) * 11) // in pixels (11 rows) +#define OSDSTATUSHEIGHT ((cOsd::LineHeight() - 2) * 6) // in pixels (6 rows) -#define OSDWIDTH 46 -#define OSDINFOHEIGHT 11 -#define OSDGAPHEIGHT 1 -#define OSDSTATUSHEIGHT 6 - -#define OSDSTATUSCOL1 1 -#define OSDSTATUSCOL2 10 -#define OSDSTATUSCOL3 17 -#define OSDSTATUSCOL4 32 - -#define OSDSTATUSLOCK 1 -#define OSDSTATUSSIGN 9 -#define OSDSTATUSCARR 19 -#define OSDSTATUSVITE 30 -#define OSDSTATUSSYNC 40 - -#define OSDINFOLCOL1 1 -#define OSDINFOLCOL2 14 -#define OSDINFOLCOL3 23 -#define OSDINFOLCOL4 36 +#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 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 - cOsd::WidthInCells(txt) * cOsd::CellWidth()) / 2)) +#define BARWIDTH(x) (OSDWIDTH * x / 100) cFemonOsd::cFemonOsd(void) #if VDRVERSNUM >= 10300 @@ -52,8 +42,6 @@ cFemonOsd::cFemonOsd(void) { //printf("cFemonOsd::cFemonOsd()\n"); m_Osd = NULL; - m_InfoWindow = -1; - m_StatusWindow = -1; m_Receiver = NULL; m_Frontend = -1; m_Active = false; @@ -65,6 +53,11 @@ cFemonOsd::cFemonOsd(void) m_BER = 0; m_UNC = 0; m_DisplayMode = femonConfig.displaymode; +#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) + m_Font = fontSml; +#else + m_Font = fontOsd; +#endif m_Mutex = new cMutex(); } @@ -88,65 +81,73 @@ void cFemonOsd::DrawStatusWindow(void) char buf[128]; int snr = m_SNR / 655; int signal = m_Signal / 655; - int lines = 0; + int offset = 0; cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (m_Osd) { #if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) - eDvbFont OldFont = m_Osd->SetFont(fontSml); + eDvbFont OldFont = m_Osd->SetFont(m_Font); #endif - m_Osd->Clear(m_StatusWindow); + m_Osd->Fill(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrBackground, m_StatusWindow); snprintf(buf, sizeof(buf), "%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->Name()); - m_Osd->Fill(0, femonConfig.position ? 0 : (OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight(), OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? cOsd::LineHeight() - 1 : (OSDINFOHEIGHT + OSDGAPHEIGHT + 1) * cOsd::LineHeight() - 1, clrWhite, m_StatusWindow); - m_Osd->Text(OSDSTATUSCOL1 * cOsd::CellWidth(), femonConfig.position ? 0 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrBlack, clrWhite, m_StatusWindow); - lines++; + m_Osd->Fill(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-1), clrWhite, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), buf, clrBlack, clrWhite, m_StatusWindow); + offset += cOsd::LineHeight(); if (signal > 0) { - signal = (OSDWIDTH * cOsd::CellWidth()) * signal / 100; - m_Osd->Fill(0, femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), signal), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrRed, m_StatusWindow); - if (signal > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100)) { - m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), signal), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrYellow, m_StatusWindow); + signal = BARWIDTH(signal); + m_Osd->Fill(0, OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.redlimit), signal), OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrRed, m_StatusWindow); + if (signal > BARWIDTH(femonConfig.redlimit)) { + m_Osd->Fill(BARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min((OSDWIDTH * femonConfig.greenlimit / 100), signal), OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrYellow, m_StatusWindow); } - if (signal > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100)) { - m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, signal, femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrGreen, m_StatusWindow); + if (signal > BARWIDTH(femonConfig.greenlimit)) { + m_Osd->Fill(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), signal, OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrGreen, m_StatusWindow); } } - lines++; + offset += cOsd::LineHeight() - 2; if (snr > 0) { - snr = (OSDWIDTH * cOsd::CellWidth()) * snr / 100; - m_Osd->Fill(0, femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), snr), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrRed, m_StatusWindow); - if (snr > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100)) { - m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.redlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, min(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), snr), femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrYellow, m_StatusWindow); + snr = BARWIDTH(snr); + m_Osd->Fill(0, OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.redlimit), snr), OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrRed, m_StatusWindow); + if (snr > BARWIDTH(femonConfig.redlimit)) { + m_Osd->Fill(BARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.greenlimit), snr), OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrYellow, m_StatusWindow); } - if (snr > ((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100)) { - m_Osd->Fill(((OSDWIDTH * cOsd::CellWidth()) * femonConfig.greenlimit / 100), femonConfig.position ? lines * cOsd::LineHeight() + 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() + 3, snr, femonConfig.position ? (lines + 1) * cOsd::LineHeight() - 3 : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 3, clrGreen, m_StatusWindow); + if (snr > BARWIDTH(femonConfig.greenlimit)) { + m_Osd->Fill(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), snr, OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-3), clrGreen, m_StatusWindow); } } - lines++; - snprintf(buf, sizeof(buf), "STR: %04x", m_Signal); - m_Osd->Text(OSDSTATUSCOL1 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", clrWhite, clrBackground, m_StatusWindow); + snprintf(buf, sizeof(buf), "%04x", m_Signal); + m_Osd->Text(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); snprintf(buf, sizeof(buf), "(%2d%%)", m_Signal / 655); - m_Osd->Text(OSDSTATUSCOL2 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite /*signal < femonConfig.redlimit ? clrRed : signal < femonConfig.greenlimit ? clrYellow : clrGreen*/, clrBackground, m_StatusWindow); - snprintf(buf, sizeof(buf), "BER: %08x", m_BER); - m_Osd->Text(OSDSTATUSCOL3 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); - if (m_Receiver) snprintf(buf, sizeof(buf), "%s: %.2f %s", tr("Video"), m_Receiver->VideoBitrate(), tr("Mbit/s")); - else snprintf(buf, sizeof(buf), "%s: --- %s", tr("Video"), tr("Mbit/s")); - m_Osd->Text(OSDSTATUSCOL4 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); - lines++; - snprintf(buf, sizeof(buf), "SNR: %04x", m_SNR); - m_Osd->Text(OSDSTATUSCOL1 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "BER:", clrWhite, clrBackground, m_StatusWindow); + snprintf(buf, sizeof(buf), "%08x", m_BER); + m_Osd->Text(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + snprintf(buf, sizeof(buf), "%s:", tr("Video")); + m_Osd->Text(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoBitrate(), tr("Mbit/s")); + else snprintf(buf, sizeof(buf), "--- %s", tr("Mbit/s")); + m_Osd->Text(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", clrWhite, clrBackground, m_StatusWindow); + snprintf(buf, sizeof(buf), "%04x", m_SNR); + m_Osd->Text(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); snprintf(buf, sizeof(buf), "(%2d%%)", m_SNR / 655); - m_Osd->Text(OSDSTATUSCOL2 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite /*snr < femonConfig.redlimit ? clrRed : snr < femonConfig.greenlimit ? clrYellow : clrGreen*/, clrBackground, m_StatusWindow); - snprintf(buf, sizeof(buf), "UNC: %08x", m_UNC); - m_Osd->Text(OSDSTATUSCOL3 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); - if (m_Receiver) snprintf(buf, sizeof(buf), "%s: %.0f %s", tr("Audio"), m_Receiver->AudioBitrate(), tr("kbit/s")); - else snprintf(buf, sizeof(buf), "%s: --- %s", tr("Audio"), tr("kbit/s")); - m_Osd->Text(OSDSTATUSCOL4 * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), buf, clrWhite, clrBackground, m_StatusWindow); - lines++; - m_Osd->Text(OSDSTATUSLOCK * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("LOCK"), (m_FrontendStatus & FE_HAS_LOCK) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); - m_Osd->Text(OSDSTATUSSIGN * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("SIGNAL"), (m_FrontendStatus & FE_HAS_SIGNAL) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); - m_Osd->Text(OSDSTATUSCARR * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("CARRIER"),(m_FrontendStatus & FE_HAS_CARRIER)? clrYellow : clrBlack, clrBackground, m_StatusWindow); - m_Osd->Text(OSDSTATUSVITE * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("VITERBI"),(m_FrontendStatus & FE_HAS_VITERBI)? clrYellow : clrBlack, clrBackground, m_StatusWindow); - m_Osd->Text(OSDSTATUSSYNC * cOsd::CellWidth(), femonConfig.position ? lines * cOsd::LineHeight() : (OSDINFOHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight(), tr("SYNC"), (m_FrontendStatus & FE_HAS_SYNC) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", clrWhite, clrBackground, m_StatusWindow); + snprintf(buf, sizeof(buf), "%08x", m_UNC); + m_Osd->Text(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + snprintf(buf, sizeof(buf), "%s:", tr("Audio")); + m_Osd->Text(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + if (m_Receiver) snprintf(buf, sizeof(buf), "%.0f %s", m_Receiver->AudioBitrate(), tr("kbit/s")); + else snprintf(buf, sizeof(buf), "--- %s", tr("kbit/s")); + m_Osd->Text(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDSTATUSWIN_XC(1,tr("LOCK")), OSDSTATUSWIN_Y(offset), tr("LOCK"), (m_FrontendStatus & FE_HAS_LOCK) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_XC(2,tr("SIGNAL")), OSDSTATUSWIN_Y(offset), tr("SIGNAL"), (m_FrontendStatus & FE_HAS_SIGNAL) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_XC(3,tr("CARRIER")), OSDSTATUSWIN_Y(offset), tr("CARRIER"),(m_FrontendStatus & FE_HAS_CARRIER)? clrYellow : clrBlack, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_XC(4,tr("VITERBI")), OSDSTATUSWIN_Y(offset), tr("VITERBI"),(m_FrontendStatus & FE_HAS_VITERBI)? clrYellow : clrBlack, clrBackground, m_StatusWindow); + m_Osd->Text(OSDSTATUSWIN_XC(5,tr("SYNC")), OSDSTATUSWIN_Y(offset), tr("SYNC"), (m_FrontendStatus & FE_HAS_SYNC) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); #if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) m_Osd->SetFont(OldFont); #endif @@ -160,88 +161,89 @@ void cFemonOsd::DrawInfoWindow(void) //printf("cFemonOsd::DrawInfoWindow()\n"); char buf[128]; char buf2[20]; - int lines = 0; + int offset = 0; int value = 0; + double dvalue = 0.0; cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (m_Osd) { - if (m_DisplayMode) { #if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) - eDvbFont OldFont = m_Osd->SetFont(fontSml); + eDvbFont OldFont = m_Osd->SetFont(m_Font); #endif - m_Osd->Clear(m_InfoWindow); - m_Osd->Fill(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines + 1) * cOsd::LineHeight() - 1 : (lines + 1) * cOsd::LineHeight() - 1, clrWhite, m_InfoWindow); - m_Osd->Text( OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines, tr("Transponder Information"), clrBackground, clrWhite, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Vpid"), clrWhite, clrBackground, m_InfoWindow); + if (m_DisplayMode == modeTransponder) { + m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground, m_InfoWindow); + m_Osd->Fill(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+cOsd::LineHeight()-1), clrWhite, m_InfoWindow); + m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Transponder Information"), clrBackground, clrWhite, m_InfoWindow); + offset += cOsd::LineHeight(); + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Vpid()); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Ppid"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Ppid"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Ppid()); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Apid1"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid1"), clrWhite, clrBackground, m_InfoWindow); value = channel->Apid2(); if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Apid1(), value); else snprintf(buf, sizeof(buf), "%d", channel->Apid1()); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Dpid1"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid1"), clrWhite, clrBackground, m_InfoWindow); value = channel->Dpid2(); if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Dpid1(), value); else snprintf(buf, sizeof(buf), "%d", channel->Dpid1()); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CA"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Ca()); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Tpid"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Tpid()); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Sid"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sid"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Sid()); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); #if (VDRVERSNUM >= 10300) - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), "Nid", clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), "Nid", clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Nid()); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), "Tid" /*tr("Tid")*/, clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), "Tid" /*tr("Tid")*/, clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Tid()); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), "Rid" /*tr("Rid")*/, clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), "Rid" /*tr("Rid")*/, clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Rid()); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); #endif - lines++; + offset += cOsd::LineHeight() - 2; switch (m_FrontendInfo.type) { case FE_QPSK: snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Satellite Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); value = channel->Frequency(); while (value > 20000) value /= 1000; snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Source"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source())); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Srate()); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Polarization"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%c", toupper(channel->Polarization())); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); value = channel->Inversion(); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); value = channel->CoderateH(); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); @@ -253,26 +255,26 @@ void cFemonOsd::DrawInfoWindow(void) else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8"); else if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9"); else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); break; case FE_QAM: snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Cable Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); value = channel->Frequency(); while (value > 20000) value /= 1000; snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Source"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%s", cSource::ToString(channel->Source())); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Srate()); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); value = channel->Modulation(); if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK"); else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16"); @@ -281,15 +283,15 @@ void cFemonOsd::DrawInfoWindow(void) else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128"); else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256"); else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto")); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); value = channel->Inversion(); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); value = channel->CoderateH(); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); @@ -301,33 +303,33 @@ void cFemonOsd::DrawInfoWindow(void) else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8"); else if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9"); else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); break; default: snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); value = channel->Frequency(); while (value > 20000) value /= 1000; snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Transmission"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Transmission"), clrWhite, clrBackground, m_InfoWindow); value = channel->Transmission(); if (value == TRANSMISSION_MODE_2K) snprintf(buf, sizeof(buf), "2K"); else if (value == TRANSMISSION_MODE_8K) snprintf(buf, sizeof(buf), "8K"); else /*TRANSMISSION_MODE_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text( OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Bandwidth"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bandwidth"), clrWhite, clrBackground, m_InfoWindow); value = channel->Bandwidth(); if (value == BANDWIDTH_8_MHZ) snprintf(buf, sizeof(buf), "8 %s", tr("MHz")); else if (value == BANDWIDTH_7_MHZ) snprintf(buf, sizeof(buf), "7 %s", tr("MHz")); else if (value == BANDWIDTH_6_MHZ) snprintf(buf, sizeof(buf), "6 %s", tr("MHz")); else /*BANDWIDTH_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); value = channel->Modulation(); if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK"); else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16"); @@ -336,15 +338,15 @@ void cFemonOsd::DrawInfoWindow(void) else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128"); else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256"); else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto")); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); value = channel->Inversion(); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); value = channel->CoderateH(); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); @@ -368,33 +370,107 @@ void cFemonOsd::DrawInfoWindow(void) else if (value == FEC_8_9) snprintf(buf2, sizeof(buf2), " - 8/9"); else /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " - %s", tr("Auto")); strncat(buf, buf2, sizeof(buf)); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - lines++; - m_Osd->Text(OSDINFOLCOL1 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Hierarchy"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Hierarchy"), clrWhite, clrBackground, m_InfoWindow); value = channel->Hierarchy(); if (value == HIERARCHY_NONE) snprintf(buf, sizeof(buf), tr("None")); else if (value == HIERARCHY_1) snprintf(buf, sizeof(buf), "1"); else if (value == HIERARCHY_2) snprintf(buf, sizeof(buf), "2"); else if (value == HIERARCHY_4) snprintf(buf, sizeof(buf), "4"); else /*HIERARCHY_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL2 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); - m_Osd->Text(OSDINFOLCOL3 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), tr("Guard"), clrWhite, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Guard"), clrWhite, clrBackground, m_InfoWindow); value = channel->Guard(); if (value == GUARD_INTERVAL_1_32) snprintf(buf, sizeof(buf), "1/32"); else if (value == GUARD_INTERVAL_1_16) snprintf(buf, sizeof(buf), "1/16"); else if (value == GUARD_INTERVAL_1_8) snprintf(buf, sizeof(buf), "1/8"); else if (value == GUARD_INTERVAL_1_4) snprintf(buf, sizeof(buf), "1/4"); else /*GUARD_INTERVAL_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); - m_Osd->Text(OSDINFOLCOL4 * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT + lines) * cOsd::LineHeight() : lines * cOsd::LineHeight(), buf, clrYellow, clrBackground, m_InfoWindow); + m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); break; } + } + else if (m_DisplayMode == modeStream) { + m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground); + m_Osd->Fill(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+cOsd::LineHeight()-1), clrWhite); + m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), clrBackground, clrWhite, m_InfoWindow); + offset += cOsd::LineHeight(); + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), clrYellow, clrBackground, m_InfoWindow); + snprintf(buf, sizeof(buf), "#%d", channel->Vpid()); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow); + if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s (%.2f %s)", m_Receiver->VideoStreamBitrate(), tr("Mbit/s"), m_Receiver->VideoBitrate(), tr("Mbit/s")); + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Aspect Ratio"), clrWhite, clrBackground, m_InfoWindow); + if (m_Receiver) { + value = m_Receiver->VideoAspectRatio(); + if (value == 100) snprintf(buf, sizeof(buf), "1:1"); + else if (value == 133) snprintf(buf, sizeof(buf), "4:3"); + else if (value == 177) snprintf(buf, sizeof(buf), "16:9"); + else if (value == 233) snprintf(buf, sizeof(buf), "2.21:1"); + else snprintf(buf, sizeof(buf), "%s", tr("reserved")); + } + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Rate"), clrWhite, clrBackground, m_InfoWindow); + if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz")); + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Format"), clrWhite, clrBackground, m_InfoWindow); + if (m_Receiver) { + value = m_Receiver->VideoFormat(); + if (value == 1) snprintf(buf, sizeof(buf), "%s", tr("PAL")); + else if (value == 2) snprintf(buf, sizeof(buf), "%s", tr("NTSC")); + else snprintf(buf, sizeof(buf), "%s", tr("unknown")); + } + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Resolution"), clrWhite, clrBackground, m_InfoWindow); + if (m_Receiver) snprintf(buf, sizeof(buf), "%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize()); + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), clrYellow, clrBackground, m_InfoWindow); + snprintf(buf, sizeof(buf), "#%d", channel->Apid1()); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow); + dvalue = m_Receiver->AudioStreamBitrate(); + if (m_Receiver) { + if (dvalue == -1.0) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("reserved"), m_Receiver->AudioBitrate(), tr("kbit/s")); + else if (dvalue == -2.0) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("free"), m_Receiver->AudioBitrate(), tr("kbit/s")); + else snprintf(buf, sizeof(buf), "%.0f %s (%.0f %s)", dvalue, tr("kbit/s"), m_Receiver->AudioBitrate(), tr("kbit/s")); + } + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("MPEG Layer"), clrWhite, clrBackground, m_InfoWindow); + if (m_Receiver) snprintf(buf, sizeof(buf), "%d", m_Receiver->AudioMPEGLayer()); + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + offset += cOsd::LineHeight() - 2; + m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), clrWhite, clrBackground, m_InfoWindow); + if (m_Receiver) { + value = m_Receiver->AudioSamplingFreq(); + if (value == -1) snprintf(buf, sizeof(buf), "%s", tr("reserved")); + else snprintf(buf, sizeof(buf), "%.1f %s", (value / 1000.0), tr("kHz")); + } + else snprintf(buf, sizeof(buf), "---"); + m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); + } + else /* modeBasic */ { + m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, m_InfoWindow); + } #if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) - m_Osd->SetFont(OldFont); + m_Osd->SetFont(OldFont); #endif - } - else { - m_Osd->Fill(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : 0, OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : OSDINFOHEIGHT * cOsd::LineHeight(), clrTransparent, m_InfoWindow); - } m_Osd->Flush(); } } @@ -444,16 +520,22 @@ void cFemonOsd::Show(void) close(m_Frontend); return; } - m_Osd = cOsd::OpenRaw((SCREENWIDTH - OSDWIDTH * cOsd::CellWidth()) / 2, (SCREENHEIGHT - (OSDSTATUSHEIGHT + OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight()) / 2); + m_Osd = cOsd::OpenRaw((SCREENWIDTH - OSDWIDTH) / 2, (SCREENHEIGHT - OSDHEIGHT) / 2); if (m_Osd) { - m_StatusWindow = m_Osd->Create(0, femonConfig.position ? 0 : (OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight(), OSDWIDTH * cOsd::CellWidth(), OSDSTATUSHEIGHT * cOsd::LineHeight(), 4); - m_InfoWindow = m_Osd->Create(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : 0, OSDWIDTH * cOsd::CellWidth(), OSDINFOHEIGHT * cOsd::LineHeight(), 2); +#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) + eDvbFont OldFont = m_Osd->SetFont(m_Font); +#endif + m_StatusWindow = m_Osd->Create(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSHEIGHT, 4); + m_InfoWindow = m_Osd->Create(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOHEIGHT, 2); m_Osd->Clear(); - m_Osd->Fill(0, femonConfig.position ? (OSDSTATUSHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : 0, OSDWIDTH * cOsd::CellWidth(), femonConfig.position ? (OSDSTATUSHEIGHT + OSDINFOHEIGHT + OSDGAPHEIGHT) * cOsd::LineHeight() : OSDINFOHEIGHT * cOsd::LineHeight(), clrTransparent, m_InfoWindow); + m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, m_InfoWindow); +#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) + m_Osd->SetFont(OldFont); +#endif m_Osd->Flush(); if (m_Receiver) delete m_Receiver; - if (femonConfig.showbitrate) { + if (femonConfig.analyzestream) { int channelNumber = cDevice::CurrentChannel(); m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1()); cDevice::ActualDevice()->AttachReceiver(m_Receiver); @@ -483,7 +565,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber) } if (m_Receiver) delete m_Receiver; - if (femonConfig.showbitrate) { + if (femonConfig.analyzestream) { channelNumber = cDevice::CurrentChannel(); m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1()); cDevice::ActualDevice()->AttachReceiver(m_Receiver); @@ -556,7 +638,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key) } break; case kOk: - m_DisplayMode ^= 1; // toggle between advanced and simple display mode + if (++m_DisplayMode >= modeMaxNumber) m_DisplayMode = 0; // toggle between display modes DrawInfoWindow(); break; default: diff --git a/femonosd.h b/femonosd.h index 65ed32e..bc75860 100644 --- a/femonosd.h +++ b/femonosd.h @@ -36,6 +36,7 @@ private: uint32_t m_UNC; fe_status_t m_FrontendStatus; int m_DisplayMode; + eDvbFont m_Font; cMutex* m_Mutex; void DrawStatusWindow(void); void DrawInfoWindow(void); diff --git a/femonreceiver.c b/femonreceiver.c index 2a428a9..8a320e0 100644 --- a/femonreceiver.c +++ b/femonreceiver.c @@ -10,6 +10,12 @@ #include "femoncfg.h" #include "femonreceiver.h" +#define TS_SIZE 188 +#define PAY_START 0x40 +#define ADAPT_FIELD 0x20 +#define PAYLOAD 0x10 +#define PTS_DTS_FLAGS 0xC0 + cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid) #if VDRVERSNUM >= 10300 :cReceiver(Ca, -1, 2, Vpid, Apid), cThread("femon receiver") @@ -22,9 +28,20 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid) m_VideoPid = Vpid; m_AudioPid = Apid; m_VideoPacketCount = 0; - m_AudioPacketCount = 0; + m_VideoHorizontalSize = 0; + m_VideoVerticalSize = 0; + m_VideoAspectRatio = 0; + m_VideoFormat = 0; + m_VideoFrameRate = 0.0; + m_VideoStreamBitrate = 0.0; m_VideoBitrate = 0.0; + m_AudioPacketCount = 0; + m_AudioStreamBitrate = -2.0; m_AudioBitrate = 0.0; + m_AudioSamplingFreq = -1; + m_AudioMPEGLayer = 0; + m_AudioBitrate = 0.0; + } cFemonReceiver::~cFemonReceiver(void) @@ -36,6 +53,123 @@ cFemonReceiver::~cFemonReceiver(void) } } +/* the following function originates from libdvbmpeg: */ +void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count) +{ + //printf("cFemonReceiver::GetVideoInfo()\n"); + uint8_t *headr; + int found = 0; + int c = 0; + while (found < 4 && c + 4 < count) { + uint8_t *b; + b = mbuf + c; + if (b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01 && b[3] == 0xb3) + found = 4; + else + c++; + } + if (!found) return; + c += 4; + if (c + 12 >= count) return; + headr = mbuf + c; + m_VideoHorizontalSize = ((headr[1] &0xF0) >> 4) | (headr[0] << 4); + m_VideoVerticalSize = ((headr[1] &0x0F) << 8) | (headr[2]); + int sw = (int)((headr[3] & 0xF0) >> 4); + switch( sw ){ + case 1: + m_VideoAspectRatio = 100; + break; + case 2: + m_VideoAspectRatio = 133; + break; + case 3: + m_VideoAspectRatio = 177; + break; + case 4: + m_VideoAspectRatio = 221; + break; + case 5 ... 15: + m_VideoAspectRatio = 0; + break; + default: + return; + } + sw = (int)(headr[3] & 0x0F); + switch ( sw ) { + case 1: + m_VideoFrameRate = 24000/1001.0; + m_VideoFormat = 0; + break; + case 2: + m_VideoFrameRate = 24.0; + m_VideoFormat = 0; + break; + case 3: + m_VideoFrameRate = 25.0; + m_VideoFormat = 1; + break; + case 4: + m_VideoFrameRate = 30000/1001.0; + m_VideoFormat = 2; + break; + case 5: + m_VideoFrameRate = 30.0; + m_VideoFormat = 2; + break; + case 6: + m_VideoFrameRate = 50.0; + m_VideoFormat = 1; + break; + case 7: + m_VideoFrameRate = 60.0; + m_VideoFormat = 2; + break; + } + m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0; +} + +static unsigned int bitrates[3][16] = +{ + {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0} +}; + +static unsigned int samplerates[4] = {441, 480, 320, 0}; + +/* the following function originates from libdvbmpeg: */ +void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count) +{ + //printf("cFemonReceiver::GetAudioInfo()\n"); + uint8_t *headr; + int found = 0; + int c = 0; + int tmp = 0; + while (!found && c < count) { + uint8_t *b = mbuf + c; + if (b[0] == 0xff && (b[1] & 0xf8) == 0xf8) + found = 1; + else + c++; + } + if (!found) return; + if (c + 3 >= count) return; + headr = mbuf + c; + m_AudioMPEGLayer = 4 - ((headr[1] & 0x06) >> 1); + tmp = bitrates[(3 - ((headr[1] & 0x06) >> 1))][(headr[2] >> 4)] * 1000; + if (tmp == 0) + m_AudioStreamBitrate = -2.0; // free + else if (tmp == 0xf) + m_AudioStreamBitrate = -1.0; // reserved + else + m_AudioStreamBitrate = tmp / 1000.0; + tmp = samplerates[((headr[2] & 0x0c) >> 2)] * 100; + if (tmp == 3) + m_AudioSamplingFreq = -1; // reserved + else + m_AudioSamplingFreq = tmp; +} + void cFemonReceiver::Activate(bool On) { //printf("cFemonReceiver::Activate()\n"); @@ -45,8 +179,8 @@ void cFemonReceiver::Activate(bool On) void cFemonReceiver::Receive(uchar *Data, int Length) { //printf("cFemonReceiver::Receive()\n"); - // TS packet length: 188 - if (Length == 188) { + // TS packet length: TS_SIZE + if (Length == TS_SIZE) { int pid = ((Data[1] & 0x1f) << 8) | (Data[2]); if (pid == m_VideoPid) { m_VideoPacketCount++; @@ -54,6 +188,28 @@ void cFemonReceiver::Receive(uchar *Data, int Length) else if (pid == m_AudioPid) { m_AudioPacketCount++; } + /* the following originates from libdvbmpeg: */ + if (!(Data[3] & PAYLOAD)) { + return; + } + uint8_t off = 0; + if (Data[3] & ADAPT_FIELD) { + off = Data[4] + 1; + } + if (Data[1] & PAY_START) { + uint8_t *sb = Data + 4 + off; + if (sb[7] & PTS_DTS_FLAGS) { + uint8_t *pay = sb + sb[8] + 9; + int l = TS_SIZE - 13 - off - sb[8]; + if (pid == m_VideoPid) { + GetVideoInfo(pay, l); + } + if (pid == m_AudioPid) { + GetAudioInfo(pay, l); + } + } + } + /* end */ } } diff --git a/femonreceiver.h b/femonreceiver.h index 984fd54..54f6572 100644 --- a/femonreceiver.h +++ b/femonreceiver.h @@ -18,9 +18,20 @@ private: int m_VideoPid; int m_AudioPid; int m_VideoPacketCount; - int m_AudioPacketCount; + int m_VideoHorizontalSize; + int m_VideoVerticalSize; + int m_VideoAspectRatio; + int m_VideoFormat; + double m_VideoFrameRate; + double m_VideoStreamBitrate; double m_VideoBitrate; + int m_AudioPacketCount; + double m_AudioStreamBitrate; double m_AudioBitrate; + int m_AudioSamplingFreq; + int m_AudioMPEGLayer; + void GetVideoInfo(uint8_t *mbuf, int count); + void GetAudioInfo(uint8_t *mbuf, int count); protected: virtual void Activate(bool On); @@ -31,8 +42,18 @@ public: cFemonReceiver(int Ca, int Vpid, int Apid); virtual ~cFemonReceiver(); - double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s - double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s + int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels + int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels + int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // 4:3 == 133, ... + int VideoFormat(void) { return m_VideoFormat; }; // 0 == unknown, 1 == PAL, 2 == NTSC + double VideoFrameRate(void) { return m_VideoFrameRate; }; // Hz + double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // Mbit/s + double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s + + int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // number + int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz + double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // kbit/s + double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s }; #endif //__FEMONRECEIVER_H