diff --git a/HISTORY b/HISTORY index 6b108d8..e4203db 100644 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,6 @@ +=================================== VDR Plugin 'femon' Revision History ------------------------------------ +=================================== 2004-02-15: Version 0.0.1 @@ -58,7 +59,13 @@ VDR Plugin 'femon' Revision History - Backported the "AC3 Stream Information" feature from version 0.1.3. -------------------------- +2004-09-11: Version 0.0.7 + +- Backported changes and fixes from version 0.1.6. + +=================================== +VDR Plugin 'femon' Revision History +=================================== 2004-05-18: Version 0.1.0 @@ -81,3 +88,21 @@ VDR Plugin 'femon' Revision History 2004-06-11: Version 0.1.3 - Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch). + +2004-06-24: Version 0.1.4 + +- Added some new symbols and beautified the old ones. +- Added audio track selection feature. +- Added preliminary device switching feature (disabled at the moment). + +2004-08-18: Version 0.1.5 + +- Fixed OSDSTATUSWIN_XC define. +- Added preliminary NTSC support (make NTSC_SYSTEM=1 plugins). +- Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting this one). +- Added patches directory: CA system names by Lauri Tischler. + +2004-09-11: Version 0.1.6 + +- Yet Another Minor Release. +- Integrated the CA system names patch: "Setup / Show CA System". diff --git a/Makefile b/Makefile index 73299d2..7bc6397 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ PLUGIN = femon ### The version number of this plugin (taken from the main source file): -VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') +VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).h | awk '{ print $$6 }' | sed -e 's/[";]//g') ### The C++ compiler and options: @@ -44,6 +44,10 @@ INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' +ifdef NTSC_SYSTEM +DEFINES += -DNTSC_SYSTEM +endif + ### The object files (add further files here): OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o diff --git a/README b/README index 52369cc..4f783b5 100644 --- a/README +++ b/README @@ -18,7 +18,6 @@ DVB Frontend Status Monitor is a plugin that displays some signal information parameters of the current tuned channel on OSD. You can zap through all your channels and the plugin should be monitoring always the right frontend. The transponder and stream information are also available in advanced display modes. -User can switch between different display modes by pressing 'OK' key. The plugin is based on a neat console frontend status monitor application called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further @@ -31,8 +30,8 @@ Metzler Brothers. Terminology: -------------------------------------------------------------- -|## Channel Name ############################# DD 16:9 PAL ##| -|[=====Signal Strength in % =============|=================]| +|## Channel Name ######################### [DD][AR][VF][A][D]| +|[=====Signal Strength in % ==============|=================]| |[=====Signal-to-Noise Ratio in % ========|=================]| | STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s | | SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s | @@ -44,7 +43,7 @@ SNR - Signal-to-noise ratio BER - Bit error rate UNC - Uncorrected blocks Video - Calculated video bitrate in Mbit/s -Audio - Calculated audio / AC-3 bitrate in kbit/s (only first PID) +Audio - Calculated audio / AC-3 bitrate in kbit/s LOCK - Everything's working... SIGNAL - Found something above the noise level @@ -52,15 +51,31 @@ CARRIER - Found a DVB signal VITERBI - FEC (forward error correction) is stable SYNC - Found sync bytes +DD - AC-3 stream (optional) +AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional) +VF - Video format: PAL/NTSC (optional) +A - Audio track: 1..2 (optional) +D - Device number: 0..3 (optional) + +Controls: + +ChanUp/ChanDn - Switch channel up/down +Up/Down - Switch channel up/down +0-9 - Select channel +Ok - Switch between display modes: basic, transponder, stream, AC-3 +Right/Left - Switch to next/previous device that provides the current channel +Green - Select language (APID) +Back - Exit plugin + Installation: cd /put/your/path/here/VDR/PLUGINS/src -tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tar.gz +tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz ln -s femon-X.Y.Z femon cd /put/your/path/here/VDR make make plugins -./vdr -Pfemon +./vdr -P femon Notes: @@ -71,3 +86,10 @@ Notes: ttxtsubs, but closing and reopening the femon plugin might help temporarily as well. Btw., this same thing happens with OSDTeletext plugin too :) - Disable the stream analyze to speed up heavy zapping sessions. +- The signal strength and signal-to-noise ratio values are comparable only + between the same brand/model frontends. Due to the lack of proper frontend + specifications those values cannot be calculated into any real units. +- Shrinked OSD is available for NTSC users: make NTSC_SYSTEM=1 +- The device switching feature is still non-functional. + +"Femon - A real womon who lives according to her natural feminine inclinations." diff --git a/femon.c b/femon.c index 4ff6028..1867b90 100644 --- a/femon.c +++ b/femon.c @@ -12,7 +12,7 @@ #include "femonosd.h" #include "femon.h" -#if VDRVERSNUM >= 10307 +#if VDRVERSNUM && VDRVERSNUM >= 10307 #error "You don't exist! Go away!" #endif @@ -71,6 +71,7 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value) else if (!strcasecmp(Name, "SyslogOutput")) femonConfig.syslogoutput = atoi(Value); else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value); else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value); + else if (!strcasecmp(Name, "ShowCASystem")) femonConfig.showcasystem = atoi(Value); else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value); else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value); else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value); @@ -101,6 +102,7 @@ void cMenuFemonSetup::Setup(void) Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes"))); Add(new cMenuEditStraItem( tr("Default Display Mode"), &femonConfig.displaymode, modeMaxNumber, dispmodes)); Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top"))); + Add(new cMenuEditBoolItem( tr("Show CA System"), &femonConfig.showcasystem, tr("no"), tr("yes"))); Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50)); Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100)); Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100)); @@ -116,8 +118,9 @@ void cMenuFemonSetup::Store(void) { SetupStore("HideMenu", femonConfig.hidemenu); SetupStore("SyslogOutput", femonConfig.syslogoutput); - SetupStore("Position", femonConfig.position); SetupStore("DisplayMode", femonConfig.displaymode); + SetupStore("Position", femonConfig.position); + SetupStore("ShowCASystem", femonConfig.showcasystem); SetupStore("RedLimit", femonConfig.redlimit); SetupStore("GreenLimit", femonConfig.greenlimit); SetupStore("UpdateInterval", femonConfig.updateinterval); diff --git a/femon.h b/femon.h index 92b1d19..bb5abc5 100644 --- a/femon.h +++ b/femon.h @@ -11,7 +11,7 @@ #include -static const char *VERSION = "0.0.6"; +static const char *VERSION = "0.0.7"; static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)"; static const char *MAINMENUENTRY = "Signal Information"; diff --git a/femoncfg.c b/femoncfg.c index 3d0b7d8..69800fc 100644 --- a/femoncfg.c +++ b/femoncfg.c @@ -21,4 +21,5 @@ cFemonConfig::cFemonConfig(void) analyzestream = 1; calcinterval = 20; syslogoutput = 0; + showcasystem = 0; } diff --git a/femoncfg.h b/femoncfg.h index cf5f5b3..e458a39 100644 --- a/femoncfg.h +++ b/femoncfg.h @@ -30,6 +30,7 @@ public: int analyzestream; int calcinterval; int syslogoutput; + int showcasystem; }; extern cFemonConfig femonConfig; diff --git a/femoni18n.c b/femoni18n.c index 7c96464..295750a 100644 --- a/femoni18n.c +++ b/femoni18n.c @@ -1627,6 +1627,266 @@ const tI18nPhrase Phrases[] = { "", // Català #if VDRVERSNUM >= 10302 "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Show CA System", // English + "CA System anzeigen", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Näytä salausjärjestelmä", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Fixed", // English + "Fest", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Françeais + "", // Norsk + "kiinteä", // suomi + "", // Polskie + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Free to Air", // English + "Free to Air", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "salaamaton", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "SECA/Mediaguard", // English + "SECA/Mediaguard", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "SECA/Mediaguard", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Viaccess", // English + "Viaccess", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Viaccess", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Irdeto", // English + "Irdeto", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Irdeto", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "NDS/Videoguard", // English + "NDS/Videoguard", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "NDS/Videoguard", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "Conax", // English + "Conax", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "Conax", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "CryptoWorks", // English + "CryptoWorks", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Portuguêes + "", // Français + "", // Norsk + "CryptoWorks", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "PowerVu", // English + "PowerVu", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "PowerVu", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "BetaCrypt", // English + "BetaCrypt", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "BetaCrypt", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "NagraVision", // English + "NagraVision", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "NagraVision", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) +#endif + }, + { "SkyCrypt", // English + "SkyCrypt", // Deutsch + "", // Slovenski + "", // Italiano + "", // Nederlands + "", // Português + "", // Français + "", // Norsk + "SkyCrypt", // suomi + "", // Polski + "", // Español + "", // ÅëëçíéêÜ (Greek) + "", // Svenska + "", // Romaneste + "", // Magyar + "", // Català +#if VDRVERSNUM >= 10302 + "", // ÀãááÚØÙ (Russian) #endif }, { NULL } diff --git a/femonosd.c b/femonosd.c index 0029c23..4352496 100644 --- a/femonosd.c +++ b/femonosd.c @@ -19,18 +19,23 @@ #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" #define CHANNELINPUT_TIMEOUT 1000 -#define SCREENWIDTH 720 // in pixels +#ifdef NTSC_SYSTEM +#define SCREENHEIGHT 480 // in pixels +#define OSDHEIGHT 420 // in pixels +#else #define SCREENHEIGHT 576 // in pixels -#define OSDWIDTH 600 // in pixels #define OSDHEIGHT 480 // in pixels +#endif +#define SCREENWIDTH 720 // in pixels +#define OSDWIDTH 600 // in pixels #define OSDINFOHEIGHT ((cOsd::LineHeight() - 2) * 11) // in pixels (11 rows) #define OSDSTATUSHEIGHT ((cOsd::LineHeight() - 2) * 6) // in pixels (6 rows) #define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset) -#define OSDINFOWIN_X(col) ((col == 4) ? 470 : (col == 3) ? 300 : (col==2) ? 180 : 15) +#define OSDINFOWIN_X(col) ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 15) #define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset)) -#define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col==2) ? 70 : 15) -#define OSDSTATUSWIN_XC(col,txt) (((col - 1) * SCREENWIDTH / 6) + ((SCREENWIDTH / 6 - cOsd::WidthInCells(txt) * cOsd::CellWidth()) / 2)) +#define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col == 2) ? 70 : 15) +#define OSDSTATUSWIN_XC(col,txt) (((col - 1) * OSDWIDTH / 5) + ((OSDWIDTH / 5 - cOsd::WidthInCells(txt) * cOsd::CellWidth()) / 2)) #define BARWIDTH(x) (OSDWIDTH * x / 100) #define DELTA 2 @@ -195,7 +200,70 @@ void cFemonOsd::DrawInfoWindow(void) m_Osd->Text(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); offset += cOsd::LineHeight() - DELTA; m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), clrWhite, clrBackground, m_InfoWindow); - snprintf(buf, sizeof(buf), "%d", channel->Ca()); + 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 */ + 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; + } + } + else { + snprintf(buf, sizeof(buf), "%X", value); + } m_Osd->Text(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), clrWhite, clrBackground, m_InfoWindow); snprintf(buf, sizeof(buf), "%d", channel->Tpid()); @@ -439,7 +507,9 @@ void cFemonOsd::DrawInfoWindow(void) m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); offset += cOsd::LineHeight() - DELTA; m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), clrYellow, clrBackground, m_InfoWindow); - snprintf(buf, sizeof(buf), "#%d", channel->Apid1()); + value = -1; + cDevice::PrimaryDevice()->GetAudioTracks(&value); + snprintf(buf, sizeof(buf), "#%d", (value > 0 ? channel->Apid2() : channel->Apid1())); m_Osd->Text(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, clrYellow, clrBackground, m_InfoWindow); offset += cOsd::LineHeight() - DELTA; m_Osd->Text(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), clrWhite, clrBackground, m_InfoWindow); @@ -671,9 +741,8 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber) eOSState cFemonOsd::ProcessKey(eKeys Key) { eOSState state = cOsdObject::ProcessKey(Key); - if (state == osUnknown) { - switch (Key & ~k_Repeat) { + switch (Key) { case k0: if ((m_Number == 0) && (m_OldNumber != 0)) { m_Number = m_OldNumber; @@ -712,6 +781,49 @@ eOSState cFemonOsd::ProcessKey(eKeys Key) break; case kBack: return osEnd; + case kGreen: + { + int CurrentAudioTrack = -1; + const char **AudioTracks = cDevice::PrimaryDevice()->GetAudioTracks(&CurrentAudioTrack); + if (AudioTracks) { + const char **at = &AudioTracks[CurrentAudioTrack]; + if (!*++at) + at = AudioTracks; + cDevice::PrimaryDevice()->SetAudioTrack(at - AudioTracks); + if (femonConfig.analyzestream) { + cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + if (m_Receiver) + delete m_Receiver; + m_Receiver = new cFemonReceiver(channel->Ca(), channel->Vpid(), (at - AudioTracks) ? channel->Apid2() : channel->Apid1(), channel->Dpid1()); + cDevice::ActualDevice()->AttachReceiver(m_Receiver); + } + } + } + break; + case kRight: + case kLeft: + { + int device = cDevice::ActualDevice()->DeviceNumber(); + if (device >= 0) { + cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + for (int i = 0; i < cDevice::NumDevices() - 1; i++) { + if (NORMALKEY(Key) == kRight) { + if (++device >= cDevice::NumDevices()) device = 0; + } + else { + if (--device < 0) device = cDevice::NumDevices() - 1; + } + if (cDevice::GetDevice(device)->ProvidesChannel(channel)) { + //cStatus::MsgChannelSwitch(cDevice::GetDevice(device), 0); + //implement some tuning mechanism here + //cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apid1(), channel->Apid2(), channel->Dpid1(), channel->Dpid2($ + //cStatus::MsgChannelSwitch(cDevice::GetDevice(device), channel->Number()); + break; + } + } + } + } + break; case kUp|k_Repeat: case kUp: case kDown|k_Repeat: