diff -u femon-1.0.1.2/femontools.c femon-1.0.1.2/femontools.c
--- femon-1.0.1.2/femontools.c	2006-06-18 00:29:21.000000000 +0200
+++ femon-1.0.1.2/femontools.c	2006-06-18 00:29:21.000000000 +0200
@@ -154,0 +155,212 @@
+
+cString convCA(int value)
+{
+  cString str;
+
+  /* http://www.dvb.org/index.php?id=174 */
+  switch (value) {
+    case 0x0000:
+  	 /* Reserved */
+  	 str = cString(tr("Free to Air"));
+  	 break;
+    case 0x0001 ... 0x00FF:
+  	 /* Standardized systems */
+  	 if ((value == 0x00A0) || (value == 0x00A1))
+  	    str = cString(tr("Analog"));
+  	 else
+  	    str = cString(tr("Fixed"));
+  	 break;
+    case 0x0100 ... 0x01FF:
+  	 /* Canal Plus */
+  	 str = cString(tr("SECA/Mediaguard"));
+  	 break;
+    case 0x0500 ... 0x05FF:
+  	 /* France Telecom */
+  	 str = cString(tr("Viaccess"));
+  	 break;
+    case 0x0600 ... 0x06FF:
+  	 /* Irdeto */
+  	 str = cString(tr("Irdeto"));
+  	 break;
+    case 0x0900 ... 0x09FF:
+  	 /* News Datacom */
+  	 str = cString(tr("NDS/Videoguard"));
+  	 break;
+    case 0x0B00 ... 0x0BFF:
+  	 /* Norwegian Telekom */
+  	 str = cString(tr("Conax"));
+  	 break;
+    case 0x0D00 ... 0x0DFF:
+  	 /* Philips */
+  	 str = cString(tr("CryptoWorks"));
+  	 break;
+    case 0x0E00 ... 0x0EFF:
+  	 /* Scientific Atlanta */
+  	 str = cString(tr("PowerVu"));
+  	 break;
+    case 0x1200 ... 0x12FF:
+  	 /* BellVu Express */
+  	 str = cString(tr("NagraVision"));
+  	 break;
+    case 0x1700 ... 0x17FF:
+  	 /* BetaTechnik */
+  	 str = cString(tr("BetaCrypt"));
+  	 break;
+    case 0x1800 ... 0x18FF:
+  	 /* Kudelski SA */
+  	 str = cString(tr("NagraVision"));
+  	 break;
+    case 0x4A60 ... 0x4A6F:
+  	 /* @Sky */
+  	 str = cString(tr("SkyCrypt"));
+  	 break;
+    default:
+  	 str = cString::sprintf("%X", value);
+  	 break;
+    }
+  return str;
+}
+
+cString convCoderate(int value)
+{
+  cString str;
+
+  if	  (value == FEC_NONE)  str = cString(tr("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(tr("Auto"));
+  return str;
+}
+
+cString convInversion(int value)
+{
+  cString str;
+
+  if	  (value == INVERSION_OFF)   str = cString(tr("Off"));
+  else if (value == INVERSION_ON)    str = cString(tr("On"));
+  else  	  /*INVERSION_AUTO*/ str = cString(tr("Auto"));
+  return str;
+}
+
+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", tr("Auto"));
+  return str;
+}
+
+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(tr("reserved"));
+  return str;
+}
+
+cString convVideoFormat(int value)
+{
+  cString str;
+  
+  if	  (value == VF_PAL)    str = cString(tr("PAL"));
+  else if (value == VF_NTSC)   str = cString(tr("NTSC"));
+  else  		       str = cString(tr("unknown"));
+  return str;
+}
+
+
+cString convAC3BitStreamMode(int value, int mode)
+{
+  cString str;
+
+  switch (value) {
+    case 0: str = cString(tr("Complete Main (CM)"));	 break;
+    case 1: str = cString(tr("Music and Effects (ME)")); break;
+    case 2: str = cString(tr("Visually Impaired (VI)")); break;
+    case 3: str = cString(tr("Hearing Impaired (HI)"));  break;
+    case 4: str = cString(tr("Dialogue (D)"));  	 break;
+    case 5: str = cString(tr("Commentary (C)"));	 break;
+    case 6: str = cString(tr("Emergency (E)")); 	 break;
+    case 7: str = (mode == 1) ? cString(tr("Voice Over (VO)")) : cString(tr("Karaoke")); break;
+    default: str = cString("---");
+    }
+  return str;
+}
+
+cString convAC3AudioCodingMode(int value)
+{
+  cString str;
+
+  switch (value) {
+    case 0:  str = cString::sprintf("1+1 - %s, %s",	       tr("Ch1"), tr("Ch2"));			         break;
+    case 1:  str = cString::sprintf("1/0 - %s",  	       tr("C"));					 break;
+    case 2:  str = cString::sprintf("2/0 - %s, %s",	       tr("L"), tr("R"));				 break;
+    case 3:  str = cString::sprintf("3/0 - %s, %s, %s",         tr("L"), tr("C"), tr("R"));			 break;
+    case 4:  str = cString::sprintf("2/1 - %s, %s, %s",         tr("L"), tr("R"), tr("S"));			 break;
+    case 5:  str = cString::sprintf("3/1 - %s, %s, %s, %s",     tr("L"), tr("C"), tr("R"),  tr("S"));	         break;
+    case 6:  str = cString::sprintf("2/2 - %s, %s, %s, %s",     tr("L"), tr("R"), tr("SL"), tr("SR"));		 break;
+    case 7:  str = cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"),  tr("SL"), tr("SR")); break;
+    default: str = cString("---");
+    }
+  return str;
+}
+
+cString convAC3CenterMixLevel(int value)
+{
+  cString str;
+
+  switch (value) {
+    case CML_MINUS_3dB:   str = cString::sprintf("-3.0 %s", tr("dB")); break;
+    case CML_MINUS_4_5dB: str = cString::sprintf("-4.5 %s", tr("dB")); break;
+    case CML_MINUS_6dB:   str = cString::sprintf("-6.0 %s", tr("dB")); break;
+    case CML_RESERVED:    str = cString(tr("reserved")); break;
+    default:		  str = cString("---");
+    }
+  return str;
+}
+
+cString convAC3SurroundMixLevel(int value)
+{
+  cString str;
+
+  switch (value) {
+    case SML_MINUS_3dB:   str = cString::sprintf("-3 %s", tr("dB"));   break;
+    case SML_MINUS_6dB:   str = cString::sprintf("-6 %s", tr("dB"));   break;
+    case SML_0_dB:	  str = cString::sprintf("0 %s", tr("dB"));    break;
+    case SML_RESERVED:	  str = cString(tr("reserved")); break;
+    default:		  str = cString("---");
+    }
+  return str;
+}
+
+cString convAC3DolbySurroundMode(int value)
+{
+  cString str;
+
+  switch (value) {
+    case DSM_NOT_INDICATED:	str = cString(tr("not indicated"));    break;
+    case DSM_NOT_DOLBYSURROUND: str = cString(tr("no"));	       break;
+    case DSM_DOLBYSURROUND:	str = cString(tr("yes"));	       break;
+    case DSM_RESERVED:  	str = cString(tr("reserved"));	       break;
+    default:			str = cString("---");
+    }
+  return str;
+}
+
+
diff -u femon-1.0.1.2/femontools.h femon-1.0.1.2/femontools.h
--- femon-1.0.1.2/femontools.h	2006-06-18 00:09:50.000000000 +0200
+++ femon-1.0.1.2/femontools.h	2006-06-18 00:09:50.000000000 +0200
@@ -30,2 +30,15 @@
 
+cString convCA(int value);
+cString convCoderate(int value);
+cString convInversion(int value);
+cString convModulation(int value);
+cString convAspectRatio(int value);
+cString convVideoFormat(int value);
+
+cString convAC3BitStreamMode(int value, int mode);
+cString convAC3AudioCodingMode(int value);
+cString convAC3CenterMixLevel(int value);
+cString convAC3SurroundMixLevel(int value);
+cString convAC3DolbySurroundMode(int value);
+
 #endif // __FEMONTOOLS_H
only in patch2:
unchanged:
--- femon-1.0.1/femonosd.c	2006-06-06 03:20:00.000000000 +0200
+++ femon-1.0.1.2/femonosd.c	2006-06-17 22:17:37.000000000 +0200
@@ -412,69 +412,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);
@@ -531,17 +470,7 @@ void cFemonOsd::DrawInfoWindow(void)
                else            /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
                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,14 +491,7 @@ 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);
@@ -579,17 +501,7 @@ void cFemonOsd::DrawInfoWindow(void)
                else            /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
                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;
 
@@ -617,14 +529,7 @@ void cFemonOsd::DrawInfoWindow(void)
                else            /*BANDWIDTH_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
                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);
@@ -634,29 +539,7 @@ void cFemonOsd::DrawInfoWindow(void)
                else            /*INVERSION_AUTO*/ snprintf(buf, sizeof(buf), tr("Auto"));
                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);
@@ -701,15 +584,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 +596,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 +663,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), "---");
-                }
-             }
+           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);




diff -NurpP femon-1.0.1/femon.c femon-1.0.1.2/femon.c
--- femon-1.0.1/femon.c	2006-06-06 03:20:00.000000000 +0200
+++ femon-1.0.1.2/femon.c	2006-06-18 00:15:36.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 transponder info.",
     "STAT\n"
     "    Print the current frontend status.",
     "SGNL\n"
@@ -180,6 +182,9 @@ cString cPluginFemon::SVDRPCommand(const
   else if (strcasecmp(Command, "NAME") == 0) {
      return getFrontendName(cDevice::ActualDevice()->CardIndex());
      }
+  else if (strcasecmp(Command, "INFO") == 0) {
+     return getFrontendInfo(cDevice::ActualDevice()->CardIndex());
+     }
   else if (strcasecmp(Command, "STAT") == 0) {
      return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
      }
diff -NurpP femon-1.0.1/femontools.c femon-1.0.1.2/femontools.c
--- femon-1.0.1/femontools.c	2006-06-06 03:20:00.000000000 +0200
+++ femon-1.0.1.2/femontools.c	2006-06-18 00:29:21.000000000 +0200
@@ -6,11 +6,15 @@
  * $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"
 
 cString getFrontendName(int cardIndex)
 {
@@ -28,6 +32,46 @@ cString getFrontendName(int cardIndex)
   return (cString::sprintf("%s on device #%d", value.name, cardIndex));
 }
 
+cString getFrontendInfo(int cardIndex)
+{
+  cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
+  // eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
+  cString str;
+  int value;
+  int freq = channel->Frequency();
+  while (freq > 20000) freq /= 1000;
+
+  cString apid_str = cString::sprintf("%5d", channel->Apid(0));
+  value = 1;
+  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(0));
+  value = 1;
+  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(0));
+  value = 1;
+  while (channel->Ca(value) && (value < MAXCAIDS))
+    ca_str = cString::sprintf("%s, %04x", *ca_str, channel->Ca(value));
+  
+  return cString::sprintf(
+     " Frequency:   %5d Mhz    Source:       %s\n" 
+     " Srate:       %5d        Polarization: %c\n" 
+     " Inversion:   %-9s    Coderate: %s, %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",
+     freq, *cSource::ToString(channel->Source()),
+     channel->Srate(), toupper(channel->Polarization()),
+     *(convInversion(channel->Inversion())), 
+     *convCoderate(channel->CoderateH()), *convCoderate(channel->CoderateL()),
+     channel->Vpid(), channel->Ppid(), channel->Tpid(),
+     channel->Sid(), channel->Nid(), channel->Tid(), channel->Rid(),
+     *apid_str, *dpid_str, *ca_str);
+}
+
 cString getFrontendStatus(int cardIndex)
 {
   fe_status_t value;
diff -NurpP femon-1.0.1/femontools.h femon-1.0.1.2/femontools.h
--- femon-1.0.1/femontools.h	2006-06-06 03:20:00.000000000 +0200
+++ femon-1.0.1.2/femontools.h	2006-06-18 00:09:50.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);
