diff -Naur femon-1.2.1.org/femon.c femon-1.2.1/femon.c --- femon-1.2.1.org/femon.c 2007-08-18 21:20:00.000000000 -0400 +++ femon-1.2.1/femon.c 2007-10-01 18:55:49.000000000 -0400 @@ -97,9 +97,9 @@ { // Perform the action when selected from the main VDR menu. Dprintf("%s()\n", __PRETTY_FUNCTION__); - if (cReplayControl::NowReplaying()) +/* if (cReplayControl::NowReplaying()) Skins.Message(mtInfo, tr("Femon not available while replaying")); - else + else*/ return cFemonOsd::Instance(true); return NULL; } diff -Naur femon-1.2.1.org/femonosd.c femon-1.2.1/femonosd.c --- femon-1.2.1.org/femonosd.c 2007-08-18 21:20:00.000000000 -0400 +++ femon-1.2.1/femonosd.c 2008-01-21 15:55:09.000000000 -0500 @@ -147,13 +147,54 @@ cMutexLock lock(m_Mutex); unsigned int number = 0; cBitmap *bm = NULL; - int snr = m_SNR / 655; - int signal = m_Signal / 655; + int snr = m_SNR; + int signal = m_Signal; + long mod_snr; + long mod_signal; + int signal_con = m_Signal; int offset = 0; int x = OSDWIDTH - OSDCORNERING; int y = 0; + long temp; + long signal_con_long = 0; + + + switch (m_FrontendInfo.type) { + case FE_QPSK: + case FE_DVB_S: + mod_signal = signal / 655.0; + mod_snr = (((snr - 61440.0) / 60.0) + 22.0); + + break; + case FE_DVB_S2: + if ((snr > 0x1500) && (signal == 0xffff)) { + mod_snr = 0; + mod_signal = 0; + } + else { + mod_snr = (snr / 655.0) * 14.0; + mod_signal = signal / 655.0; + } + break; + case FE_ATSC: + mod_snr = snr / 164.0; + mod_signal = signal / 655.0; + break; + } + + snr = mod_snr; + if (snr < 0) + snr = 0; + + signal = mod_signal; + if (signal < 0) + signal = 0; + eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + m_Vpid = channel->Vpid(); + if (m_Vpid > 10000) + m_Vpid = channel->Vpid() - 10000; if (m_Osd) { m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), femonTheme[femonConfig.theme].clrBackground); @@ -262,7 +303,7 @@ offset += OSDROWHEIGHT; m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), *cString::sprintf("%04x", m_Signal), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), *cString::sprintf("(%2d%%)", m_Signal / 655), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), *cString::sprintf("(%2d%%)", signal/6), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "BER:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), *cString::sprintf("%08x", m_BER), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), *cString::sprintf("%s:", tr("Video")), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); @@ -270,7 +311,7 @@ offset += OSDROWHEIGHT; m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), *cString::sprintf("%04x", m_SNR), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), *cString::sprintf("(%2d%%)", m_SNR / 655), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), *cString::sprintf("(%2d%%)", snr/6), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), *cString::sprintf("%08x", m_UNC), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), *cString::sprintf("%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); @@ -309,7 +350,7 @@ } offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Vpid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", m_Vpid), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Ppid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Ppid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; @@ -335,6 +376,8 @@ offset += OSDROWHEIGHT; switch (m_FrontendInfo.type) { case FE_QPSK: + case FE_DVB_S: + case FE_DVB_S2: m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), *cString::sprintf("%s #%d - %s", tr("Satellite Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); @@ -347,13 +390,14 @@ m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%c", toupper(channel->Polarization())), 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); - m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getInversion(channel->Inversion()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Modulation"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getModulation(channel->Modulation()), 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); m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getCoderate(channel->CoderateH()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); break; case FE_QAM: + case FE_ATSC: m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), *cString::sprintf("%s #%d - %s", tr("Cable Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); @@ -414,7 +458,7 @@ } offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("#%d", channel->Vpid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("#%d", m_Vpid), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%s (%s)", *getBitrateMbits(m_Receiver->VideoStreamBitrate()), *getBitrateMbits(m_Receiver->VideoBitrate())) : *cString::sprintf("---"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); @@ -599,9 +643,12 @@ delete m_Receiver; if (femonConfig.analyzestream) { cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + m_Vpid = channel->Vpid(); + if (m_Vpid > 10000) + m_Vpid = channel->Vpid() - 10000; IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0); IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0); - m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid); + m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), m_Vpid, apid, dpid); cDevice::ActualDevice()->AttachReceiver(m_Receiver); } Start(); @@ -642,9 +689,12 @@ delete m_Receiver; if (femonConfig.analyzestream) { cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + m_Vpid = channel->Vpid(); + if (m_Vpid > 10000) + m_Vpid = channel->Vpid() - 10000; IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0); IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0); - m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid); + m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), m_Vpid, apid, dpid); cDevice::ActualDevice()->AttachReceiver(m_Receiver); } } @@ -659,9 +709,12 @@ delete m_Receiver; if (femonConfig.analyzestream) { cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + m_Vpid = channel->Vpid(); + if (m_Vpid > 10000) + m_Vpid = channel->Vpid() - 10000; IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0); IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0); - m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid); + m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), m_Vpid, apid, dpid); cDevice::ActualDevice()->AttachReceiver(m_Receiver); } } @@ -673,6 +726,9 @@ direction = sgn(direction); if (device >= 0) { cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + m_Vpid = channel->Vpid(); + if (m_Vpid > 10000) + m_Vpid = channel->Vpid() - 10000; for (int i = 0; i < cDevice::NumDevices() - 1; i++) { if (direction) { if (++device >= cDevice::NumDevices()) @@ -690,9 +746,9 @@ if (cDevice::GetDevice(device) == cDevice::PrimaryDevice()) cDevice::GetDevice(device)->ForceTransferMode(); #if defined(APIVERSNUM) && APIVERSNUM < 10500 - cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids())); + cControl::Launch(new cTransferControl(cDevice::GetDevice(device), m_Vpid channel->Apids(), channel->Dpids(), channel->Spids())); #else - cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->GetChannelID(), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids())); + cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->GetChannelID(), m_Vpid, channel->Apids(), channel->Dpids(), channel->Spids())); #endif cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number()); return (true); diff -Naur femon-1.2.1.org/femonosd.h femon-1.2.1/femonosd.h --- femon-1.2.1.org/femonosd.h 2007-08-18 21:20:00.000000000 -0400 +++ femon-1.2.1/femonosd.h 2007-11-13 16:03:22.000000000 -0500 @@ -31,6 +31,7 @@ cFemonReceiver *m_Receiver; int m_Frontend; int m_SvdrpFrontend; + int m_Vpid; double m_SvdrpVideoBitrate; double m_SvdrpAudioBitrate; SvdrpConnection_v1_0 m_SvdrpConnection; diff -Naur femon-1.2.1.org/femonreceiver.c femon-1.2.1/femonreceiver.c --- femon-1.2.1.org/femonreceiver.c 2007-08-18 21:20:00.000000000 -0400 +++ femon-1.2.1/femonreceiver.c 2008-01-21 15:52:40.000000000 -0500 @@ -25,7 +25,11 @@ #endif { Dprintf("%s()\n", __PRETTY_FUNCTION__); - m_VideoPid = Vpid; + if (Vpid > 10000) { + m_VideoPid = Vpid - 10000; + } else { + m_VideoPid = Vpid; + } m_AudioPid = Apid[0]; m_AC3Pid = Dpid[0]; m_VideoValid = false; diff -Naur femon-1.2.1.org/femontools.c femon-1.2.1/femontools.c --- femon-1.2.1.org/femontools.c 2007-08-18 21:20:00.000000000 -0400 +++ femon-1.2.1/femontools.c 2008-10-04 15:08:27.000000000 -0400 @@ -280,13 +280,30 @@ cString getModulation(int value) { switch (value) { - case QPSK: return cString::sprintf("QPSK"); - case QAM_16: return cString::sprintf("QAM 16"); - case QAM_32: return cString::sprintf("QAM 32"); - case QAM_64: return cString::sprintf("QAM 64"); - case QAM_128: return cString::sprintf("QAM 128"); - case QAM_256: return cString::sprintf("QAM 256"); - case QAM_AUTO: return cString::sprintf("QAM %s", tr("Auto")); + case QPSK: return cString::sprintf("QPSK"); + case QAM_16: return cString::sprintf("QAM 16"); + case QAM_32: return cString::sprintf("QAM 32"); + case QAM_64: return cString::sprintf("QAM 64"); + case QAM_128: return cString::sprintf("QAM 128"); + case QAM_256: return cString::sprintf("QAM 256"); + case QAM_AUTO: return cString::sprintf("QAM %s", tr("Auto")); + case VSB_8: return cString::sprintf("8VSB"); + case VSB_16: return cString::sprintf("16VSB"); + case MOD_2VSB: return cString::sprintf("2VSB"); + case MOD_4VSB: return cString::sprintf("4VSB"); + case MOD_BPSK: return cString::sprintf("BPSK"); + case MOD_16APSK: return cString::sprintf("16APSK"); + case MOD_32APSK: return cString::sprintf("32APSK"); + case MOD_8PSK: return cString::sprintf("8PSK"); + case MOD_16PSK: return cString::sprintf("16PSK"); + case MOD_QPSK_TURBO: return cString::sprintf("QPSK TURBO"); + case MOD_8PSK_TURBO: return cString::sprintf("8PSK TURBO"); + case MOD_16QAM_TURBO: return cString::sprintf("16QAM TURBO"); + case MOD_DCII_C_QPSK: return cString::sprintf("DCII C QPSK"); + case MOD_DCII_I_QPSK: return cString::sprintf("DCII I QPSK"); + case MOD_DCII_Q_QPSK: return cString::sprintf("DCII Q QPSK"); + case MOD_DCII_C_OQPSK: return cString::sprintf("DCII C OQPSK"); + case MOD_DSS_QPSK: return cString::sprintf("DSS QPSK"); } return cString::sprintf("---"); } diff -Naur femon-1.2.1.org/Makefile femon-1.2.1/Makefile --- femon-1.2.1.org/Makefile 2007-08-18 21:20:00.000000000 -0400 +++ femon-1.2.1/Makefile 2007-11-19 18:52:48.000000000 -0500 @@ -7,7 +7,7 @@ #FEMON_DEBUG = 1 # NTSC on/off -#FEMON_NTSC = 1 +FEMON_NTSC = 1 # Strip debug symbols? Set eg. to /bin/true if not STRIP = strip