On Sun, Jun 18, 2006 at 07:05:12PM +0300, Rolf Ahrenberg wrote:
On Sun, 18 Jun 2006, Herbert Poetzl wrote:
the first patch moves most of the value-to-string conversions from femonosd.c to femontools.c and declares them properly in the femontools.h file. the osd part is updated to utilize them. the second patch extends the SVDRP interface of femon by a basic INFO command (which can easily be extended in the future), giving output like this:
Thanks for the patch. However, there're a few glitches in it. The INFO command should differentiate the frontend type: for example there's no polarization setting if using DVB-T or DVB-C. Also SVDRP output shouldn't be localized, but now the INFO command uses those conv* functions that are outputting translated strings.
would be nice to get some feedback
Just get those mentioned things corrected, remove all tabulators and replace them with spaces, and finally send the patch directly to me and I'll integrate it into the next release.
okay, I guess I corrected all the mentioned stuff, but I could not test the Cable and Terrestrial cases, nevertheless I _think_ they should be fine ...
best, Herbert
--- femon-1.0.1/femon.c 2006-06-18 00:46:51.000000000 +0200 +++ femon-1.0.1.4/femon.c 2006-06-19 20:10:21.000000000 +0200 @@ -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()); } --- femon-1.0.1/femonconv.h 1970-01-01 01:00:00.000000000 +0100 +++ femon-1.0.1.4/femonconv.h 2006-06-19 20:12:28.000000000 +0200 @@ -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 --- femon-1.0.1/femonosd.c 2006-06-18 00:46:57.000000000 +0200 +++ femon-1.0.1.4/femonosd.c 2006-06-19 19:42:59.000000000 +0200 @@ -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); --- femon-1.0.1/femontools.c 2006-06-18 00:46:57.000000000 +0200 +++ femon-1.0.1.4/femontools.c 2006-06-19 20:10:12.000000000 +0200 @@ -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; --- femon-1.0.1/femontools.h 2006-06-18 00:46:57.000000000 +0200 +++ femon-1.0.1.4/femontools.h 2006-06-19 18:25:29.000000000 +0200 @@ -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);