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

Compare commits

..

3 Commits

Author SHA1 Message Date
Rolf Ahrenberg
848a2ba78d Fixed the channel switch bug (reported by Stefan Lucke).
Nid/Tid/Rid are now included in translations.
Added video format and aspect ratio symbols into status window.
2004-06-06 04:20:00 +03:00
Rolf Ahrenberg
74ed4d8490 Added "Stream Information" display mode.
Toggle between different modes with 'OK' key:
 .-> basic -> transponder -> stream -.
 `-----------------------------------´
Added missing german translations (Thanks to Peter Marquardt).
2004-05-30 04:20:00 +03:00
Rolf Ahrenberg
8c7c110cf2 Updated for vdr-1.3.7 and removed compability with older versions. 2004-05-18 04:20:00 +03:00
17 changed files with 491 additions and 1237 deletions

View File

@@ -54,10 +54,6 @@ VDR Plugin 'femon' Revision History
- Backported changes and fixes from version 0.1.2. - Backported changes and fixes from version 0.1.2.
2004-06-11: Version 0.0.6
- Backported the "AC3 Stream Information" feature from version 0.1.3.
------------------------- -------------------------
2004-05-18: Version 0.1.0 2004-05-18: Version 0.1.0
@@ -77,7 +73,3 @@ VDR Plugin 'femon' Revision History
- Fixed the channel switch bug (reported by Stefan Lucke). - Fixed the channel switch bug (reported by Stefan Lucke).
- Nid/Tid/Rid are now included in translations. - Nid/Tid/Rid are now included in translations.
- Added video format and aspect ratio symbols into status window. - Added video format and aspect ratio symbols into status window.
2004-06-11: Version 0.1.3
- Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch).

40
README
View File

@@ -10,7 +10,9 @@ See the file COPYING for license information.
Requirements: Requirements:
VDR & DVB. BMW & Ph.D.. BEER. YARRR! 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. YARRR!
Description: Description:
@@ -28,41 +30,7 @@ bitrate calculation algorithm originates from the 'dvbstream' application by
Dave Chapman and the stream information routines from the 'libdvb' library by Dave Chapman and the stream information routines from the 'libdvb' library by
Metzler Brothers. Metzler Brothers.
Terminology: Shortcomings / Todo list / Important Notes:
--------------------------------------------------------------
|## Channel Name ############################# DD 16:9 PAL ##|
|[=====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 |
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
--------------------------------------------------------------
STR - Signal strength
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)
LOCK - Everything's working...
SIGNAL - Found something above the noise level
CARRIER - Found a DVB signal
VITERBI - FEC (forward error correction) is stable
SYNC - Found sync bytes
Installation:
cd /put/your/path/here/VDR/PLUGINS/src
tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tar.gz
ln -s femon-X.Y.Z femon
cd /put/your/path/here/VDR
make
make plugins
./vdr -Pfemon
Notes:
- The plugin supports only those DVB cards with _one_ frontend (do any cards - 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 with multiple frontends even exist?), because I haven't yet figured howto do

View File

@@ -12,7 +12,7 @@
#include "femonosd.h" #include "femonosd.h"
#include "femon.h" #include "femon.h"
#if VDRVERSNUM >= 10307 #if VDRVERSNUM < 10307
#error "You don't exist! Go away!" #error "You don't exist! Go away!"
#endif #endif
@@ -85,10 +85,9 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
cMenuFemonSetup::cMenuFemonSetup(void) cMenuFemonSetup::cMenuFemonSetup(void)
{ {
dispmodes[modeBasic] = tr("basic"); dispmodes[0] = tr("basic");
dispmodes[modeTransponder] = tr("transponder"); dispmodes[1] = tr("transponder");
dispmodes[modeStream] = tr("stream"); dispmodes[2] = tr("stream");
dispmodes[modeAC3] = tr("AC-3");
Setup(); Setup();
} }

View File

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

View File

@@ -13,7 +13,6 @@ enum dispModes {
modeBasic, modeBasic,
modeTransponder, modeTransponder,
modeStream, modeStream,
modeAC3,
modeMaxNumber modeMaxNumber
}; };

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,6 @@
#ifndef __FEMONI18N_H #ifndef __FEMONI18N_H
#define __FEMONI18N_H #define __FEMONI18N_H
#include <vdr/config.h> // for VDRVERSNUM
#include <vdr/i18n.h> #include <vdr/i18n.h>
extern const tI18nPhrase Phrases[]; extern const tI18nPhrase Phrases[];

View File

@@ -12,9 +12,12 @@
#include "femonreceiver.h" #include "femonreceiver.h"
#include "femonosd.h" #include "femonosd.h"
#if (VDRVERSNUM < 10300) && !defined(ELCHIAIOVERSION) #include "symbols/ar11.xpm"
#warning You should consider using the small fonts! #include "symbols/ar169.xpm"
#endif #include "symbols/ar2211.xpm"
#include "symbols/ar43.xpm"
#include "symbols/ntsc.xpm"
#include "symbols/pal.xpm"
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
#define CHANNELINPUT_TIMEOUT 1000 #define CHANNELINPUT_TIMEOUT 1000
@@ -23,23 +26,28 @@
#define SCREENHEIGHT 576 // in pixels #define SCREENHEIGHT 576 // in pixels
#define OSDWIDTH 600 // in pixels #define OSDWIDTH 600 // in pixels
#define OSDHEIGHT 480 // in pixels #define OSDHEIGHT 480 // in pixels
#define OSDINFOHEIGHT ((cOsd::LineHeight() - 2) * 11) // in pixels (11 rows) #define OSDINFOHEIGHT (m_Font->Height() * 11) // in pixels (11 rows)
#define OSDSTATUSHEIGHT ((cOsd::LineHeight() - 2) * 6) // in pixels (6 rows) #define OSDSTATUSHEIGHT (m_Font->Height() * 6) // in pixels (6 rows)
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset) #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) ? 470 : (col == 3) ? 300 : (col==2) ? 180 : 15)
#define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset)) #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_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 OSDSTATUSWIN_XC(col,txt) (((col - 1) * SCREENWIDTH / 6) + ((SCREENWIDTH / 6 - m_Font->Width(txt)) / 2))
#define BARWIDTH(x) (OSDWIDTH * x / 100) #define BARWIDTH(x) (OSDWIDTH * x / 100)
#define DELTA 2 #define SPACING 5
#define clrBackground clrGray50 // this should be tied somehow into current theme
cBitmap cFemonOsd::bmAspectRatio_1_1(ar11_xpm);
cBitmap cFemonOsd::bmAspectRatio_16_9(ar169_xpm);
cBitmap cFemonOsd::bmAspectRatio_2_21_1(ar2211_xpm);
cBitmap cFemonOsd::bmAspectRatio_4_3(ar43_xpm);
cBitmap cFemonOsd::bmPAL(pal_xpm);
cBitmap cFemonOsd::bmNTSC(ntsc_xpm);
cFemonOsd::cFemonOsd(void) cFemonOsd::cFemonOsd(void)
#if VDRVERSNUM >= 10300
:cOsdObject(true), cThread("femon osd") :cOsdObject(true), cThread("femon osd")
#else
:cOsdObject(true)
#endif
{ {
//printf("cFemonOsd::cFemonOsd()\n"); //printf("cFemonOsd::cFemonOsd()\n");
m_Osd = NULL; m_Osd = NULL;
@@ -54,11 +62,7 @@ cFemonOsd::cFemonOsd(void)
m_BER = 0; m_BER = 0;
m_UNC = 0; m_UNC = 0;
m_DisplayMode = femonConfig.displaymode; m_DisplayMode = femonConfig.displaymode;
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) m_Font = cFont::GetFont(fontSml);
m_Font = fontSml;
#else
m_Font = fontOsd;
#endif
m_Mutex = new cMutex(); m_Mutex = new cMutex();
} }
@@ -83,75 +87,111 @@ void cFemonOsd::DrawStatusWindow(void)
int snr = m_SNR / 655; int snr = m_SNR / 655;
int signal = m_Signal / 655; int signal = m_Signal / 655;
int offset = 0; int offset = 0;
int x = OSDWIDTH - SPACING;
int y = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd) { if (m_Osd) {
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrBackground);
eDvbFont OldFont = m_Osd->SetFont(m_Font);
#endif
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()); snprintf(buf, sizeof(buf), "%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->Name());
m_Osd->Fill(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+cOsd::LineHeight()-1), clrWhite, m_StatusWindow); m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+m_Font->Height()-1), clrWhite);
m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), buf, clrBlack, clrWhite, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), buf, clrBlack, clrWhite, m_Font);
offset += cOsd::LineHeight(); if (m_Receiver) {
int value = m_Receiver->VideoFormat();
if (value == VF_PAL) {
x -= bmPAL.Width() + SPACING;
y = (m_Font->Height() - bmPAL.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmPAL, clrBlack, clrWhite);
}
else if (value == VF_NTSC) {
x -= bmNTSC.Width() + SPACING;
y = (m_Font->Height() - bmNTSC.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmNTSC, clrBlack, clrWhite);
}
value = m_Receiver->VideoAspectRatio();
if (value == AR_1_1) {
x -= bmAspectRatio_1_1.Width() + SPACING;
y = (m_Font->Height() - bmAspectRatio_1_1.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_1_1, clrBlack, clrWhite);
}
else if (value == AR_4_3) {
x -= bmAspectRatio_4_3.Width() + SPACING;
y = (m_Font->Height() - bmAspectRatio_4_3.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_4_3, clrBlack, clrWhite);
}
else if (value == AR_16_9) {
x -= bmAspectRatio_16_9.Width() + SPACING;
y = (m_Font->Height() - bmAspectRatio_16_9.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_16_9, clrBlack, clrWhite);
}
else if (value == AR_2_21_1) {
x -= bmAspectRatio_2_21_1.Width() + SPACING;
y = (m_Font->Height() - bmAspectRatio_2_21_1.Height()) / 2;
if (y < 0) y = 0;
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_2_21_1, clrBlack, clrWhite);
}
}
offset += m_Font->Height();
if (signal > 0) { if (signal > 0) {
signal = BARWIDTH(signal); 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); m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.redlimit), signal), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrRed);
if (signal > BARWIDTH(femonConfig.redlimit)) { 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); m_Osd->DrawRectangle(BARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min((OSDWIDTH * femonConfig.greenlimit / 100), signal), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrYellow);
} }
if (signal > BARWIDTH(femonConfig.greenlimit)) { 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); m_Osd->DrawRectangle(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), signal, OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrGreen);
} }
} }
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
if (snr > 0) { if (snr > 0) {
snr = BARWIDTH(snr); 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); m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.redlimit), snr), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrRed);
if (snr > BARWIDTH(femonConfig.redlimit)) { 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); m_Osd->DrawRectangle(BARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min(BARWIDTH(femonConfig.greenlimit), snr), OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrYellow);
} }
if (snr > BARWIDTH(femonConfig.greenlimit)) { 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); m_Osd->DrawRectangle(BARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), snr, OSDSTATUSWIN_Y(offset+m_Font->Height()-3), clrGreen);
} }
} }
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%04x", m_Signal); snprintf(buf, sizeof(buf), "%04x", m_Signal);
m_Osd->Text(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "(%2d%%)", m_Signal / 655); snprintf(buf, sizeof(buf), "(%2d%%)", m_Signal / 655);
m_Osd->Text(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "BER:", clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "BER:", clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%08x", m_BER); snprintf(buf, sizeof(buf), "%08x", m_BER);
m_Osd->Text(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%s:", tr("Video")); snprintf(buf, sizeof(buf), "%s:", tr("Video"));
m_Osd->Text(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoBitrate(), tr("Mbit/s")); if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoBitrate(), tr("Mbit/s"));
else snprintf(buf, sizeof(buf), "--- %s", 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); m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%04x", m_SNR); snprintf(buf, sizeof(buf), "%04x", m_SNR);
m_Osd->Text(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "(%2d%%)", m_SNR / 655); snprintf(buf, sizeof(buf), "(%2d%%)", m_SNR / 655);
m_Osd->Text(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", clrWhite, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%08x", m_UNC); snprintf(buf, sizeof(buf), "%08x", m_UNC);
m_Osd->Text(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); 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:", tr("Audio"));
m_Osd->Text(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_StatusWindow); 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->AudioBitrate(), tr("kbit/s"));
else snprintf(buf, sizeof(buf), "--- %s", 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); m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, clrWhite, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
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->DrawText(OSDSTATUSWIN_XC(1,tr("LOCK")), OSDSTATUSWIN_Y(offset), tr("LOCK"), (m_FrontendStatus & FE_HAS_LOCK) ? clrYellow : clrBlack, clrBackground, m_Font);
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->DrawText(OSDSTATUSWIN_XC(2,tr("SIGNAL")), OSDSTATUSWIN_Y(offset), tr("SIGNAL"), (m_FrontendStatus & FE_HAS_SIGNAL) ? clrYellow : clrBlack, clrBackground, m_Font);
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->DrawText(OSDSTATUSWIN_XC(3,tr("CARRIER")), OSDSTATUSWIN_Y(offset), tr("CARRIER"),(m_FrontendStatus & FE_HAS_CARRIER)? clrYellow : clrBlack, clrBackground, m_Font);
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->DrawText(OSDSTATUSWIN_XC(4,tr("VITERBI")), OSDSTATUSWIN_Y(offset), tr("VITERBI"),(m_FrontendStatus & FE_HAS_VITERBI)? clrYellow : clrBlack, clrBackground, m_Font);
m_Osd->Text(OSDSTATUSWIN_XC(5,tr("SYNC")), OSDSTATUSWIN_Y(offset), tr("SYNC"), (m_FrontendStatus & FE_HAS_SYNC) ? clrYellow : clrBlack, clrBackground, m_StatusWindow); m_Osd->DrawText(OSDSTATUSWIN_XC(5,tr("SYNC")), OSDSTATUSWIN_Y(offset), tr("SYNC"), (m_FrontendStatus & FE_HAS_SYNC) ? clrYellow : clrBlack, clrBackground, m_Font);
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION)
m_Osd->SetFont(OldFont);
#endif
m_Osd->Flush(); m_Osd->Flush();
} }
} }
@@ -168,83 +208,78 @@ void cFemonOsd::DrawInfoWindow(void)
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd) { if (m_Osd) {
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION)
eDvbFont OldFont = m_Osd->SetFont(m_Font);
#endif
if (m_DisplayMode == modeTransponder) { if (m_DisplayMode == modeTransponder) {
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground, m_InfoWindow); m_Osd->DrawRectangle(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_InfoWindow); m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+m_Font->Height()-1), clrWhite);
m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Transponder Information"), clrBackground, clrWhite, m_InfoWindow); m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Transponder Information"), clrBackground, clrWhite, m_Font);
offset += cOsd::LineHeight(); offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Vpid()); snprintf(buf, sizeof(buf), "%d", channel->Vpid());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Ppid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Ppid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Ppid()); snprintf(buf, sizeof(buf), "%d", channel->Ppid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid1"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid1"), clrWhite, clrBackground, m_Font);
value = channel->Apid2(); value = channel->Apid2();
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Apid1(), value); if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Apid1(), value);
else snprintf(buf, sizeof(buf), "%d", channel->Apid1()); else snprintf(buf, sizeof(buf), "%d", channel->Apid1());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid1"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid1"), clrWhite, clrBackground, m_Font);
value = channel->Dpid2(); value = channel->Dpid2();
if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Dpid1(), value); if (value) snprintf(buf, sizeof(buf), "%d, %d", channel->Dpid1(), value);
else snprintf(buf, sizeof(buf), "%d", channel->Dpid1()); else snprintf(buf, sizeof(buf), "%d", channel->Dpid1());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Ca()); snprintf(buf, sizeof(buf), "%d", channel->Ca());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Tpid()); snprintf(buf, sizeof(buf), "%d", channel->Tpid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Sid()); snprintf(buf, sizeof(buf), "%d", channel->Sid());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
#if (VDRVERSNUM >= 10300) m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Nid"), clrWhite, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Nid"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", channel->Nid()); snprintf(buf, sizeof(buf), "%d", channel->Nid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Tid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Tid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Tid()); snprintf(buf, sizeof(buf), "%d", channel->Tid());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Rid"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Rid"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Rid()); snprintf(buf, sizeof(buf), "%d", channel->Rid());
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
#endif offset += m_Font->Height();
offset += cOsd::LineHeight() - DELTA;
switch (m_FrontendInfo.type) { switch (m_FrontendInfo.type) {
case FE_QPSK: case FE_QPSK:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Satellite Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Satellite Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_Font);
value = channel->Frequency(); value = channel->Frequency();
while (value > 20000) value /= 1000; while (value > 20000) value /= 1000;
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_InfoWindow); 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->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Srate()); snprintf(buf, sizeof(buf), "%d", channel->Srate());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%c", toupper(channel->Polarization())); snprintf(buf, sizeof(buf), "%c", toupper(channel->Polarization()));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_Font);
value = channel->Inversion(); value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On"));
else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_Font);
value = channel->CoderateH(); value = channel->CoderateH();
if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2");
@@ -256,26 +291,26 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8"); 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 if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9");
else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
break; break;
case FE_QAM: case FE_QAM:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Cable Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Cable Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_Font);
value = channel->Frequency(); value = channel->Frequency();
while (value > 20000) value /= 1000; while (value > 20000) value /= 1000;
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), clrWhite, clrBackground, m_InfoWindow); 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->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), clrWhite, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "%d", channel->Srate()); snprintf(buf, sizeof(buf), "%d", channel->Srate());
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_Font);
value = channel->Modulation(); value = channel->Modulation();
if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK"); if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK");
else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16"); else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16");
@@ -284,15 +319,15 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128"); else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128");
else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256"); else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256");
else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto")); else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_Font);
value = channel->Inversion(); value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On"));
else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_Font);
value = channel->CoderateH(); value = channel->CoderateH();
if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2");
@@ -304,33 +339,33 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8"); 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 if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9");
else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
break; break;
default: default:
snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name);
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), clrWhite, clrBackground, m_Font);
value = channel->Frequency(); value = channel->Frequency();
while (value > 20000) value /= 1000; while (value > 20000) value /= 1000;
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz")); snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Transmission"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Transmission"), clrWhite, clrBackground, m_Font);
value = channel->Transmission(); value = channel->Transmission();
if (value == TRANSMISSION_MODE_2K) snprintf(buf, sizeof(buf), "2K"); if (value == TRANSMISSION_MODE_2K) snprintf(buf, sizeof(buf), "2K");
else if (value == TRANSMISSION_MODE_8K) snprintf(buf, sizeof(buf), "8K"); else if (value == TRANSMISSION_MODE_8K) snprintf(buf, sizeof(buf), "8K");
else /*TRANSMISSION_MODE_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*TRANSMISSION_MODE_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bandwidth"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bandwidth"), clrWhite, clrBackground, m_Font);
value = channel->Bandwidth(); value = channel->Bandwidth();
if (value == BANDWIDTH_8_MHZ) snprintf(buf, sizeof(buf), "8 %s", tr("MHz")); 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_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 if (value == BANDWIDTH_6_MHZ) snprintf(buf, sizeof(buf), "6 %s", tr("MHz"));
else /*BANDWIDTH_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*BANDWIDTH_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), clrWhite, clrBackground, m_Font);
value = channel->Modulation(); value = channel->Modulation();
if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK"); if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK");
else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16"); else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16");
@@ -339,15 +374,15 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128"); else if (value == QAM_128) snprintf(buf, sizeof(buf), "QAM 128");
else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256"); else if (value == QAM_256) snprintf(buf, sizeof(buf), "QAM 256");
else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto")); else /*QAM_AUTO*/ snprintf(buf, sizeof(buf), "QAM %s", tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), clrWhite, clrBackground, m_Font);
value = channel->Inversion(); value = channel->Inversion();
if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off")); if (value == INVERSION_OFF) snprintf(buf, sizeof(buf), tr("Off"));
else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On")); else if (value == INVERSION_ON) snprintf(buf, sizeof(buf), tr("On"));
else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), clrWhite, clrBackground, m_Font);
value = channel->CoderateH(); value = channel->CoderateH();
if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == FEC_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2"); else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2");
@@ -371,42 +406,42 @@ void cFemonOsd::DrawInfoWindow(void)
else if (value == FEC_8_9) snprintf(buf2, sizeof(buf2), " - 8/9"); else if (value == FEC_8_9) snprintf(buf2, sizeof(buf2), " - 8/9");
else /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " - %s", tr("Auto")); else /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " - %s", tr("Auto"));
strncat(buf, buf2, sizeof(buf)); strncat(buf, buf2, sizeof(buf));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Hierarchy"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Hierarchy"), clrWhite, clrBackground, m_Font);
value = channel->Hierarchy(); value = channel->Hierarchy();
if (value == HIERARCHY_NONE) snprintf(buf, sizeof(buf), tr("None")); if (value == HIERARCHY_NONE) snprintf(buf, sizeof(buf), tr("None"));
else if (value == HIERARCHY_1) snprintf(buf, sizeof(buf), "1"); else if (value == HIERARCHY_1) snprintf(buf, sizeof(buf), "1");
else if (value == HIERARCHY_2) snprintf(buf, sizeof(buf), "2"); else if (value == HIERARCHY_2) snprintf(buf, sizeof(buf), "2");
else if (value == HIERARCHY_4) snprintf(buf, sizeof(buf), "4"); else if (value == HIERARCHY_4) snprintf(buf, sizeof(buf), "4");
else /*HIERARCHY_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*HIERARCHY_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Guard"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Guard"), clrWhite, clrBackground, m_Font);
value = channel->Guard(); value = channel->Guard();
if (value == GUARD_INTERVAL_1_32) snprintf(buf, sizeof(buf), "1/32"); 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_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_8) snprintf(buf, sizeof(buf), "1/8");
else if (value == GUARD_INTERVAL_1_4) snprintf(buf, sizeof(buf), "1/4"); else if (value == GUARD_INTERVAL_1_4) snprintf(buf, sizeof(buf), "1/4");
else /*GUARD_INTERVAL_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto")); else /*GUARD_INTERVAL_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
break; break;
} }
} }
else if (m_DisplayMode == modeStream) { else if (m_DisplayMode == modeStream) {
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrBackground, m_InfoWindow); m_Osd->DrawRectangle(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_InfoWindow); m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+m_Font->Height()-1), clrWhite);
m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), clrBackground, clrWhite, m_InfoWindow); m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), clrBackground, clrWhite, m_Font);
offset += cOsd::LineHeight(); offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), clrYellow, clrBackground, m_Font);
snprintf(buf, sizeof(buf), "#%d", channel->Vpid()); snprintf(buf, sizeof(buf), "#%d", channel->Vpid());
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s (%.2f %s)", m_Receiver->VideoStreamBitrate(), tr("Mbit/s"), m_Receiver->VideoBitrate(), tr("Mbit/s")); 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), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Aspect Ratio"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Aspect Ratio"), clrWhite, clrBackground, m_Font);
if (m_Receiver) { if (m_Receiver) {
value = m_Receiver->VideoAspectRatio(); value = m_Receiver->VideoAspectRatio();
if (value == AR_1_1) snprintf(buf, sizeof(buf), "1:1"); if (value == AR_1_1) snprintf(buf, sizeof(buf), "1:1");
@@ -416,14 +451,14 @@ void cFemonOsd::DrawInfoWindow(void)
else snprintf(buf, sizeof(buf), "%s", tr("reserved")); else snprintf(buf, sizeof(buf), "%s", tr("reserved"));
} }
else snprintf(buf, sizeof(buf), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Rate"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Rate"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz")); if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz"));
else snprintf(buf, sizeof(buf), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Format"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Format"), clrWhite, clrBackground, m_Font);
if (m_Receiver) { if (m_Receiver) {
value = m_Receiver->VideoFormat(); value = m_Receiver->VideoFormat();
if (value == VF_PAL) snprintf(buf, sizeof(buf), "%s", tr("PAL")); if (value == VF_PAL) snprintf(buf, sizeof(buf), "%s", tr("PAL"));
@@ -431,18 +466,18 @@ void cFemonOsd::DrawInfoWindow(void)
else snprintf(buf, sizeof(buf), "%s", tr("unknown")); else snprintf(buf, sizeof(buf), "%s", tr("unknown"));
} }
else snprintf(buf, sizeof(buf), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Resolution"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Resolution"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize()); if (m_Receiver) snprintf(buf, sizeof(buf), "%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize());
else snprintf(buf, sizeof(buf), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), clrYellow, clrBackground, m_InfoWindow); 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", channel->Apid1());
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_Font);
if (m_Receiver) { if (m_Receiver) {
dvalue = m_Receiver->AudioStreamBitrate(); dvalue = m_Receiver->AudioStreamBitrate();
if (dvalue == (double)FR_RESERVED) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("reserved"), m_Receiver->AudioBitrate(), tr("kbit/s")); if (dvalue == (double)FR_RESERVED) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("reserved"), m_Receiver->AudioBitrate(), tr("kbit/s"));
@@ -450,121 +485,25 @@ void cFemonOsd::DrawInfoWindow(void)
else snprintf(buf, sizeof(buf), "%.0f %s (%.0f %s)", dvalue, tr("kbit/s"), 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), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("MPEG Layer"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("MPEG Layer"), clrWhite, clrBackground, m_Font);
if (m_Receiver) snprintf(buf, sizeof(buf), "%d", m_Receiver->AudioMPEGLayer()); if (m_Receiver) snprintf(buf, sizeof(buf), "%d", m_Receiver->AudioMPEGLayer());
else snprintf(buf, sizeof(buf), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA; offset += m_Font->Height();
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), clrWhite, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), clrWhite, clrBackground, m_Font);
if (m_Receiver) { if (m_Receiver) {
value = m_Receiver->AudioSamplingFreq(); value = m_Receiver->AudioSamplingFreq();
if (value == FR_RESERVED) snprintf(buf, sizeof(buf), "%s", tr("reserved")); if (value == FR_RESERVED) snprintf(buf, sizeof(buf), "%s", tr("reserved"));
else snprintf(buf, sizeof(buf), "%.1f %s", (value / 1000.0), tr("kHz")); else snprintf(buf, sizeof(buf), "%.1f %s", (value / 1000.0), tr("kHz"));
} }
else snprintf(buf, sizeof(buf), "---"); else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_Font);
offset += cOsd::LineHeight() - DELTA;
}
else if (m_DisplayMode == modeAC3) {
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);
snprintf(buf, sizeof(buf), "%s - %s #%d", tr("Stream Information"), tr("AC-3 Stream"), channel->Dpid1());
m_Osd->Text( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, clrBackground, clrWhite, m_InfoWindow);
offset += cOsd::LineHeight();
if (m_Receiver && m_Receiver->AC3Valid()) {
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%.0f %s (%0.f %s)", m_Receiver->AC3StreamBitrate(), tr("kbit/s"), m_Receiver->AC3Bitrate(), tr("kbit/s"));
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%.1f %s", m_Receiver->AC3SamplingFreq() / 1000., tr("kHz"));
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Size"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%d", m_Receiver->AC3FrameSize());
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bit Stream Mode"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3BitStreamMode()) {
case 0: snprintf(buf, sizeof(buf), tr("Complete Main (CM)")); break;
case 1: snprintf(buf, sizeof(buf), tr("Music and Effects (ME)")); break;
case 2: snprintf(buf, sizeof(buf), tr("Visually Impaired (VI)")); break;
case 3: snprintf(buf, sizeof(buf), tr("Hearing Impaired (HI)")); break;
case 4: snprintf(buf, sizeof(buf), tr("Dialogue (D)")); break;
case 5: snprintf(buf, sizeof(buf), tr("Commentary (C)")); break;
case 6: snprintf(buf, sizeof(buf), tr("Emergency (E)")); break;
case 7: (m_Receiver->AC3AudioCodingMode() == 1) ? snprintf(buf, sizeof(buf), tr("Voice Over (VO)")) : snprintf(buf, sizeof(buf), tr("Karaoke")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Coding Mode"), clrWhite, clrBackground, m_InfoWindow);
if (m_Receiver->AC3BitStreamMode() != 7) {
switch (m_Receiver->AC3AudioCodingMode()) {
case 0: snprintf(buf, sizeof(buf), "1+1 - %s, %s", tr("Ch1"), tr("Ch2")); break;
case 1: snprintf(buf, sizeof(buf), "1/0 - %s", tr("C")); break;
case 2: snprintf(buf, sizeof(buf), "2/0 - %s, %s", tr("L"), tr("R")); break;
case 3: snprintf(buf, sizeof(buf), "3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R")); break;
case 4: snprintf(buf, sizeof(buf), "2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S")); break;
case 5: snprintf(buf, sizeof(buf), "3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S")); break;
case 6: snprintf(buf, sizeof(buf), "2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR")); break;
case 7: snprintf(buf, sizeof(buf), "3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR")); break;
default: snprintf(buf, sizeof(buf), "---");
}
}
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Center Mix Level"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3CenterMixLevel()) {
case CML_MINUS_3dB: snprintf(buf, sizeof(buf), "-3.0 %s", tr("dB")); break;
case CML_MINUS_4_5dB: snprintf(buf, sizeof(buf), "-4.5 %s", tr("dB")); break;
case CML_MINUS_6dB: snprintf(buf, sizeof(buf), "-6.0 %s", tr("dB")); break;
case CML_RESERVED: snprintf(buf, sizeof(buf), "%s", tr("reserved")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Surround Mix Level"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3SurroundMixLevel()) {
case SML_MINUS_3dB: snprintf(buf, sizeof(buf), "-3 %s", tr("dB")); break;
case SML_MINUS_6dB: snprintf(buf, sizeof(buf), "-6 %s", tr("dB")); break;
case SML_0_dB: snprintf(buf, sizeof(buf), "0 %s", tr("dB")); break;
case SML_RESERVED: snprintf(buf, sizeof(buf), "%s", tr("reserved")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dolby Surround Mode"), clrWhite, clrBackground, m_InfoWindow);
switch (m_Receiver->AC3DolbySurroundMode()) {
case DSM_NOT_INDICATED: snprintf(buf, sizeof(buf), "%s", tr("not indicated")); break;
case DSM_NOT_DOLBYSURROUND: snprintf(buf, sizeof(buf), "%s", tr("Off")); break;
case DSM_DOLBYSURROUND: snprintf(buf, sizeof(buf), "%s", tr("On")); break;
case DSM_RESERVED: snprintf(buf, sizeof(buf), "%s", tr("reserved")); break;
default: snprintf(buf, sizeof(buf), "---");
}
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Low Frequency Effects"), clrWhite, clrBackground, m_InfoWindow);
snprintf(buf, sizeof(buf), "%s", m_Receiver->AC3LfeOn() ? tr("On") : tr("Off"));
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dialogue Normalization"), clrWhite, clrBackground, m_InfoWindow);
value = m_Receiver->AC3DialogLevel();
if (value > 0) snprintf(buf, sizeof(buf), "-%d %s", value, tr("dB"));
else snprintf(buf, sizeof(buf), "---");
m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow);
offset += cOsd::LineHeight() - DELTA;
}
} }
else /* modeBasic */ { else /* modeBasic */ {
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, m_InfoWindow); m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent);
} }
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION)
m_Osd->SetFont(OldFont);
#endif
m_Osd->Flush(); m_Osd->Flush();
} }
} }
@@ -572,9 +511,6 @@ void cFemonOsd::DrawInfoWindow(void)
void cFemonOsd::Action(void) void cFemonOsd::Action(void)
{ {
//printf("cFemonOsd::Action()\n"); //printf("cFemonOsd::Action()\n");
#if (VDRVERSNUM < 10300)
isyslog("femon plugin: thread started (pid = %d)", getpid());
#endif
m_Active = true; m_Active = true;
while (m_Active) { while (m_Active) {
if (m_Frontend != -1) { if (m_Frontend != -1) {
@@ -591,9 +527,6 @@ void cFemonOsd::Action(void)
} }
usleep(100000L * femonConfig.updateinterval); usleep(100000L * femonConfig.updateinterval);
} }
#if (VDRVERSNUM < 10300)
isyslog("femon plugin: thread stopped (pid = %d)", getpid());
#endif
} }
void cFemonOsd::Show(void) void cFemonOsd::Show(void)
@@ -614,24 +547,25 @@ void cFemonOsd::Show(void)
m_Frontend = -1; m_Frontend = -1;
return; return;
} }
m_Osd = cOsd::OpenRaw((SCREENWIDTH - OSDWIDTH) / 2, (SCREENHEIGHT - OSDHEIGHT) / 2); m_Osd = cOsdProvider::NewOsd(((Setup.OSDWidth - OSDWIDTH) / 2) + Setup.OSDLeft, ((Setup.OSDHeight - OSDHEIGHT) / 2) + Setup.OSDTop);
if (m_Osd) { if (m_Osd) {
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) tArea Areas[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, 4 } };
eDvbFont OldFont = m_Osd->SetFont(m_Font); if (m_Osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)) == oeOk) {
#endif m_Osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
m_StatusWindow = m_Osd->Create(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSHEIGHT, 4); }
m_InfoWindow = m_Osd->Create(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOHEIGHT, 2); else {
m_Osd->Clear(); tArea Areas[] = { { 0, OSDSTATUSWIN_Y(0), (OSDWIDTH-1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-1), 4 },
m_Osd->Fill(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, m_InfoWindow); { 0, OSDINFOWIN_Y(0), (OSDWIDTH-1), OSDINFOWIN_Y(OSDINFOHEIGHT-1), 2 }
#if (VDRVERSNUM >= 10300) || defined(ELCHIAIOVERSION) };
m_Osd->SetFont(OldFont); m_Osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
#endif }
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent);
m_Osd->Flush(); m_Osd->Flush();
if (m_Receiver) if (m_Receiver)
delete m_Receiver; delete m_Receiver;
if (femonConfig.analyzestream) { if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); int channelNumber = cDevice::CurrentChannel();
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), channel->Apid1(), channel->Dpid1()); m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1());
cDevice::ActualDevice()->AttachReceiver(m_Receiver); cDevice::ActualDevice()->AttachReceiver(m_Receiver);
} }
Start(); Start();
@@ -662,8 +596,8 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
if (m_Receiver) if (m_Receiver)
delete m_Receiver; delete m_Receiver;
if (femonConfig.analyzestream) { if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); channelNumber = cDevice::CurrentChannel();
m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), channel->Apid1(), channel->Dpid1()); m_Receiver = new cFemonReceiver(Channels.GetByNumber(channelNumber)->Ca(), Channels.GetByNumber(channelNumber)->Vpid(), Channels.GetByNumber(channelNumber)->Apid1());
cDevice::ActualDevice()->AttachReceiver(m_Receiver); cDevice::ActualDevice()->AttachReceiver(m_Receiver);
} }
} }
@@ -734,9 +668,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
} }
break; break;
case kOk: case kOk:
// toggle between display modes if (++m_DisplayMode >= modeMaxNumber) m_DisplayMode = 0; // toggle between display modes
if (++m_DisplayMode == modeAC3 && !Channels.GetByNumber(cDevice::CurrentChannel())->Dpid1()) m_DisplayMode++;
if (m_DisplayMode >= modeMaxNumber) m_DisplayMode = 0;
DrawInfoWindow(); DrawInfoWindow();
break; break;
default: default:

View File

@@ -16,14 +16,11 @@
#include <vdr/thread.h> #include <vdr/thread.h>
#include <vdr/status.h> #include <vdr/status.h>
#include <vdr/channels.h> #include <vdr/channels.h>
#include <vdr/font.h>
class cFemonOsd : public cOsdObject, public cThread, public cStatus { class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private: private:
bool m_Active; bool m_Active;
cOsdBase *m_Osd; cOsd *m_Osd;
tWindowHandle m_InfoWindow;
tWindowHandle m_StatusWindow;
cFemonReceiver *m_Receiver; cFemonReceiver *m_Receiver;
int m_Frontend; int m_Frontend;
struct dvb_frontend_info m_FrontendInfo; struct dvb_frontend_info m_FrontendInfo;
@@ -36,8 +33,9 @@ private:
uint32_t m_UNC; uint32_t m_UNC;
fe_status_t m_FrontendStatus; fe_status_t m_FrontendStatus;
int m_DisplayMode; int m_DisplayMode;
eDvbFont m_Font; const cFont *m_Font;
cMutex* m_Mutex; cMutex* m_Mutex;
static cBitmap bmPAL, bmNTSC, bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3;
void DrawStatusWindow(void); void DrawStatusWindow(void);
void DrawInfoWindow(void); void DrawInfoWindow(void);

View File

@@ -16,19 +16,13 @@
#define PAYLOAD 0x10 #define PAYLOAD 0x10
#define PTS_DTS_FLAGS 0xC0 #define PTS_DTS_FLAGS 0xC0
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid) cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid)
#if VDRVERSNUM >= 10300 :cReceiver(Ca, -1, 2, Vpid, Apid), cThread("femon receiver")
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid), cThread("femon receiver")
#else
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid)
#endif
{ {
//printf("cFemonReceiver::cFemonReceiver()\n"); //printf("cFemonReceiver::cFemonReceiver()\n");
m_Active = false; m_Active = false;
m_VideoPid = Vpid; m_VideoPid = Vpid;
m_AudioPid = Apid; m_AudioPid = Apid;
m_AC3Pid = Dpid;
m_VideoValid = false;
m_VideoPacketCount = 0; m_VideoPacketCount = 0;
m_VideoHorizontalSize = 0; m_VideoHorizontalSize = 0;
m_VideoVerticalSize = 0; m_VideoVerticalSize = 0;
@@ -37,26 +31,13 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid)
m_VideoFrameRate = 0.0; m_VideoFrameRate = 0.0;
m_VideoStreamBitrate = 0.0; m_VideoStreamBitrate = 0.0;
m_VideoBitrate = 0.0; m_VideoBitrate = 0.0;
m_AudioValid = false;
m_AudioPacketCount = 0; m_AudioPacketCount = 0;
m_AudioStreamBitrate = -2.0; m_AudioStreamBitrate = -2.0;
m_AudioBitrate = 0.0; m_AudioBitrate = 0.0;
m_AudioSamplingFreq = -1; m_AudioSamplingFreq = -1;
m_AudioMPEGLayer = 0; m_AudioMPEGLayer = 0;
m_AudioBitrate = 0.0; m_AudioBitrate = 0.0;
m_AC3Valid = false;
m_AC3PacketCount = 0;
m_AC3StreamBitrate = 0;
m_AC3SamplingFreq = 0;
m_AC3Bitrate = 0;
m_AC3FrameSize = 0;
m_AC3BitStreamMode = FR_NOTVALID;
m_AC3AudioCodingMode = FR_NOTVALID;
m_AC3CenterMixLevel = FR_NOTVALID;
m_AC3SurroundMixLevel = FR_NOTVALID;
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = false;
m_AC3DialogLevel = FR_NOTVALID;
} }
cFemonReceiver::~cFemonReceiver(void) cFemonReceiver::~cFemonReceiver(void)
@@ -68,29 +49,29 @@ cFemonReceiver::~cFemonReceiver(void)
} }
} }
/* The following function originates from libdvbmpeg: */ /* the following function originates from libdvbmpeg: */
void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count) void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
{ {
//printf("cFemonReceiver::GetVideoInfo()\n"); //printf("cFemonReceiver::GetVideoInfo()\n");
uint8_t *headr; uint8_t *headr;
int found = 0; int found = 0;
int c = 0; int c = 0;
m_VideoValid = false; while (found < 4 && c + 4 < count) {
while ((found < 4) && ((c + 4) < count)) {
uint8_t *b; uint8_t *b;
b = mbuf + c; b = mbuf + c;
if ((b[0] == 0x00) && (b[1] == 0x00) && (b[2] == 0x01) && (b[3] == 0xb3)) if (b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01 && b[3] == 0xb3)
found = 4; found = 4;
else else
c++; c++;
} }
if ((!found) || ((c + 16) >= count)) return; if (!found) return;
m_VideoValid = true; c += 4;
headr = mbuf + c + 4; if (c + 12 >= count) return;
m_VideoHorizontalSize = ((headr[1] & 0xF0) >> 4) | (headr[0] << 4); headr = mbuf + c;
m_VideoVerticalSize = ((headr[1] & 0x0F) << 8) | (headr[2]); m_VideoHorizontalSize = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
m_VideoVerticalSize = ((headr[1] &0x0F) << 8) | (headr[2]);
int sw = (int)((headr[3] & 0xF0) >> 4); int sw = (int)((headr[3] & 0xF0) >> 4);
switch ( sw ){ switch( sw ){
case 1: case 1:
m_VideoAspectRatio = AR_1_1; m_VideoAspectRatio = AR_1_1;
break; break;
@@ -104,14 +85,15 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
m_VideoAspectRatio = AR_2_21_1; m_VideoAspectRatio = AR_2_21_1;
break; break;
case 5 ... 15: case 5 ... 15:
default:
m_VideoAspectRatio = AR_RESERVED; m_VideoAspectRatio = AR_RESERVED;
break; break;
default:
return;
} }
sw = (int)(headr[3] & 0x0F); sw = (int)(headr[3] & 0x0F);
switch ( sw ) { switch ( sw ) {
case 1: case 1:
m_VideoFrameRate = 24000 / 1001.0; m_VideoFrameRate = 24000/1001.0;
m_VideoFormat = VF_UNKNOWN; m_VideoFormat = VF_UNKNOWN;
break; break;
case 2: case 2:
@@ -123,7 +105,7 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
m_VideoFormat = VF_PAL; m_VideoFormat = VF_PAL;
break; break;
case 4: case 4:
m_VideoFrameRate = 30000 / 1001.0; m_VideoFrameRate = 30000/1001.0;
m_VideoFormat = VF_NTSC; m_VideoFormat = VF_NTSC;
break; break;
case 5: case 5:
@@ -138,15 +120,6 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
m_VideoFrameRate = 60.0; m_VideoFrameRate = 60.0;
m_VideoFormat = VF_NTSC; m_VideoFormat = VF_NTSC;
break; break;
case 8:
m_VideoFrameRate = 60000 / 1001.0;
m_VideoFormat = VF_NTSC;
break;
case 9 ... 15:
default:
m_VideoFrameRate = 0;
m_VideoFormat = VF_UNKNOWN;
break;
} }
m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0; m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0;
} }
@@ -158,10 +131,9 @@ static unsigned int bitrates[3][16] =
{0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0} {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}
}; };
static unsigned int samplerates[4] = static unsigned int samplerates[4] = {441, 480, 320, 0};
{441, 480, 320, 0};
/* The following function originates from libdvbmpeg: */ /* the following function originates from libdvbmpeg: */
void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count) void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
{ {
//printf("cFemonReceiver::GetAudioInfo()\n"); //printf("cFemonReceiver::GetAudioInfo()\n");
@@ -169,16 +141,15 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
int found = 0; int found = 0;
int c = 0; int c = 0;
int tmp = 0; int tmp = 0;
m_AudioValid = false; while (!found && c < count) {
while (!found && (c < count)) {
uint8_t *b = mbuf + c; uint8_t *b = mbuf + c;
if ((b[0] == 0xff) && ((b[1] & 0xf8) == 0xf8)) if (b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
found = 1; found = 1;
else else
c++; c++;
} }
if ((!found) || ((c + 3) >= count)) return; if (!found) return;
m_AudioValid = true; if (c + 3 >= count) return;
headr = mbuf + c; headr = mbuf + c;
m_AudioMPEGLayer = 4 - ((headr[1] & 0x06) >> 1); m_AudioMPEGLayer = 4 - ((headr[1] & 0x06) >> 1);
tmp = bitrates[(3 - ((headr[1] & 0x06) >> 1))][(headr[2] >> 4)] * 1000; tmp = bitrates[(3 - ((headr[1] & 0x06) >> 1))][(headr[2] >> 4)] * 1000;
@@ -195,65 +166,6 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
m_AudioSamplingFreq = tmp; m_AudioSamplingFreq = tmp;
} }
static unsigned int ac3_bitrates[32] =
{32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
static unsigned int ac3_freq[4] =
{480, 441, 320, 0};
static unsigned int ac3_frames[3][32] =
{
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
/*
** AC3 Audio Header: http://www.atsc.org/standards/a_52a.pdf
** The following function originates from libdvbmpeg:
*/
void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count)
{
uint8_t *headr;
int found = 0;
int c = 0;
uint8_t frame;
m_AC3Valid = false;
while (!found && (c < count)) {
uint8_t *b = mbuf + c;
if ((b[0] == 0x0b) && (b[1] == 0x77))
found = 1;
else
c++;
}
if ((!found) || ((c + 5) >= count)) return;
m_AC3Valid = true;
headr = mbuf + c + 2;
frame = (headr[2] & 0x3f);
m_AC3StreamBitrate = ac3_bitrates[frame >> 1];
int fr = (headr[2] & 0xc0 ) >> 6;
m_AC3SamplingFreq = ac3_freq[fr] * 100;
m_AC3FrameSize = ac3_frames[fr][frame >> 1];
if ((frame & 1) && (fr == 1)) m_AC3FrameSize++;
m_AC3FrameSize <<= 1;
m_AC3BitStreamMode = (headr[3] & 7);
m_AC3AudioCodingMode = (headr[4] & 0xE0) >> 5;
if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) // if 3 front channels
m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3;
else
m_AC3CenterMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode & 0x04) // if a surround channel exists
m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1;
else
m_AC3SurroundMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode == 0x02) // if in 2/0 mode
m_AC3DolbySurroundMode = ((headr[4] & 1) << 1) | ((headr[5] & 0x80) >> 7);
else
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = (headr[5] & 0x40) >> 6;
m_AC3DialogLevel = (headr[5] & 0x3e) >> 1;
}
void cFemonReceiver::Activate(bool On) void cFemonReceiver::Activate(bool On)
{ {
//printf("cFemonReceiver::Activate()\n"); //printf("cFemonReceiver::Activate()\n");
@@ -272,9 +184,6 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
else if (pid == m_AudioPid) { else if (pid == m_AudioPid) {
m_AudioPacketCount++; m_AudioPacketCount++;
} }
else if (pid == m_AC3Pid) {
m_AC3PacketCount++;
}
/* the following originates from libdvbmpeg: */ /* the following originates from libdvbmpeg: */
if (!(Data[3] & PAYLOAD)) { if (!(Data[3] & PAYLOAD)) {
return; return;
@@ -291,12 +200,9 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
if (pid == m_VideoPid) { if (pid == m_VideoPid) {
GetVideoInfo(pay, l); GetVideoInfo(pay, l);
} }
else if (pid == m_AudioPid) { if (pid == m_AudioPid) {
GetAudioInfo(pay, l); GetAudioInfo(pay, l);
} }
else if (pid == m_AC3Pid) {
GetAC3Info(pay, l);
}
} }
} }
/* end */ /* end */
@@ -306,9 +212,6 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
void cFemonReceiver::Action(void) void cFemonReceiver::Action(void)
{ {
//printf("cFemonReceiver::Action()\n"); //printf("cFemonReceiver::Action()\n");
#if (VDRVERSNUM < 10300)
isyslog("femon receiver: thread started (pid = %d)", getpid());
#endif
m_Active = true; m_Active = true;
while (m_Active) { while (m_Active) {
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit // TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
@@ -316,11 +219,6 @@ void cFemonReceiver::Action(void)
m_VideoPacketCount = 0; m_VideoPacketCount = 0;
m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0); m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0);
m_AudioPacketCount = 0; m_AudioPacketCount = 0;
m_AC3Bitrate = (8.0 * 184.0 * m_AC3PacketCount) / (femonConfig.calcinterval * 100.0);
m_AC3PacketCount = 0;
usleep(100000L * femonConfig.calcinterval); usleep(100000L * femonConfig.calcinterval);
} }
#if (VDRVERSNUM < 10300)
isyslog("femon receiver: thread stopped (pid = %d)", getpid());
#endif
} }

View File

@@ -26,68 +26,29 @@ enum eAspectRatio {
AR_2_21_1 = 233, AR_2_21_1 = 233,
}; };
enum eCenterMixLevel { #define FR_RESERVED -1
CML_MINUS_3dB = 0, #define FR_FREE -2
CML_MINUS_4_5dB = 1,
CML_MINUS_6dB = 2,
CML_RESERVED = 3,
};
enum eSurroundMixLevel {
SML_MINUS_3dB = 0,
SML_MINUS_6dB = 1,
SML_0_dB = 2,
SML_RESERVED = 3,
};
enum eDolbySurroundMode {
DSM_NOT_INDICATED = 0,
DSM_NOT_DOLBYSURROUND = 1,
DSM_DOLBYSURROUND = 2,
DSM_RESERVED = 3,
};
#define FR_RESERVED -1
#define FR_FREE -2
#define FR_NOTVALID -3
class cFemonReceiver : public cReceiver, public cThread { class cFemonReceiver : public cReceiver, public cThread {
private: private:
bool m_Active; bool m_Active;
int m_VideoPid; int m_VideoPid;
int m_AudioPid; int m_AudioPid;
int m_AC3Pid; int m_VideoPacketCount;
bool m_VideoValid; int m_VideoHorizontalSize;
int m_VideoPacketCount; int m_VideoVerticalSize;
int m_VideoHorizontalSize; int m_VideoAspectRatio;
int m_VideoVerticalSize; int m_VideoFormat;
int m_VideoAspectRatio;
int m_VideoFormat;
double m_VideoFrameRate; double m_VideoFrameRate;
double m_VideoStreamBitrate; double m_VideoStreamBitrate;
double m_VideoBitrate; double m_VideoBitrate;
bool m_AudioValid; int m_AudioPacketCount;
int m_AudioPacketCount;
double m_AudioStreamBitrate; double m_AudioStreamBitrate;
double m_AudioBitrate; double m_AudioBitrate;
int m_AudioSamplingFreq; int m_AudioSamplingFreq;
int m_AudioMPEGLayer; int m_AudioMPEGLayer;
bool m_AC3Valid; void GetVideoInfo(uint8_t *mbuf, int count);
int m_AC3PacketCount; void GetAudioInfo(uint8_t *mbuf, int count);
double m_AC3Bitrate;
int m_AC3FrameSize;
int m_AC3SamplingFreq;
int m_AC3StreamBitrate;
int m_AC3BitStreamMode;
int m_AC3AudioCodingMode;
int m_AC3CenterMixLevel;
int m_AC3SurroundMixLevel;
int m_AC3DolbySurroundMode;
bool m_AC3LfeOn;
int m_AC3DialogLevel;
void GetVideoInfo(uint8_t *mbuf, int count);
void GetAudioInfo(uint8_t *mbuf, int count);
void GetAC3Info(uint8_t *mbuf, int count);
protected: protected:
virtual void Activate(bool On); virtual void Activate(bool On);
@@ -95,10 +56,9 @@ protected:
virtual void Action(void); virtual void Action(void);
public: public:
cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid); cFemonReceiver(int Ca, int Vpid, int Apid);
virtual ~cFemonReceiver(); virtual ~cFemonReceiver();
bool VideoValid(void) { return m_VideoValid; }; // boolean
int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels
int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels
int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // eAspectRatio int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // eAspectRatio
@@ -107,26 +67,10 @@ public:
double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // Mbit/s double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // Mbit/s
double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s
bool AudioValid(void) { return m_AudioValid; }; // boolean
int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // layer number int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // layer number
int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz
double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // kbit/s double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // kbit/s
double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s
bool AC3Valid(void) { return m_AC3Valid; }; // boolean
int AC3SamplingFreq(void) { return m_AC3SamplingFreq; }; // Hz
double AC3StreamBitrate(void) { return m_AC3StreamBitrate; }; // kbit/s
double AC3Bitrate(void) { return m_AC3Bitrate; }; // kbit/s
int AC3FrameSize(void) { return m_AC3FrameSize; }; // Bytes
int AC3BitStreamMode(void) { return m_AC3BitStreamMode; }; // 0..7
int AC3AudioCodingMode(void) { return m_AC3AudioCodingMode; }; // 0..7
bool AC3_2_0(void) { return m_AC3AudioCodingMode == 2; }; // DD 2.0
bool AC3_5_1(void) { return m_AC3AudioCodingMode == 7; }; // DD 5.1
int AC3CenterMixLevel(void) { return m_AC3CenterMixLevel; }; // eCenterMixLevel
int AC3SurroundMixLevel(void) { return m_AC3SurroundMixLevel; }; // eSurroundMixLevel
int AC3DolbySurroundMode(void) { return m_AC3DolbySurroundMode; }; // eDolbySurroundMode
bool AC3LfeOn(void) { return m_AC3LfeOn; }; // boolean
int AC3DialogLevel(void) { return m_AC3DialogLevel; }; // -dB
}; };
#endif //__FEMONRECEIVER_H #endif //__FEMONRECEIVER_H

23
symbols/ar11.xpm Normal file
View File

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

23
symbols/ar169.xpm Normal file
View File

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

23
symbols/ar2211.xpm Normal file
View File

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

23
symbols/ar43.xpm Normal file
View File

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

23
symbols/ntsc.xpm Normal file
View File

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

23
symbols/pal.xpm Normal file
View File

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