@@ -132,6 +132,8 @@ const char **cPluginFemon::SVDRPHelpPage
" Switch to previous possible device.",
"NAME\n"
" Print the current frontend name.",
+ "INFO\n"
+ " Print the current frontend info.",
"STAT\n"
" Print the current frontend status.",
"SGNL\n"
@@ -180,6 +184,14 @@ cString cPluginFemon::SVDRPCommand(const
else if (strcasecmp(Command, "NAME") == 0) {
return getFrontendName(cDevice::ActualDevice()->CardIndex());
}
+ else if (strcasecmp(Command, "INFO") == 0) {
+ cString str = getFrontendInfo(atoi(Option));
+ if (!str) {
+ ReplyCode = 550;
+ return cString("Card not found.");
+ }
+ else return str;
+ }
else if (strcasecmp(Command, "STAT") == 0) {
return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
}
@@ -0,0 +1,289 @@
+/*
+ * Frontend Status Monitor plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+
+#ifndef __FEMONCONV_H
+#define __FEMONCONV_H
+
+#ifndef ctr
+#define ctr tr
+#endif
+
+static inline
+cString convCA(int value)
+{
+ cString str;
+
+ /* http://www.dvb.org/index.php?id=174 */
+ switch (value) {
+ case 0x0000:
+ /* Reserved */
+ str = cString(ctr("Free to Air"));
+ break;
+ case 0x0001 ... 0x00FF:
+ /* Standardized systems */
+ if ((value == 0x00A0) || (value == 0x00A1))
+ str = cString(ctr("Analog"));
+ else
+ str = cString(ctr("Fixed"));
+ break;
+ case 0x0100 ... 0x01FF:
+ /* Canal Plus */
+ str = cString(ctr("SECA/Mediaguard"));
+ break;
+ case 0x0500 ... 0x05FF:
+ /* France Telecom */
+ str = cString(ctr("Viaccess"));
+ break;
+ case 0x0600 ... 0x06FF:
+ /* Irdeto */
+ str = cString(ctr("Irdeto"));
+ break;
+ case 0x0900 ... 0x09FF:
+ /* News Datacom */
+ str = cString(ctr("NDS/Videoguard"));
+ break;
+ case 0x0B00 ... 0x0BFF:
+ /* Norwegian Telekom */
+ str = cString(ctr("Conax"));
+ break;
+ case 0x0D00 ... 0x0DFF:
+ /* Philips */
+ str = cString(ctr("CryptoWorks"));
+ break;
+ case 0x0E00 ... 0x0EFF:
+ /* Scientific Atlanta */
+ str = cString(ctr("PowerVu"));
+ break;
+ case 0x1200 ... 0x12FF:
+ /* BellVu Express */
+ str = cString(ctr("NagraVision"));
+ break;
+ case 0x1700 ... 0x17FF:
+ /* BetaTechnik */
+ str = cString(ctr("BetaCrypt"));
+ break;
+ case 0x1800 ... 0x18FF:
+ /* Kudelski SA */
+ str = cString(ctr("NagraVision"));
+ break;
+ case 0x4A60 ... 0x4A6F:
+ /* @Sky */
+ str = cString(ctr("SkyCrypt"));
+ break;
+ default:
+ str = cString::sprintf("%X", value);
+ break;
+ }
+ return str;
+}
+
+static inline
+cString convCoderate(int value)
+{
+ cString str;
+
+ if (value == FEC_NONE) str = cString(ctr("None"));
+ else if (value == FEC_1_2) str = cString("1/2");
+ else if (value == FEC_2_3) str = cString("2/3");
+ else if (value == FEC_3_4) str = cString("3/4");
+ else if (value == FEC_4_5) str = cString("4/5");
+ else if (value == FEC_5_6) str = cString("5/6");
+ else if (value == FEC_6_7) str = cString("6/7");
+ else if (value == FEC_7_8) str = cString("7/8");
+ else if (value == FEC_8_9) str = cString("8/9");
+ else /*FEC_AUTO*/ str = cString(ctr("Auto"));
+ return str;
+}
+
+static inline
+cString convTransmission(int value)
+{
+ cString str;
+
+ if (value == TRANSMISSION_MODE_2K) str = cString("2K");
+ else if (value == TRANSMISSION_MODE_8K) str = cString("8K");
+ else /*TRANSMISSION_MODE_AUTO*/ str = cString(ctr("Auto"));
+ return str;
+}
+
+static inline
+cString convBandwidth(int value)
+{
+ cString str;
+
+ if (value == BANDWIDTH_8_MHZ) str = cString("8 %s", ctr("MHz"));
+ else if (value == BANDWIDTH_7_MHZ) str = cString("7 %s", ctr("MHz"));
+ else if (value == BANDWIDTH_6_MHZ) str = cString("6 %s", ctr("MHz"));
+ else /*BANDWIDTH_AUTO*/ str = cString(ctr("Auto"));
+ return str;
+}
+
+static inline
+cString convInversion(int value)
+{
+ cString str;
+
+ if (value == INVERSION_OFF) str = cString(ctr("Off"));
+ else if (value == INVERSION_ON) str = cString(ctr("On"));
+ else /*INVERSION_AUTO*/ str = cString(ctr("Auto"));
+ return str;
+}
+
+static inline
+cString convHierarchy(int value)
+{
+ cString str;
+
+ if (value == HIERARCHY_NONE) str = cString(ctr("None"));
+ else if (value == HIERARCHY_1) str = cString("1");
+ else if (value == HIERARCHY_2) str = cString("2");
+ else if (value == HIERARCHY_4) str = cString("4");
+ else /*HIERARCHY_AUTO*/ str = cString(ctr("Auto"));
+ return str;
+}
+
+static inline
+cString convGuard(int value)
+{
+ cString str;
+
+ if (value == GUARD_INTERVAL_1_32) str = cString("1/32");
+ else if (value == GUARD_INTERVAL_1_16) str = cString("1/16");
+ else if (value == GUARD_INTERVAL_1_8) str = cString("1/8");
+ else if (value == GUARD_INTERVAL_1_4) str = cString("1/4");
+ else /*GUARD_INTERVAL_AUTO*/ str = cString(ctr("Auto"));
+ return str;
+}
+
+static inline
+cString convModulation(int value)
+{
+ cString str;
+
+ if (value == QPSK) str = cString("QPSK");
+ else if (value == QAM_16) str = cString("QAM 16");
+ else if (value == QAM_32) str = cString("QAM 32");
+ else if (value == QAM_64) str = cString("QAM 64");
+ else if (value == QAM_128) str = cString("QAM 128");
+ else if (value == QAM_256) str = cString("QAM 256");
+ else /*QAM_AUTO*/ str = cString::sprintf("QAM %s", ctr("Auto"));
+ return str;
+}
+
+static inline
+cString convAspectRatio(int value)
+{
+ cString str;
+
+ if (value == AR_1_1) str = cString("1:1");
+ else if (value == AR_4_3) str = cString("4:3");
+ else if (value == AR_16_9) str = cString("16:9");
+ else if (value == AR_2_21_1) str = cString("2.21:1");
+ else str = cString(ctr("reserved"));
+ return str;
+}
+
+static inline
+cString convVideoFormat(int value)
+{
+ cString str;
+
+ if (value == VF_PAL) str = cString(ctr("PAL"));
+ else if (value == VF_NTSC) str = cString(ctr("NTSC"));
+ else str = cString(ctr("unknown"));
+ return str;
+}
+
+static inline
+cString convAC3BitStreamMode(int value, int mode)
+{
+ cString str;
+
+ switch (value) {
+ case 0: str = cString(ctr("Complete Main (CM)")); break;
+ case 1: str = cString(ctr("Music and Effects (ME)")); break;
+ case 2: str = cString(ctr("Visually Impaired (VI)")); break;
+ case 3: str = cString(ctr("Hearing Impaired (HI)")); break;
+ case 4: str = cString(ctr("Dialogue (D)")); break;
+ case 5: str = cString(ctr("Commentary (C)")); break;
+ case 6: str = cString(ctr("Emergency (E)")); break;
+ case 7: str = (mode == 1) ? cString(ctr("Voice Over (VO)")) : cString(ctr("Karaoke")); break;
+ default: str = cString("---");
+ }
+ return str;
+}
+
+static inline
+cString convAC3AudioCodingMode(int value)
+{
+ cString str;
+
+ switch (value) {
+ case 0: str = cString::sprintf("1+1 - %s, %s", ctr("Ch1"), ctr("Ch2")); break;
+ case 1: str = cString::sprintf("1/0 - %s", ctr("C")); break;
+ case 2: str = cString::sprintf("2/0 - %s, %s", ctr("L"), ctr("R")); break;
+ case 3: str = cString::sprintf("3/0 - %s, %s, %s", ctr("L"), ctr("C"), ctr("R")); break;
+ case 4: str = cString::sprintf("2/1 - %s, %s, %s", ctr("L"), ctr("R"), ctr("S")); break;
+ case 5: str = cString::sprintf("3/1 - %s, %s, %s, %s", ctr("L"), ctr("C"), ctr("R"), ctr("S")); break;
+ case 6: str = cString::sprintf("2/2 - %s, %s, %s, %s", ctr("L"), ctr("R"), ctr("SL"), ctr("SR")); break;
+ case 7: str = cString::sprintf("3/2 - %s, %s, %s, %s, %s", ctr("L"), ctr("C"), ctr("R"), ctr("SL"), ctr("SR")); break;
+ default: str = cString("---");
+ }
+ return str;
+}
+
+static inline
+cString convAC3CenterMixLevel(int value)
+{
+ cString str;
+
+ switch (value) {
+ case CML_MINUS_3dB: str = cString::sprintf("-3.0 %s", ctr("dB")); break;
+ case CML_MINUS_4_5dB: str = cString::sprintf("-4.5 %s", ctr("dB")); break;
+ case CML_MINUS_6dB: str = cString::sprintf("-6.0 %s", ctr("dB")); break;
+ case CML_RESERVED: str = cString(ctr("reserved")); break;
+ default: str = cString("---");
+ }
+ return str;
+}
+
+static inline
+cString convAC3SurroundMixLevel(int value)
+{
+ cString str;
+
+ switch (value) {
+ case SML_MINUS_3dB: str = cString::sprintf("-3 %s", ctr("dB")); break;
+ case SML_MINUS_6dB: str = cString::sprintf("-6 %s", ctr("dB")); break;
+ case SML_0_dB: str = cString::sprintf("0 %s", ctr("dB")); break;
+ case SML_RESERVED: str = cString(ctr("reserved")); break;
+ default: str = cString("---");
+ }
+ return str;
+}
+
+static inline
+cString convAC3DolbySurroundMode(int value)
+{
+ cString str;
+
+ switch (value) {
+ case DSM_NOT_INDICATED: str = cString(ctr("not indicated")); break;
+ case DSM_NOT_DOLBYSURROUND: str = cString(ctr("no")); break;
+ case DSM_DOLBYSURROUND: str = cString(ctr("yes")); break;
+ case DSM_RESERVED: str = cString(ctr("reserved")); break;
+ default: str = cString("---");
+ }
+ return str;
+}
+
+
+
+
+
+#endif // __FEMONCONV_H
@@ -12,6 +12,7 @@
#include "femonreceiver.h"
#include "femontools.h"
#include "femonosd.h"
+#include "femonconv.h"
#include "symbols/device.xpm"
#include "symbols/stereo.xpm"
@@ -412,69 +413,8 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- value = channel->Ca();
if (femonConfig.showcasystem) {
- /* http://www.dvb.org/index.php?id=174 */
- switch (value) {
- case 0x0000:
- /* Reserved */
- snprintf(buf, sizeof(buf), "%s", tr("Free to Air"));
- break;
- case 0x0001 ... 0x00FF:
- /* Standardized systems */
- if ((value == 0x00A0) || (value == 0x00A1))
- snprintf(buf, sizeof(buf), "%s", tr("Analog"));
- else
- snprintf(buf, sizeof(buf), "%s", tr("Fixed"));
- break;
- case 0x0100 ... 0x01FF:
- /* Canal Plus */
- snprintf(buf, sizeof(buf), "%s", tr("SECA/Mediaguard"));
- break;
- case 0x0500 ... 0x05FF:
- /* France Telecom */
- snprintf(buf, sizeof(buf), "%s", tr("Viaccess"));
- break;
- case 0x0600 ... 0x06FF:
- /* Irdeto */
- snprintf(buf, sizeof(buf), "%s", tr("Irdeto"));
- break;
- case 0x0900 ... 0x09FF:
- /* News Datacom */
- snprintf(buf, sizeof(buf), "%s", tr("NDS/Videoguard"));
- break;
- case 0x0B00 ... 0x0BFF:
- /* Norwegian Telekom */
- snprintf(buf, sizeof(buf), "%s", tr("Conax"));
- break;
- case 0x0D00 ... 0x0DFF:
- /* Philips */
- snprintf(buf, sizeof(buf), "%s", tr("CryptoWorks"));
- break;
- case 0x0E00 ... 0x0EFF:
- /* Scientific Atlanta */
- snprintf(buf, sizeof(buf), "%s", tr("PowerVu"));
- break;
- case 0x1200 ... 0x12FF:
- /* BellVu Express */
- snprintf(buf, sizeof(buf), "%s", tr("NagraVision"));
- break;
- case 0x1700 ... 0x17FF:
- /* BetaTechnik */
- snprintf(buf, sizeof(buf), "%s", tr("BetaCrypt"));
- break;
- case 0x1800 ... 0x18FF:
- /* Kudelski SA */
- snprintf(buf, sizeof(buf), "%s", tr("NagraVision"));
- break;
- case 0x4A60 ... 0x4A6F:
- /* @Sky */
- snprintf(buf, sizeof(buf), "%s", tr("SkyCrypt"));
- break;
- default:
- snprintf(buf, sizeof(buf), "%X", value);
- break;
- }
+ snprintf(buf, sizeof(buf), "%s", *convCA(channel->Ca()));
}
else {
snprintf(buf, sizeof(buf), "%X", value);
@@ -525,23 +465,10 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convInversion(channel->Inversion()));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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");
- else if (value == FEC_2_3) snprintf(buf, sizeof(buf), "2/3");
- else if (value == FEC_3_4) snprintf(buf, sizeof(buf), "3/4");
- else if (value == FEC_4_5) snprintf(buf, sizeof(buf), "4/5");
- else if (value == FEC_5_6) snprintf(buf, sizeof(buf), "5/6");
- else if (value == FEC_6_7) snprintf(buf, sizeof(buf), "6/7");
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convCoderate(channel->CoderateH()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
break;
@@ -562,34 +489,14 @@ void cFemonOsd::DrawInfoWindow(void)
snprintf(buf, sizeof(buf), "%d", channel->Srate());
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- value = channel->Modulation();
- if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK");
- else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16");
- else if (value == QAM_32) snprintf(buf, sizeof(buf), "QAM 32");
- else if (value == QAM_64) snprintf(buf, sizeof(buf), "QAM 64");
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convModulation(channel->Modulation()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convInversion(channel->Inversion()));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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");
- else if (value == FEC_2_3) snprintf(buf, sizeof(buf), "2/3");
- else if (value == FEC_3_4) snprintf(buf, sizeof(buf), "3/4");
- else if (value == FEC_4_5) snprintf(buf, sizeof(buf), "4/5");
- else if (value == FEC_5_6) snprintf(buf, sizeof(buf), "5/6");
- else if (value == FEC_6_7) snprintf(buf, sizeof(buf), "6/7");
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convCoderate(channel->CoderateH()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
break;
@@ -603,77 +510,28 @@ void cFemonOsd::DrawInfoWindow(void)
snprintf(buf, sizeof(buf), "%d %s", value, tr("MHz"));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Transmission"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convTransmission(channel->Transmission()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bandwidth"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convBandwidth(channel->Bandwidth()));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- value = channel->Modulation();
- if (value == QPSK) snprintf(buf, sizeof(buf), "QPSK");
- else if (value == QAM_16) snprintf(buf, sizeof(buf), "QAM 16");
- else if (value == QAM_32) snprintf(buf, sizeof(buf), "QAM 32");
- else if (value == QAM_64) snprintf(buf, sizeof(buf), "QAM 64");
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convModulation(channel->Modulation()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convInversion(channel->Inversion()));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Coderate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- value = channel->CoderateH();
- if (value == FEC_NONE) snprintf(buf, sizeof(buf), "%s (H)", tr("None"));
- else if (value == FEC_1_2) snprintf(buf, sizeof(buf), "1/2 (H)");
- else if (value == FEC_2_3) snprintf(buf, sizeof(buf), "2/3 (H)");
- else if (value == FEC_3_4) snprintf(buf, sizeof(buf), "3/4 (H)");
- else if (value == FEC_4_5) snprintf(buf, sizeof(buf), "4/5 (H)");
- else if (value == FEC_5_6) snprintf(buf, sizeof(buf), "5/6 (H)");
- else if (value == FEC_6_7) snprintf(buf, sizeof(buf), "6/7 (H)");
- else if (value == FEC_7_8) snprintf(buf, sizeof(buf), "7/8 (H)");
- else if (value == FEC_8_9) snprintf(buf, sizeof(buf), "8/9 (H)");
- else /*FEC_AUTO*/ snprintf(buf, sizeof(buf), "%s (H)", tr("Auto"));
- value = channel->CoderateL();
- if (value == FEC_NONE) snprintf(buf2, sizeof(buf2), " %s (L)", tr("None"));
- else if (value == FEC_1_2) snprintf(buf2, sizeof(buf2), " 1/2 (L)");
- else if (value == FEC_2_3) snprintf(buf2, sizeof(buf2), " 2/3 (L)");
- else if (value == FEC_3_4) snprintf(buf2, sizeof(buf2), " 3/4 (L)");
- else if (value == FEC_4_5) snprintf(buf2, sizeof(buf2), " 4/5 (L)");
- else if (value == FEC_5_6) snprintf(buf2, sizeof(buf2), " 5/6 (L)");
- else if (value == FEC_6_7) snprintf(buf2, sizeof(buf2), " 6/7 (L)");
- else if (value == FEC_7_8) snprintf(buf2, sizeof(buf2), " 7/8 (L)");
- else if (value == FEC_8_9) snprintf(buf2, sizeof(buf2), " 8/9 (L)");
- else /*FEC_AUTO*/ snprintf(buf2, sizeof(buf2), " %s (L)", tr("Auto"));
- strncat(buf, buf2, sizeof(buf));
+ snprintf(buf, sizeof(buf), "%s (H) %s (L)", *convCoderate(channel->CoderateH()), *convCoderate(channel->CoderateL()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Hierarchy"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convHierarchy(channel->Hierarchy()));
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Guard"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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"));
+ snprintf(buf, sizeof(buf), "%s", *convGuard(channel->Guard()));
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
break;
}
@@ -701,15 +559,10 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Aspect Ratio"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- if (m_Receiver) {
- value = m_Receiver->VideoAspectRatio();
- if (value == AR_1_1) snprintf(buf, sizeof(buf), "1:1");
- else if (value == AR_4_3) snprintf(buf, sizeof(buf), "4:3");
- else if (value == AR_16_9) snprintf(buf, sizeof(buf), "16:9");
- else if (value == AR_2_21_1) snprintf(buf, sizeof(buf), "2.21:1");
- else snprintf(buf, sizeof(buf), "%s", tr("reserved"));
- }
- else snprintf(buf, sizeof(buf), "---");
+ if (m_Receiver)
+ snprintf(buf, sizeof(buf), "%s", *convAspectRatio(m_Receiver->VideoAspectRatio()));
+ else
+ snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Rate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
@@ -718,13 +571,10 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Format"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- if (m_Receiver) {
- value = m_Receiver->VideoFormat();
- if (value == VF_PAL) snprintf(buf, sizeof(buf), "%s", tr("PAL"));
- else if (value == VF_NTSC) snprintf(buf, sizeof(buf), "%s", tr("NTSC"));
- else snprintf(buf, sizeof(buf), "%s", tr("unknown"));
- }
- else snprintf(buf, sizeof(buf), "---");
+ if (m_Receiver)
+ snprintf(buf, sizeof(buf), "%s", *convVideoFormat(m_Receiver->VideoFormat()));
+ else
+ snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Resolution"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
@@ -788,64 +638,25 @@ void cFemonOsd::DrawInfoWindow(void)
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bit Stream Mode"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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), "---");
- }
+ snprintf(buf, sizeof(buf), "%s", *convAC3BitStreamMode(m_Receiver->AC3BitStreamMode(), m_Receiver->AC3AudioCodingMode()));
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Coding Mode"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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), "---");
+ if (m_Receiver->AC3BitStreamMode() != 7)
+ snprintf(buf, sizeof(buf), "%s", *convAC3AudioCodingMode(m_Receiver->AC3AudioCodingMode()));
+ else snprintf(buf, sizeof(buf), "---");
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Center Mix Level"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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), "---");
- }
+ snprintf(buf, sizeof(buf), "%s", *convAC3CenterMixLevel(m_Receiver->AC3CenterMixLevel()));
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Surround Mix Level"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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), "---");
- }
+ snprintf(buf, sizeof(buf), "%s", *convAC3SurroundMixLevel(m_Receiver->AC3SurroundMixLevel()));
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dolby Surround Mode"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
- 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("no")); break;
- case DSM_DOLBYSURROUND: snprintf(buf, sizeof(buf), "%s", tr("yes")); break;
- case DSM_RESERVED: snprintf(buf, sizeof(buf), "%s", tr("reserved")); break;
- default: snprintf(buf, sizeof(buf), "---");
- }
+ snprintf(buf, sizeof(buf), "%s", *convAC3DolbySurroundMode(m_Receiver->AC3DolbySurroundMode()));
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
offset += OSDROWHEIGHT;
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Low Frequency Effects"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
@@ -6,11 +6,18 @@
* $Id$
*/
+#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/dvb/frontend.h>
#include "femontools.h"
+#include "femoncfg.h"
+#include "femoni18n.h"
+#include "femonreceiver.h"
+
+#define ctr
+#include "femonconv.h"
cString getFrontendName(int cardIndex)
{
@@ -28,6 +35,90 @@ cString getFrontendName(int cardIndex)
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
}
+cString getFrontendInfo(int cardIndex)
+{
+ cString str;
+ int value;
+
+ cDevice *device = cDevice::GetDevice(cardIndex);
+ if (!device) return 0;
+ cChannel *channel = Channels.GetByNumber(device->CurrentChannel());
+
+ char *dev = NULL;
+ asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
+ int frontend = open(dev, O_RDONLY | O_NONBLOCK);
+ free(dev);
+
+ struct dvb_frontend_info frontendInfo;
+ if (frontend >= 0) {
+ if (ioctl(frontend, FE_GET_INFO, &frontendInfo) < 0)
+ frontend = 0;
+ close(frontend);
+ }
+ else frontend = 0;
+
+ int freq = channel->Frequency();
+ while (freq > 20000) freq /= 1000;
+
+ cString apid_str = cString::sprintf("%5d", channel->Apid(value=0));
+ while (channel->Apid(++value) && (value < MAXAPIDS))
+ apid_str = cString::sprintf("%s, %d", *apid_str, channel->Apid(value));
+
+ cString dpid_str = cString::sprintf("%5d", channel->Dpid(value=0));
+ while (channel->Dpid(++value) && (value < MAXDPIDS))
+ dpid_str = cString::sprintf("%s, %d", *dpid_str, channel->Dpid(value));
+
+ cString ca_str = cString::sprintf(" %04x", channel->Ca(value=0));
+ while (channel->Ca(++value) && (value < MAXCAIDS))
+ ca_str = cString::sprintf("%s, %04x", *ca_str, channel->Ca(value));
+
+ str = cString::sprintf("#%d - %s\n"
+ " Vpid: %5d Ppid: %5d Tpid: %5d\n"
+ " Sid: %5d Nid: %5d Tid: %5d Rid: %5d\n"
+ " Apid: %s\n Dpid: %s\n CA: %s",
+ device->CardIndex(), frontend?frontendInfo.name:"(unknown)",
+ channel->Vpid(), channel->Ppid(), channel->Tpid(),
+ channel->Sid(), channel->Nid(), channel->Tid(), channel->Rid(),
+ *apid_str, *dpid_str, *ca_str);
+
+ switch (frontendInfo.type) {
+ case FE_QPSK:
+ return cString::sprintf("Satellite Card %s\n\n"
+ " Frequency: %5d Mhz Source: %s\n"
+ " Srate: %5d Polarization: %c\n"
+ " Inversion: %-9s Coderate: %s\n",
+ *str, freq, *cSource::ToString(channel->Source()),
+ channel->Srate(), toupper(channel->Polarization()),
+ *convInversion(channel->Inversion()),
+ *convCoderate(channel->CoderateH()));
+
+ case FE_QAM:
+ return cString::sprintf("Cable Card %s\n\n"
+ " Frequency: %5d Mhz Source: %s\n"
+ " Srate: %5d Modulation: %s\n"
+ " Inversion: %-9s Coderate: %s\n",
+ *str, freq, *cSource::ToString(channel->Source()),
+ channel->Srate(), *convModulation(channel->Modulation()),
+ *convInversion(channel->Inversion()),
+ *convCoderate(channel->CoderateH()));
+
+ default:
+ return cString::sprintf("Terrestrial Card %s\n\n"
+ " Frequency: %5d Mhz Transmission: %s\n"
+ " Bandwidth: %-9s Modulation: %s\n"
+ " Inversion: %-9s Coderate: %s (H), %s (L)\n"
+ " Hierarchy: %-9s Guard: %s\n",
+ *str, freq, *convTransmission(channel->Transmission()),
+ *convBandwidth(channel->Bandwidth()),
+ *convModulation(channel->Modulation()),
+ *convInversion(channel->Inversion()),
+ *convCoderate(channel->CoderateH()),
+ *convCoderate(channel->CoderateL()),
+ *convHierarchy(channel->Hierarchy()),
+ *convGuard(channel->Guard()));
+ }
+}
+
cString getFrontendStatus(int cardIndex)
{
fe_status_t value;
@@ -21,6 +21,7 @@
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
cString getFrontendName(int cardIndex = 0);
+cString getFrontendInfo(int cardIndex = 0);
cString getFrontendStatus(int cardIndex = 0);
uint16_t getSNR(int cardIndex = 0);
uint16_t getSignal(int cardIndex = 0);