From 42c6b694900da7763d36f9ac95288364ec72438f Mon Sep 17 00:00:00 2001 From: Rolf Ahrenberg Date: Sun, 17 Sep 2006 04:20:00 +0300 Subject: [PATCH] =?UTF-8?q?Added=20support=20for=20svdrpservice=20plugin?= =?UTF-8?q?=20(Thanks=20to=20Frank=20Schmirler).=20Added=20INFO=20SVDRP=20?= =?UTF-8?q?command=20(partially=20based=20on=20patch=20by=20Herbert=20P?= =?UTF-8?q?=C3=B6tzl).=20Removed=20system=20log=20option=20-=20use=20SVDRP?= =?UTF-8?q?=20instead.=20Added=20--remove-destination=20to=20the=20'cp'=20?= =?UTF-8?q?command=20in=20Makefile.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY | 7 + Makefile | 2 +- README | 29 +- femon.c | 30 +- femon.h | 24 +- femoncfg.c | 5 +- femoncfg.h | 6 +- femonclient-0.0.1/COPYING | 340 ----------- femonclient-0.0.1/HISTORY | 6 - femonclient-0.0.1/Makefile | 81 --- femonclient-0.0.1/README | 14 - femonclient-0.0.1/femonclient.c | 51 -- femonclient/vdr-femonclient-0.0.1.tgz | Bin 0 -> 8916 bytes femoni18n.c | 90 ++- femonosd.c | 824 +++++++++----------------- femonosd.h | 15 +- femonreceiver.c | 12 +- femonreceiver.h | 20 +- femontools.c | 318 +++++++++- femontools.h | 29 + svdrpservice.h | 39 ++ symbols/svdrp.xpm | 23 + 22 files changed, 857 insertions(+), 1108 deletions(-) delete mode 100644 femonclient-0.0.1/COPYING delete mode 100644 femonclient-0.0.1/HISTORY delete mode 100644 femonclient-0.0.1/Makefile delete mode 100644 femonclient-0.0.1/README delete mode 100644 femonclient-0.0.1/femonclient.c create mode 100644 femonclient/vdr-femonclient-0.0.1.tgz create mode 100644 svdrpservice.h create mode 100644 symbols/svdrp.xpm diff --git a/HISTORY b/HISTORY index fadb6df..96c1884 100644 --- a/HISTORY +++ b/HISTORY @@ -233,3 +233,10 @@ VDR Plugin 'femon' Revision History - Fixed device switching priority (Thanks to Andreas Brugger). - Fixed device switching back to the primary device. + +2006-09-17: Version 1.1.0 + +- Added support for svdrpservice plugin (Thanks to Frank Schmirler). +- Added INFO SVDRP command (partially based on patch by Herbert Pötzl). +- Removed system log option - use SVDRP instead. +- Added --remove-destination to the 'cp' command in Makefile. diff --git a/Makefile b/Makefile index 0864d9a..34f35a1 100644 --- a/Makefile +++ b/Makefile @@ -90,7 +90,7 @@ libvdr-$(PLUGIN).so: $(OBJS) ifndef FEMON_DEBUG @$(STRIP) $@ endif - @cp $@ $(LIBDIR)/$@.$(APIVERSION) + @cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION) dist: clean @-rm -rf $(TMPDIR)/$(ARCHIVE) diff --git a/README b/README index f921e76..3af2525 100644 --- a/README +++ b/README @@ -28,7 +28,7 @@ the 'libdvb' library by Metzler Brothers. Terminology: -------------------------------------------------------------- -|## Channel Name ########################## [AR][VF][A/DD][D]| +|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| |[=====Signal Strength in % ==============|=================]| |[=====Signal-to-Noise Ratio in % ========|=================]| | STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s | @@ -49,10 +49,11 @@ CARRIER - Found a DVB signal VITERBI - FEC (forward error correction) is stable SYNC - Found sync bytes +SVDRP - SVDRP connection active (optional) AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional) VF - Video format: PAL/NTSC (optional) -A/DD - Audio (0..5) / AC-3 track (optional) -D - Device number: 0..3 (optional) +A/DD - Audio (0..N) / AC-3 track (optional) +D - Device number: 0..N (optional) Controls: @@ -75,6 +76,22 @@ make make plugins ./vdr -P femon +Client-server architecture: + +The SVDRP service extension can be used in client-server configurations. +A streamdev based VDR-to-VDR streaming client can retrieve frontend +information from a server, if the SVDRP service has been activated and +properly configured in femon. The svdrpservice plugin is required on the +VDR client. + +If the client fails to open a DVB card frontend corresponding to the +current receiving device, it will connect to the SVDRP server, look for +the femon plugin and tune the channel on the server to the one currently +viewed on the client. If one of these steps fails, the femon OSD won't +open on the client. An SVDRP icon in the femon title bar indicates that +the data source is SVDRP. The device number in the title bar is always +the local device number. + Notes: - The plugin supports only those DVB cards with _one_ frontend, because I @@ -91,4 +108,10 @@ Notes: any bug reports. NTSC users should use a shrinked default OSD height by compiling the plugin with: make FEMON_NTSC=1 +- If the SVDRP service is used: femon won't notice if the server is tuned + to a different channel and tuning the channel on the server might annoy + people watching live TV. In some situations the server will refuse + switching to the requested channel. On a headless server you can avoid + this by installing the dummydevice plugin. + "Femon - A real womon who lives according to her natural feminine inclinations." diff --git a/femon.c b/femon.c index b2872cc..811de5d 100644 --- a/femon.c +++ b/femon.c @@ -79,7 +79,6 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value) { // Parse your own setup parameters and store their values. if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(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, "OSDHeight")) femonConfig.osdheight = atoi(Value); @@ -92,6 +91,9 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value) else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value); else if (!strcasecmp(Name, "AnalStream")) femonConfig.analyzestream = atoi(Value); else if (!strcasecmp(Name, "CalcInterval")) femonConfig.calcinterval = atoi(Value); + else if (!strcasecmp(Name, "UseSvdrp")) femonConfig.usesvdrp = atoi(Value); + else if (!strcasecmp(Name, "ServerPort")) femonConfig.svdrpport = atoi(Value); + else if (!strcasecmp(Name, "ServerIp")) strn0cpy(femonConfig.svdrpip, Value, sizeof(femonConfig.svdrpip)); else return false; if (femonConfig.displaymode < 0 || femonConfig.displaymode >= eFemonModeMaxNumber) femonConfig.displaymode = 0; @@ -130,6 +132,8 @@ const char **cPluginFemon::SVDRPHelpPages(void) " Switch to next possible device.", "PREV\n" " Switch to previous possible device.", + "INFO\n" + " Print the current frontend information.", "NAME\n" " Print the current frontend name.", "STAT\n" @@ -141,7 +145,7 @@ const char **cPluginFemon::SVDRPHelpPages(void) "BERA\n" " Print the current bit error rate.", "UNCB\n" - " Print the current uncorrcted blocks rate.", + " Print the current uncorrected blocks rate.", "VIBR\n" " Print the actual device and current video bitrate [Mbit/s].", "AUBR\n" @@ -177,6 +181,9 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int else return cString("Cannot switch device"); } + else if (strcasecmp(Command, "INFO") == 0) { + return getFrontendInfo(cDevice::ActualDevice()->CardIndex()); + } else if (strcasecmp(Command, "NAME") == 0) { return getFrontendName(cDevice::ActualDevice()->CardIndex()); } @@ -199,19 +206,19 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int } else if (strcasecmp(Command, "VIBR") == 0) { if (cFemonOsd::Instance()) - return cString::sprintf("%.2f Mbit/s on device #%d", cFemonOsd::Instance()->GetVideoBitrate(), cDevice::ActualDevice()->CardIndex()); + return cString::sprintf("%s on device #%d", *getBitrateMbits(cFemonOsd::Instance()->GetVideoBitrate()), cDevice::ActualDevice()->CardIndex()); else return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); } else if (strcasecmp(Command, "AUBR") == 0) { if (cFemonOsd::Instance()) - return cString::sprintf("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetAudioBitrate(), cDevice::ActualDevice()->CardIndex()); + return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetAudioBitrate()), cDevice::ActualDevice()->CardIndex()); else return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); } else if (strcasecmp(Command, "DDBR") == 0) { if (cFemonOsd::Instance()) - return cString::sprintf("%.0f kbit/s on device #%d", cFemonOsd::Instance()->GetDolbyBitrate(), cDevice::ActualDevice()->CardIndex()); + return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetDolbyBitrate()), cDevice::ActualDevice()->CardIndex()); else return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex()); } @@ -248,7 +255,6 @@ void cMenuFemonSetup::Setup(void) Clear(); Add(new cMenuEditBoolItem( tr("Hide main menu entry"), &data.hidemenu, tr("no"), tr("yes"))); - Add(new cMenuEditBoolItem( tr("Use syslog output"), &data.syslogoutput, tr("no"), tr("yes"))); Add(new cMenuEditStraItem( tr("Default display mode"), &data.displaymode, eFemonModeMaxNumber, dispmodes)); Add(new cMenuEditStraItem( tr("Skin"), &data.skin, eFemonSkinMaxNumber, skins)); Add(new cMenuEditStraItem( tr("Theme"), &data.theme, eFemonThemeMaxNumber,themes)); @@ -262,6 +268,11 @@ void cMenuFemonSetup::Setup(void) Add(new cMenuEditBoolItem( tr("Analyze stream"), &data.analyzestream, tr("no"), tr("yes"))); if (femonConfig.analyzestream) Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &data.calcinterval, 1, 100)); + Add(new cMenuEditBoolItem( tr("Use SVDRP service"), &data.usesvdrp)); + if (data.usesvdrp) { + Add(new cMenuEditIntItem(tr("SVDRP service port"), &data.svdrpport, 1, 65535)); + Add(new cMenuEditStrItem(tr("SVDRP service IP"), data.svdrpip, MaxSvdrpIp, ".1234567890")); + } SetCurrent(Get(current)); Display(); @@ -272,7 +283,6 @@ void cMenuFemonSetup::Store(void) Dprintf("%s()\n", __PRETTY_FUNCTION__); femonConfig = data; SetupStore("HideMenu", femonConfig.hidemenu); - SetupStore("SyslogOutput", femonConfig.syslogoutput); SetupStore("DisplayMode", femonConfig.displaymode); SetupStore("Skin", femonConfig.skin); SetupStore("Theme", femonConfig.theme); @@ -285,15 +295,19 @@ void cMenuFemonSetup::Store(void) SetupStore("UpdateInterval", femonConfig.updateinterval); SetupStore("AnalStream", femonConfig.analyzestream); SetupStore("CalcInterval", femonConfig.calcinterval); + SetupStore("UseSvdrp", femonConfig.usesvdrp); + SetupStore("ServerPort", femonConfig.svdrpport); + SetupStore("ServerIp", femonConfig.svdrpip); } eOSState cMenuFemonSetup::ProcessKey(eKeys Key) { + int oldUsesvdrp = data.usesvdrp; int oldAnalyzestream = data.analyzestream; eOSState state = cMenuSetupPage::ProcessKey(Key); - if (Key != kNone && (data.analyzestream != oldAnalyzestream)) { + if (Key != kNone && (data.analyzestream != oldAnalyzestream || data.usesvdrp != oldUsesvdrp)) { Setup(); } diff --git a/femon.h b/femon.h index a10266f..840beff 100644 --- a/femon.h +++ b/femon.h @@ -11,7 +11,7 @@ #include -static const char VERSION[] = "1.0.1"; +static const char VERSION[] = "1.1.0"; static const char DESCRIPTION[] = "DVB Signal Information Monitor (OSD)"; static const char MAINMENUENTRY[] = "Signal Information"; @@ -39,17 +39,17 @@ public: }; class cMenuFemonSetup : public cMenuSetupPage { - private: - const char *dispmodes[eFemonModeMaxNumber]; - const char *skins[eFemonSkinMaxNumber]; - const char *themes[eFemonThemeMaxNumber]; - cFemonConfig data; - virtual void Setup(void); - protected: - virtual eOSState ProcessKey(eKeys Key); - virtual void Store(void); - public: - cMenuFemonSetup(void); +private: + const char *dispmodes[eFemonModeMaxNumber]; + const char *skins[eFemonSkinMaxNumber]; + const char *themes[eFemonThemeMaxNumber]; + cFemonConfig data; + virtual void Setup(void); +protected: + virtual eOSState ProcessKey(eKeys Key); + virtual void Store(void); +public: + cMenuFemonSetup(void); }; #endif //__FEMON_H diff --git a/femoncfg.c b/femoncfg.c index d18e8a0..364f4a5 100644 --- a/femoncfg.c +++ b/femoncfg.c @@ -6,6 +6,7 @@ * $Id$ */ +#include #include "femoncfg.h" cFemonConfig femonConfig; @@ -22,7 +23,6 @@ cFemonConfig::cFemonConfig(void) updateinterval = 5; analyzestream = 1; calcinterval = 20; - syslogoutput = 0; showcasystem = 0; #ifdef NTSC osdheight = 420; @@ -30,6 +30,9 @@ cFemonConfig::cFemonConfig(void) osdheight = 480; #endif osdoffset = 0; + usesvdrp = 0; + svdrpport = 2001; + strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip)); } const cFemonTheme femonTheme[eFemonThemeMaxNumber] = diff --git a/femoncfg.h b/femoncfg.h index fb3a0c6..9f0e68b 100644 --- a/femoncfg.h +++ b/femoncfg.h @@ -9,6 +9,8 @@ #ifndef __FEMONCFG_H #define __FEMONCFG_H +#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx + enum eFemonModes { eFemonModeBasic, @@ -32,10 +34,12 @@ public: int updateinterval; int analyzestream; int calcinterval; - int syslogoutput; int showcasystem; int osdheight; int osdoffset; + int usesvdrp; + int svdrpport; + char svdrpip[MaxSvdrpIp + 1]; // must end with additional null }; extern cFemonConfig femonConfig; diff --git a/femonclient-0.0.1/COPYING b/femonclient-0.0.1/COPYING deleted file mode 100644 index 5b6e7c6..0000000 --- a/femonclient-0.0.1/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/femonclient-0.0.1/HISTORY b/femonclient-0.0.1/HISTORY deleted file mode 100644 index 1578484..0000000 --- a/femonclient-0.0.1/HISTORY +++ /dev/null @@ -1,6 +0,0 @@ -VDR Plugin 'femonclient' Revision History ------------------------------------------ - -2005-08-28: Version 0.0.1 - -- Initial revision. diff --git a/femonclient-0.0.1/Makefile b/femonclient-0.0.1/Makefile deleted file mode 100644 index 47e9f12..0000000 --- a/femonclient-0.0.1/Makefile +++ /dev/null @@ -1,81 +0,0 @@ -# -# Makefile for a Video Disk Recorder plugin -# -# $Id: Makefile 1.1 2005/08/21 10:43:12 kls Exp $ - -# The official name of this plugin. -# This name will be used in the '-P...' option of VDR to load the plugin. -# By default the main source file also carries this name. -# -PLUGIN = femonclient - -### 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') - -### The C++ compiler and options: - -CXX ?= g++ -CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual - -### The directory environment: - -VDRDIR = ../../../.. -LIBDIR = ../../../lib -TMPDIR = /tmp - -### Allow user defined options to overwrite defaults: - --include $(VDRDIR)/Make.config - -### The version number of VDR's plugin API (taken from VDR's "config.h"): - -APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h) - -### The name of the distribution archive: - -ARCHIVE = $(PLUGIN)-$(VERSION) -PACKAGE = vdr-$(ARCHIVE) - -### Includes and Defines (add further entries here): - -INCLUDES += -I$(VDRDIR)/include -I$(VDRDIR)/PLUGINS/src/femon/ - -DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' - -### The object files (add further files here): - -OBJS = $(PLUGIN).o - -### Implicit rules: - -%.o: %.c - $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< - -# Dependencies: - -MAKEDEP = g++ -MM -MG -DEPFILE = .dependencies -$(DEPFILE): Makefile - @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ - --include $(DEPFILE) - -### Targets: - -all: libvdr-$(PLUGIN).so - -libvdr-$(PLUGIN).so: $(PLUGIN).o - $(CXX) $(CXXFLAGS) -shared $(PLUGIN).o -o $@ - @cp $@ $(LIBDIR)/$@.$(APIVERSION) - -dist: clean - @-rm -rf $(TMPDIR)/$(ARCHIVE) - @mkdir $(TMPDIR)/$(ARCHIVE) - @cp -a * $(TMPDIR)/$(ARCHIVE) - @tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE) - @-rm -rf $(TMPDIR)/$(ARCHIVE) - @echo Distribution package created as $(PACKAGE).tgz - -clean: - @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ diff --git a/femonclient-0.0.1/README b/femonclient-0.0.1/README deleted file mode 100644 index 1477415..0000000 --- a/femonclient-0.0.1/README +++ /dev/null @@ -1,14 +0,0 @@ -This is a "plugin" for the Video Disk Recorder (VDR). - -Written by: R o l f . A h r e n b e r g @ s c i . f i - -Project's homepage: http://www.saunalahti.fi/~rahrenbe/vdr/femon/ - -Latest version available at: http://www.saunalahti.fi/~rahrenbe/vdr/femon/ - -See the file COPYING for license information. - -Description: - -Demo client for the service interface of the Femon plugin. - diff --git a/femonclient-0.0.1/femonclient.c b/femonclient-0.0.1/femonclient.c deleted file mode 100644 index d5a2020..0000000 --- a/femonclient-0.0.1/femonclient.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * femonclient.c: Demo femon service client plugin - * - * See the README file for copyright information and how to reach the author. - * - * $Id: $ - */ - -#include -#include -#include -#include "femonservice.h" - -static const char VERSION[] = "0.0.1"; -static const char DESCRIPTION[] = "Femon client"; -static const char MAINMENUENTRY[] = "Show frontend statistic on console"; - -class cPluginFemonClient : public cPlugin { -public: - virtual const char *Version(void) { return VERSION; } - virtual const char *Description(void) { return DESCRIPTION; } - virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; } - virtual cOsdObject *MainMenuAction(void); - }; - -// --- cPluginFemonClient ---------------------------------------------------------- - -cOsdObject *cPluginFemonClient::MainMenuAction(void) -{ - FemonService_v1_0 femon; - cPlugin *p; - - p = cPluginManager::CallFirstService("FemonService-v1.0", &femon); - if (p) { - printf("Device : %s\n", *femon.fe_name); - printf("Status : %s\n", *femon.fe_status); - printf("Signal : %04X (%2d%%)\n", femon.fe_signal, femon.fe_signal / 655); - printf("SNR : %04X (%2d%%)\n", femon.fe_snr, femon.fe_snr / 655); - printf("BER : %08X\n", femon.fe_ber); - printf("UNC : %08X\n", femon.fe_unc); - printf("Video : %.2f Mbit/s\n", femon.video_bitrate); - printf("Audio : %.0f kbit/s\n", femon.audio_bitrate); - printf("Dolby : %.0f kbit/s\n", femon.dolby_bitrate); - } - else - printf("\n--- No support for FemonService-v1.0 found ---\n"); - - return NULL; -} - -VDRPLUGINCREATOR(cPluginFemonClient); // Don't touch this! diff --git a/femonclient/vdr-femonclient-0.0.1.tgz b/femonclient/vdr-femonclient-0.0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..940640d3b54681ecc659fc97c177cd9e3782c685 GIT binary patch literal 8916 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 itYjrCS;= 0) { + m_SvdrpPlugin = cPluginManager::GetPlugin(SVDRPPLUGIN); + if (m_SvdrpPlugin) + m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); + } if (m_Receiver) delete m_Receiver; if (m_Osd) @@ -134,170 +146,96 @@ cFemonOsd::~cFemonOsd(void) void cFemonOsd::DrawStatusWindow(void) { cMutexLock lock(m_Mutex); - char buf[128]; + unsigned int number = 0; + cBitmap *bm = NULL; int snr = m_SNR / 655; int signal = m_Signal / 655; int offset = 0; int x = OSDWIDTH - OSDCORNERING; int y = 0; - int value = 0; eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (m_Osd) { m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), femonTheme[femonConfig.theme].clrBackground); - snprintf(buf, sizeof(buf), "%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)); m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground); - m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); + m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), *cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); if (IS_OSDCORNERING) { m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(0), OSDCORNERING, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -2); m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -1); } - if (m_Receiver) { - value = cDevice::ActualDevice()->CardIndex(); - if (value == 1) { - x -= bmOne.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmOne.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmOne, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (value == 2) { - x -= bmTwo.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmTwo.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmTwo, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (value == 3) { - x -= bmThree.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmThree.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmThree, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else { - x -= bmZero.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmZero.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmZero, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - x -= bmDevice.Width(); - y = (OSDROWHEIGHT - bmDevice.Height()) / 2; + if (m_SvdrpFrontend >= 0) { + x -= bmSVDRP.Width() + OSDSPACING; + y = (OSDROWHEIGHT - bmSVDRP.Height()) / 2; if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDevice, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - if (IS_AUDIO_TRACK(track)) { - value = int(track - ttAudioFirst); - if (value == 1) { - x -= bmOne.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmOne.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmOne, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (value == 2) { - x -= bmTwo.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmTwo.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmTwo, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (value == 3) { - x -= bmThree.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmThree.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmThree, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (value == 4) { - x -= bmFour.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmFour.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmFour, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (value == 5) { - x -= bmFive.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmFive.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmFive, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else { - x -= bmZero.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmZero.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmZero, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - value = cDevice::PrimaryDevice()->GetAudioChannel(); - if (value == 1) { - x -= bmMonoLeft.Width(); - y = (OSDROWHEIGHT - bmMonoLeft.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmMonoLeft, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (value == 2) { - x -= bmMonoRight.Width(); - y = (OSDROWHEIGHT - bmMonoRight.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmMonoRight, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else { - x -= bmStereo.Width(); - y = (OSDROWHEIGHT - bmStereo.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmStereo, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - } - else if (m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) { - if (m_Receiver->AC3_5_1()) { - x -= bmDD51.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmDD51.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD51, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else if (m_Receiver->AC3_2_0()) { - x -= bmDD20.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmDD20.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD20, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - else { - x -= bmDD.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmDD.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDD, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); - } - } - value = m_Receiver->VideoFormat(); - if (value == VF_PAL) { - x -= bmPAL.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmPAL.Height()) / 2; + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmSVDRP, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + } + number = cDevice::ActualDevice()->CardIndex(); + if (number < MAX_BMNUMBERS) { + x -= bmNumbers[number].Width() + OSDSPACING; + y = (OSDROWHEIGHT - bmNumbers[number].Height()) / 2; + if (y < 0) y = 0; + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmNumbers[number], femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + x -= bmDevice.Width(); + y = (OSDROWHEIGHT - bmDevice.Height()) / 2; + if (y < 0) y = 0; + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDevice, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + } + if (IS_AUDIO_TRACK(track)) { + number = int(track - ttAudioFirst); + if (number < MAX_BMNUMBERS) { + x -= bmNumbers[number].Width() + OSDSPACING; + y = (OSDROWHEIGHT - bmNumbers[number].Height()) / 2; if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmPAL, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmNumbers[number], femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); } - else if (value == VF_NTSC) { - x -= bmNTSC.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmNTSC.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmNTSC, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + switch (cDevice::PrimaryDevice()->GetAudioChannel()) { + case 1: bm = &bmMonoLeft; break; + case 2: bm = &bmMonoRight; break; + default: bm = &bmStereo; break; } - value = m_Receiver->VideoAspectRatio(); - if (value == AR_1_1) { - x -= bmAspectRatio_1_1.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmAspectRatio_1_1.Height()) / 2; + if (bm) { + x -= bm->Width(); + y = (OSDROWHEIGHT - bm->Height()) / 2; if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_1_1, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); } - else if (value == AR_4_3) { - x -= bmAspectRatio_4_3.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmAspectRatio_4_3.Height()) / 2; + } + else if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) { + if (m_Receiver->AC3_5_1()) bm = &bmDD51; + else if (m_Receiver->AC3_2_0()) bm = &bmDD20; + else bm = &bmDD; + if (bm) { + x -= bm->Width() + OSDSPACING; + y = (OSDROWHEIGHT - bm->Height()) / 2; if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_4_3, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); } - else if (value == AR_16_9) { - x -= bmAspectRatio_16_9.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmAspectRatio_16_9.Height()) / 2; - if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_16_9, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + } + if (m_Receiver) { + switch (m_Receiver->VideoFormat()) { + case VF_PAL: bm = &bmPAL; break; + case VF_NTSC: bm = &bmNTSC; break; + default: bm = NULL; break; } - else if (value == AR_2_21_1) { - x -= bmAspectRatio_2_21_1.Width() + OSDSPACING; - y = (OSDROWHEIGHT - bmAspectRatio_2_21_1.Height()) / 2; + if (bm) { + x -= bm->Width() + OSDSPACING; + y = (OSDROWHEIGHT - bm->Height()) / 2; if (y < 0) y = 0; - m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmAspectRatio_2_21_1, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); + } + switch (m_Receiver->VideoAspectRatio()) { + case AR_1_1: bm = &bmAspectRatio_1_1; break; + case AR_4_3: bm = &bmAspectRatio_4_3; break; + case AR_16_9: bm = &bmAspectRatio_16_9; break; + case AR_2_21_1: bm = &bmAspectRatio_2_21_1; break; + default: bm = NULL; break; + } + if (bm) { + x -= bm->Width() + OSDSPACING; + y = (OSDROWHEIGHT - bm->Height()) / 2; + if (y < 0) y = 0; + m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground); } } offset += OSDROWHEIGHT; @@ -324,32 +262,20 @@ void cFemonOsd::DrawStatusWindow(void) } offset += OSDROWHEIGHT; m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%04x", m_Signal); - m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "(%2d%%)", m_Signal / 655); - m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, 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(4), OSDSTATUSWIN_Y(offset), "BER:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%08x", m_BER); - m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%s:", tr("Video")); - m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoBitrate(), tr("Mbit/s")); - else snprintf(buf, sizeof(buf), "--- %s", tr("Mbit/s")); - m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, 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); + m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), *getBitrateMbits(m_Receiver ? m_Receiver->VideoBitrate() : (m_SvdrpFrontend >= 0 ? m_SvdrpVideoBitrate : -1.0)), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%04x", m_SNR); - m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "(%2d%%)", m_SNR / 655); - m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), buf, 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(4), OSDSTATUSWIN_Y(offset), "UNC:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%08x", m_UNC); - m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")); - m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - if (m_Receiver) snprintf(buf, sizeof(buf), "%.0f %s", (m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate(), tr("kbit/s")); - else snprintf(buf, sizeof(buf), "--- %s", tr("kbit/s")); - m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), buf, 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); + m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), *getBitrateKbits(m_Receiver ? ((m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate()) : (m_SvdrpFrontend >= 0 ? m_SvdrpAudioBitrate : -1.0)), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; x = bmLock.Width(); y = (OSDROWHEIGHT - bmLock.Height()) / 2; @@ -369,11 +295,7 @@ void cFemonOsd::DrawStatusWindow(void) void cFemonOsd::DrawInfoWindow(void) { cMutexLock lock(m_Mutex); - char buf[128]; - char buf2[20]; int offset = 0; - int value = 0; - double dvalue = 0.0; cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); @@ -388,293 +310,94 @@ void cFemonOsd::DrawInfoWindow(void) } offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Vpid()); - 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(2), 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), tr("Ppid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Ppid()); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, 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; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Apid(0)); - value = 1; - while (channel->Apid(value) && (value < MAXAPIDS)) { - snprintf(buf2, sizeof(buf2), ", %d", channel->Apid(value++)); - strncat(buf, buf2, sizeof(buf)); - } - 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(2), OSDINFOWIN_Y(offset), *getApids(channel), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Dpid(0)); - value = 1; - while (channel->Dpid(value) && (value < MAXDPIDS)) { - snprintf(buf2, sizeof(buf2), ", %d", channel->Dpid(value++)); - strncat(buf, buf2, sizeof(buf)); - } - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getDpids(channel), 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; - } - } - else { - snprintf(buf, sizeof(buf), "%X", value); - value = 1; - while (channel->Ca(value) && (value < MAXCAIDS)) { - snprintf(buf2, sizeof(buf2), ", %X", channel->Ca(value++)); - strncat(buf, buf2, sizeof(buf)); - } - } - 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(2), OSDINFOWIN_Y(offset), *getCAids(channel, femonConfig.showcasystem), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Tpid()); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Tpid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Sid()); - 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(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Sid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Nid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Nid()); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Nid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Tid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Tid()); - 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(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Tid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Rid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", channel->Rid()); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Rid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; switch (m_FrontendInfo.type) { case FE_QPSK: - snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Satellite Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); - m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + 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); - value = channel->Frequency(); - while (value > 20000) value /= 1000; - 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(2), OSDINFOWIN_Y(offset), *getFrequencyMHz(channel->Frequency()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%s", *cSource::ToString(channel->Source())); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cSource::ToString(channel->Source()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - 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(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Srate()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%c", toupper(channel->Polarization())); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, 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); - 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")); - 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(2), OSDINFOWIN_Y(offset), *getInversion(channel->Inversion()), 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")); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, 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: - snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Cable Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); - m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + 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); - value = channel->Frequency(); - while (value > 20000) value /= 1000; - 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(2), OSDINFOWIN_Y(offset), *getFrequencyMHz(channel->Frequency()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%s", *cSource::ToString(channel->Source())); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cSource::ToString(channel->Source()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - 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(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Srate()), 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")); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getModulation(channel->Modulation()), 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")); - 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(2), OSDINFOWIN_Y(offset), *getInversion(channel->Inversion()), 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")); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, 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_OFDM: + m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), *cString::sprintf("%s #%d - %s", tr("Terrestrial 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); + m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getFrequencyMHz(channel->Frequency()), 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); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getTransmission(channel->Transmission()), 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); + m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getBandwidth(channel->Bandwidth()), 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); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getModulation(channel->Modulation()), 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(3), OSDINFOWIN_Y(offset), tr("Coderate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%s (H) %s (L)", *getCoderate(channel->CoderateH()), *getCoderate(channel->CoderateL())), 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); + m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getHierarchy(channel->Hierarchy()), 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); + m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getGuard(channel->Guard()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); break; default: - snprintf(buf, sizeof(buf), "%s #%d - %s", tr("Terrestrial Card"), cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name); - m_Osd->DrawText(OSDINFOWIN_X(1), 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("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - value = channel->Frequency(); - while (value > 20000) value /= 1000; - 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")); - 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")); - 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")); - 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")); - 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)); - 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")); - 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")); - m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); break; } if (IS_OSDCORNERING) { @@ -692,73 +415,34 @@ void cFemonOsd::DrawInfoWindow(void) } offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "#%d", channel->Vpid()); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, 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); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s (%.2f %s)", m_Receiver->VideoStreamBitrate(), tr("Mbit/s"), m_Receiver->VideoBitrate(), tr("Mbit/s")); - 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); + 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); 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), "---"); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAspectRatio(m_Receiver ? m_Receiver->VideoAspectRatio() : -1), 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); - if (m_Receiver) snprintf(buf, sizeof(buf), "%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz")); - 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); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz")) : *cString::sprintf("---"), 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), "---"); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getVideoFormat(m_Receiver ? m_Receiver->VideoFormat() : -1), 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); - if (m_Receiver) snprintf(buf, sizeof(buf), "%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize()); - 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); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize()) : *cString::sprintf("---"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "#%d %s", IS_AUDIO_TRACK(track) ? channel->Apid(int(track - ttAudioFirst)) : channel->Apid(0), IS_AUDIO_TRACK(track) ? channel->Alang(int(track - ttAudioFirst)) : channel->Alang(0)); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("#%d %s", IS_AUDIO_TRACK(track) ? channel->Apid(int(track - ttAudioFirst)) : channel->Apid(0), IS_AUDIO_TRACK(track) ? channel->Alang(int(track - ttAudioFirst)) : channel->Alang(0)), 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); - if (m_Receiver) { - dvalue = m_Receiver->AudioStreamBitrate(); - if (dvalue == (double)FR_RESERVED) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("reserved"), m_Receiver->AudioBitrate(), tr("kbit/s")); - else if (dvalue == (double)FR_FREE) snprintf(buf, sizeof(buf), "%s (%.0f %s)", tr("free"), m_Receiver->AudioBitrate(), tr("kbit/s")); - else snprintf(buf, sizeof(buf), "%.0f %s (%.0f %s)", dvalue, tr("kbit/s"), m_Receiver->AudioBitrate(), tr("kbit/s")); - } - 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); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAudioBitrate(m_Receiver ? m_Receiver->AudioBitrate() : (double)FR_NOTVALID, m_Receiver ? m_Receiver->AudioStreamBitrate() : (double)FR_NOTVALID), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("MPEG Layer"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - if (m_Receiver) snprintf(buf, sizeof(buf), "%d", m_Receiver->AudioMPEGLayer()); - 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); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%d", m_Receiver->AudioMPEGLayer()) : *cString::sprintf("---"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - if (m_Receiver) { - value = m_Receiver->AudioSamplingFreq(); - if (value == FR_RESERVED) snprintf(buf, sizeof(buf), "%s", tr("reserved")); - else snprintf(buf, sizeof(buf), "%.1f %s", (value / 1000.0), tr("kHz")); - } - 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); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAudioSamplingFreq(m_Receiver ? m_Receiver->AudioSamplingFreq() : FR_NOTVALID), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); if (IS_OSDCORNERING) { m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4); @@ -767,8 +451,7 @@ void cFemonOsd::DrawInfoWindow(void) else if (m_DisplayMode == eFemonModeAC3) { m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground); m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground); - snprintf(buf, sizeof(buf), "%s - %s #%d %s", tr("Stream Information"), tr("AC-3 Stream"), IS_DOLBY_TRACK(track) ? channel->Dpid(int(track - ttDolbyFirst)) : channel->Dpid(0), IS_DOLBY_TRACK(track) ? channel->Dlang(int(track - ttDolbyFirst)) : channel->Dlang(0)); - m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); + m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), *cString::sprintf("%s - %s #%d %s", tr("Stream Information"), tr("AC-3 Stream"), IS_DOLBY_TRACK(track) ? channel->Dpid(int(track - ttDolbyFirst)) : channel->Dpid(0), IS_DOLBY_TRACK(track) ? channel->Dlang(int(track - ttDolbyFirst)) : channel->Dlang(0)), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font); if (IS_OSDCORNERING) { m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2); m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1); @@ -776,87 +459,34 @@ void cFemonOsd::DrawInfoWindow(void) offset += OSDROWHEIGHT; if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) { m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%.0f %s (%0.f %s)", m_Receiver->AC3StreamBitrate(), tr("kbit/s"), m_Receiver->AC3Bitrate(), tr("kbit/s")); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%s (%s)", *getBitrateKbits(m_Receiver->AC3StreamBitrate()), *getBitrateKbits(m_Receiver->AC3Bitrate())), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%.1f %s", m_Receiver->AC3SamplingFreq() / 1000., tr("kHz")); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%.1f %s", m_Receiver->AC3SamplingFreq() / 1000., tr("kHz")), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Size"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - snprintf(buf, sizeof(buf), "%d", m_Receiver->AC3FrameSize()); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%d", m_Receiver->AC3FrameSize()), 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), "---"); - } - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3BitStreamMode(m_Receiver->AC3BitStreamMode(), m_Receiver->AC3AudioCodingMode()), 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), "---"); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3AudioCodingMode(m_Receiver->AC3AudioCodingMode(), m_Receiver->AC3BitStreamMode()), 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), "---"); - } - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3CenterMixLevel(m_Receiver->AC3CenterMixLevel()), 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), "---"); - } - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3SurroundMixLevel(m_Receiver->AC3SurroundMixLevel()), 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), "---"); - } - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3DolbySurroundMode(m_Receiver->AC3DolbySurroundMode()), 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); - snprintf(buf, sizeof(buf), "%s", m_Receiver->AC3LfeOn() ? tr("On") : tr("Off")); - m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), buf, femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%s", m_Receiver->AC3LfeOn() ? tr("On") : tr("Off")), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); offset += OSDROWHEIGHT; m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dialogue Normalization"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); - value = m_Receiver->AC3DialogLevel(); - if (value > 0) snprintf(buf, sizeof(buf), "-%d %s", value, tr("dB")); - 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); + m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3DialogLevel(m_Receiver->AC3DialogLevel()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font); } if (IS_OSDCORNERING) { m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3); @@ -874,8 +504,13 @@ void cFemonOsd::Action(void) { Dprintf("%s()\n", __PRETTY_FUNCTION__); cTimeMs t; + SvdrpCommand_v1_0 cmd; + cmd.command = cString::sprintf("PLUG %s INFO\r\n", PLUGIN_NAME_I18N); while (Running()) { t.Set(0); + m_SvdrpFrontend = -1; + m_SvdrpVideoBitrate = -1.0; + m_SvdrpAudioBitrate = -1.0; if (m_Frontend != -1) { CHECK(ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus)); CHECK(ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal)); @@ -884,9 +519,37 @@ void cFemonOsd::Action(void) CHECK(ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC)); DrawInfoWindow(); DrawStatusWindow(); - if (femonConfig.syslogoutput) { - isyslog("Card #%d (%s) STR: %04x SNR: %04x BER: %08x UNC: %08x |%c|%c|%c|%c|%c|", cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name, m_Signal, m_SNR, m_BER, m_UNC, (m_FrontendStatus & FE_HAS_LOCK) ? 'L' : ' ', (m_FrontendStatus & FE_HAS_SIGNAL) ? 'S' : ' ', (m_FrontendStatus & FE_HAS_CARRIER) ? 'C' : ' ', (m_FrontendStatus & FE_HAS_VITERBI) ? 'V' : ' ', (m_FrontendStatus & FE_HAS_SYNC) ? 'Z' : ' '); + } + else if (m_SvdrpConnection.handle >= 0) { + cmd.handle = m_SvdrpConnection.handle; + m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); + if (cmd.responseCode == 900) { + for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) { + const char *s = line->Text(); + if (strncasecmp(s, "CARD:", 5) == 0) + m_SvdrpFrontend = strtol(s + 5, NULL, 10); + else if (strncasecmp(s, "TYPE:", 5) == 0) + m_FrontendInfo.type = (fe_type_t) strtol(s + 5, NULL, 10); + else if (strncasecmp(s, "NAME:", 5) == 0) + strn0cpy(m_FrontendInfo.name, s + 5, sizeof(m_FrontendInfo.name)); + else if (strncasecmp(s, "STAT:", 5) == 0) + m_FrontendStatus = (fe_status_t) strtol(s + 5, NULL, 16); + else if (strncasecmp(s, "SGNL:", 5) == 0) + m_Signal = strtol(s + 5, NULL, 16); + else if (strncasecmp(s, "SNRA:", 5) == 0) + m_SNR = strtol(s + 5, NULL, 16); + else if (strncasecmp(s, "BERA:", 5) == 0) + m_BER = strtol(s + 5, NULL, 16); + else if (strncasecmp(s, "UNCB:", 5) == 0) + m_UNC = strtol(s + 5, NULL, 16); + else if (strncasecmp(s, "VIBR:", 5) == 0) + m_SvdrpVideoBitrate = strtol(s + 5, NULL, 10); + else if (strncasecmp(s, "AUBR:", 5) == 0) + m_SvdrpAudioBitrate = strtol(s + 5, NULL, 10); + } } + DrawInfoWindow(); + DrawStatusWindow(); } cCondWait::SleepMs(100 * femonConfig.updateinterval - t.Elapsed()); } @@ -902,17 +565,23 @@ void cFemonOsd::Show(void) asprintf(&dev, FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0); m_Frontend = open(dev, O_RDONLY | O_NONBLOCK); free(dev); - if (m_Frontend < 0) { + if (m_Frontend >= 0) { + if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { + esyslog("ERROR: cFemonOsd::Show() cannot read frontend info."); + close(m_Frontend); + m_Frontend = -1; + return; + } + } + else if (femonConfig.usesvdrp) { + if (!SvdrpConnect() || !SvdrpTune()) + return; + } + else { esyslog("ERROR: cFemonOsd::Show() cannot open frontend device."); - m_Frontend = -1; - return; - } - if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { - esyslog("ERROR: cFemonOsd::Show() cannot read frontend info."); - close(m_Frontend); - m_Frontend = -1; return; } + m_Osd = cOsdProvider::NewOsd(((Setup.OSDWidth - OSDWIDTH) / 2) + Setup.OSDLeft + femonConfig.osdoffset, ((Setup.OSDHeight - OSDHEIGHT) / 2) + Setup.OSDTop); if (m_Osd) { tArea Areas1[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, femonTheme[femonConfig.theme].bpp } }; @@ -953,17 +622,23 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber) asprintf(&dev, FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0); m_Frontend = open(dev, O_RDONLY | O_NONBLOCK); free(dev); - if (m_Frontend < 0) { + if (m_Frontend >= 0) { + if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { + esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot read frontend info."); + close(m_Frontend); + m_Frontend = -1; + return; + } + } + else if (femonConfig.usesvdrp) { + if (!SvdrpConnect() || !SvdrpTune()) + return; + } + else { esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot open frontend device."); - m_Frontend = -1; - return; - } - if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { - esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot read frontend info."); - close(m_Frontend); - m_Frontend = -1; return; } + if (m_Receiver) delete m_Receiver; if (femonConfig.analyzestream) { @@ -1024,6 +699,55 @@ bool cFemonOsd::DeviceSwitch(int direction) return (false); } +bool cFemonOsd::SvdrpConnect(void) +{ + if (m_SvdrpConnection.handle < 0) { + m_SvdrpPlugin = cPluginManager::GetPlugin(SVDRPPLUGIN); + if (m_SvdrpPlugin) { + m_SvdrpConnection.serverIp = femonConfig.svdrpip; + m_SvdrpConnection.serverPort = femonConfig.svdrpport; + m_SvdrpConnection.shared = true; + m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); + if (m_SvdrpConnection.handle >= 0) { + SvdrpCommand_v1_0 cmd; + cmd.handle = m_SvdrpConnection.handle; + cmd.command = cString::sprintf("PLUG %s\r\n", PLUGIN_NAME_I18N); + m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); + if (cmd.responseCode != 214) { + m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); // close connection + esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s' on server %s.", PLUGIN_NAME_I18N, *m_SvdrpConnection.serverIp); + } + } + else + esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot connect to SVDRP server."); + } + else + esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s'.", SVDRPPLUGIN); + } + return m_SvdrpConnection.handle >= 0; +} + +bool cFemonOsd::SvdrpTune(void) +{ + if (m_SvdrpPlugin && m_SvdrpConnection.handle >= 0) { + cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + if (channel) { + SvdrpCommand_v1_0 cmd; + cmd.handle = m_SvdrpConnection.handle; + cmd.command = cString::sprintf("CHAN %s\r\n", *channel->GetChannelID().ToString()); + m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); + if (cmd.responseCode == 250) + return true; + esyslog("ERROR: cFemonOsd::SvdrpTune() cannot tune server channel."); + } + else + esyslog("ERROR: cFemonOsd::SvdrpTune() invalid channel."); + } + else + esyslog("ERROR: cFemonOsd::SvdrpTune() unexpected connection state."); + return false; +} + double cFemonOsd::GetVideoBitrate(void) { Dprintf("%s()\n", __PRETTY_FUNCTION__); diff --git a/femonosd.h b/femonosd.h index df8d7b8..13dbbab 100644 --- a/femonosd.h +++ b/femonosd.h @@ -15,16 +15,26 @@ #include #include #include +#include #include #include #include +#include "svdrpservice.h" + +#define MAX_BM_NUMBER 5 class cFemonOsd : public cOsdObject, public cThread, public cStatus { private: + enum { MAX_BMNUMBERS = 6 }; static cFemonOsd *pInstance; cOsd *m_Osd; cFemonReceiver *m_Receiver; int m_Frontend; + int m_SvdrpFrontend; + double m_SvdrpVideoBitrate; + double m_SvdrpAudioBitrate; + SvdrpConnection_v1_0 m_SvdrpConnection; + cPlugin *m_SvdrpPlugin; struct dvb_frontend_info m_FrontendInfo; int m_Number; int m_OldNumber; @@ -38,11 +48,14 @@ private: cTimeMs m_InputTime; cMutex* m_Mutex; static cBitmap bmStereo, bmMonoLeft, bmMonoRight, bmDD, bmDD20, bmDD51; - static cBitmap bmZero, bmDevice, bmPAL, bmNTSC, bmOne, bmTwo, bmThree, bmFour, bmFive; + static cBitmap bmNumbers[MAX_BMNUMBERS]; + static cBitmap bmDevice, bmPAL, bmNTSC, bmSVDRP; static cBitmap bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3; static cBitmap bmLock, bmSignal, bmCarrier, bmViterbi, bmSync; void DrawStatusWindow(void); void DrawInfoWindow(void); + bool SvdrpConnect(void); + bool SvdrpTune(void); protected: cFemonOsd(); diff --git a/femonreceiver.c b/femonreceiver.c index 42d948f..860fed3 100644 --- a/femonreceiver.c +++ b/femonreceiver.c @@ -141,7 +141,7 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count) m_VideoFormat = VF_UNKNOWN; break; } - m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0; + m_VideoStreamBitrate = 400.0 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)); } static unsigned int bitrates[3][16] = @@ -179,7 +179,7 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count) else if (tmp == 0xf) m_AudioStreamBitrate = (double)FR_RESERVED; else - m_AudioStreamBitrate = tmp / 1000.0; + m_AudioStreamBitrate = tmp; tmp = samplerates[((headr[2] & 0x0c) >> 2)] * 100; if (tmp == 3) m_AudioSamplingFreq = FR_RESERVED; @@ -222,7 +222,7 @@ void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count) m_AC3Valid = true; headr = mbuf + c + 2; frame = (headr[2] & 0x3f); - m_AC3StreamBitrate = ac3_bitrates[frame >> 1]; + m_AC3StreamBitrate = ac3_bitrates[frame >> 1] * 1000; int fr = (headr[2] & 0xc0 ) >> 6; m_AC3SamplingFreq = ac3_freq[fr] * 100; m_AC3FrameSize = ac3_frames[fr][frame >> 1]; @@ -355,11 +355,11 @@ void cFemonReceiver::Action(void) while (Running()) { t.Set(0); // TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit - m_VideoBitrate = (8.0 * 184.0 * m_VideoPacketCount) / (femonConfig.calcinterval * 100000.0); + m_VideoBitrate = (10.0 * 8.0 * 184.0 * m_VideoPacketCount) / femonConfig.calcinterval; m_VideoPacketCount = 0; - m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0); + m_AudioBitrate = (10.0 * 8.0 * 184.0 * m_AudioPacketCount) / femonConfig.calcinterval; m_AudioPacketCount = 0; - m_AC3Bitrate = (8.0 * 184.0 * m_AC3PacketCount) / (femonConfig.calcinterval * 100.0); + m_AC3Bitrate = (10.0 * 8.0 * 184.0 * m_AC3PacketCount) / femonConfig.calcinterval; m_AC3PacketCount = 0; cCondWait::SleepMs(100 * femonConfig.calcinterval - t.Elapsed()); } diff --git a/femonreceiver.h b/femonreceiver.h index 78d6ab7..068ff54 100644 --- a/femonreceiver.h +++ b/femonreceiver.h @@ -47,9 +47,11 @@ enum eDolbySurroundMode { DSM_RESERVED = 3, }; -#define FR_RESERVED -1 -#define FR_FREE -2 -#define FR_NOTVALID -3 +enum eReveiverCodes { + FR_RESERVED = -1, + FR_FREE = -2, + FR_NOTVALID = -3 + }; class cFemonReceiver : public cReceiver, public cThread { private: @@ -103,19 +105,19 @@ public: int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // eAspectRatio int VideoFormat(void) { return m_VideoFormat; }; // eVideoFormat double VideoFrameRate(void) { return m_VideoFrameRate; }; // Hz - double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // Mbit/s - double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s + double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // bit/s + double VideoBitrate(void) { return m_VideoBitrate; }; // bit/s bool AudioValid(void) { return m_AudioValid; }; // boolean int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // layer number int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz - double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // kbit/s - double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s + double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // bit/s + double AudioBitrate(void) { return m_AudioBitrate; }; // bit/s bool AC3Valid(void) { return m_AC3Valid; }; // boolean int AC3SamplingFreq(void) { return m_AC3SamplingFreq; }; // Hz - double AC3StreamBitrate(void) { return m_AC3StreamBitrate; }; // kbit/s - double AC3Bitrate(void) { return m_AC3Bitrate; }; // kbit/s + double AC3StreamBitrate(void) { return m_AC3StreamBitrate; }; // bit/s + double AC3Bitrate(void) { return m_AC3Bitrate; }; // bit/s int AC3FrameSize(void) { return m_AC3FrameSize; }; // Bytes int AC3BitStreamMode(void) { return m_AC3BitStreamMode; }; // 0..7 int AC3AudioCodingMode(void) { return m_AC3AudioCodingMode; }; // 0..7 diff --git a/femontools.c b/femontools.c index e0c931e..fa8bc21 100644 --- a/femontools.c +++ b/femontools.c @@ -10,8 +10,47 @@ #include #include #include +#include "femoni18n.h" +#include "femonreceiver.h" +#include "femonosd.h" #include "femontools.h" +cString getFrontendInfo(int cardIndex) +{ + cString info; + struct dvb_frontend_info value; + fe_status_t status; + uint16_t signal = 0; + uint16_t snr = 0; + uint32_t ber = 0; + uint32_t unc = 0; + char *dev = NULL; + cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); + + asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0); + int fe = open(dev, O_RDONLY | O_NONBLOCK); + free(dev); + if (fe < 0) + return NULL; + CHECK(ioctl(fe, FE_GET_INFO, &value)); + CHECK(ioctl(fe, FE_READ_STATUS, &status)); + CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal)); + CHECK(ioctl(fe, FE_READ_SNR, &snr)); + CHECK(ioctl(fe, FE_READ_BER, &ber)); + CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc)); + close(fe); + + info = cString::sprintf("CARD:%d\nTYPE:%d\nNAME:%s\nSTAT:%02X\nSGNL:%04X\nSNRA:%04X\nBERA:%08X\nUNCB:%08X", cardIndex, value.type, value.name, status, signal, snr, ber, unc); + + if (cFemonOsd::Instance()) + info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate()); + + if (channel) + info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText()); + + return info; +} + cString getFrontendName(int cardIndex) { struct dvb_frontend_info value; @@ -22,7 +61,7 @@ cString getFrontendName(int cardIndex) free(dev); if (fe < 0) return NULL; - ioctl(fe, FE_GET_INFO, &value); + CHECK(ioctl(fe, FE_GET_INFO, &value)); close(fe); return (cString::sprintf("%s on device #%d", value.name, cardIndex)); @@ -108,3 +147,280 @@ uint32_t getUNC(int cardIndex) return (value); } +cString getApids(const cChannel *channel) +{ + int value = 0; + cString apids = cString::sprintf("%d", channel->Apid(value)); + while (channel->Apid(++value) && (value < MAXAPIDS)) + apids = cString::sprintf("%s, %d", *apids, channel->Apid(value)); + return apids; +} + +cString getDpids(const cChannel *channel) +{ + int value = 0; + cString dpids = cString::sprintf("%d", channel->Dpid(value)); + while (channel->Dpid(++value) && (value < MAXDPIDS)) + dpids = cString::sprintf("%s, %d", *dpids, channel->Dpid(value)); + return dpids; +} + +cString getCAids(const cChannel *channel, bool identify) +{ + cString caids; + int value = 0; + + if (identify) { + caids = cString::sprintf("%s", *getCA(channel->Ca(value))); + while (channel->Ca(++value) && (value < MAXCAIDS)) + caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value))); + } + else { + caids = cString::sprintf("%04x", channel->Ca(value)); + while (channel->Ca(++value) && (value < MAXCAIDS)) + caids = cString::sprintf("%s, %04x", *caids, channel->Ca(value)); + } + return caids; +} + +cString getCA(int value) +{ + /* http://www.dvb.org/index.php?id=174 */ + switch (value) { + case 0x0000: return cString::sprintf("%s", tr("Free to Air")); /* Reserved */ + case 0x0001 ... 0x009F: + case 0x00A2 ... 0x00FF: return cString::sprintf("%s", tr("Fixed")); /* Standardized systems */ + case 0x00A0 ... 0x00A1: return cString::sprintf("%s", tr("Analog")); /* Analog signals */ + case 0x0100 ... 0x01FF: return cString::sprintf("%s", tr("SECA/Mediaguard")); /* Canal Plus */ + case 0x0500 ... 0x05FF: return cString::sprintf("%s", tr("Viaccess")); /* France Telecom */ + case 0x0600 ... 0x06FF: return cString::sprintf("%s", tr("Irdeto")); /* Irdeto */ + case 0x0900 ... 0x09FF: return cString::sprintf("%s", tr("NDS/Videoguard")); /* News Datacom */ + case 0x0B00 ... 0x0BFF: return cString::sprintf("%s", tr("Conax")); /* Norwegian Telekom */ + case 0x0D00 ... 0x0DFF: return cString::sprintf("%s", tr("CryptoWorks")); /* Philips */ + case 0x0E00 ... 0x0EFF: return cString::sprintf("%s", tr("PowerVu")); /* Scientific Atlanta */ + case 0x1200 ... 0x12FF: return cString::sprintf("%s", tr("NagraVision")); /* BellVu Express */ + case 0x1700 ... 0x17FF: return cString::sprintf("%s", tr("BetaCrypt")); /* BetaTechnik */ + case 0x1800 ... 0x18FF: return cString::sprintf("%s", tr("NagraVision")); /* Kudelski SA */ + case 0x4A60 ... 0x4A6F: return cString::sprintf("%s", tr("SkyCrypt")); /* @Sky */ + } + return cString::sprintf("%X", value); +} + +cString getCoderate(int value) +{ + switch (value) { + case FEC_NONE: return cString::sprintf("%s", tr("None")); + case FEC_1_2: return cString::sprintf("1/2"); + case FEC_2_3: return cString::sprintf("2/3"); + case FEC_3_4: return cString::sprintf("3/4"); + case FEC_4_5: return cString::sprintf("4/5"); + case FEC_5_6: return cString::sprintf("5/6"); + case FEC_6_7: return cString::sprintf("6/7"); + case FEC_7_8: return cString::sprintf("7/8"); + case FEC_8_9: return cString::sprintf("8/9"); + case FEC_AUTO: return cString::sprintf("%s", tr("Auto")); + } + return cString::sprintf("---"); +} + +cString getTransmission(int value) +{ + switch (value) { + case TRANSMISSION_MODE_2K: return cString::sprintf("2K"); + case TRANSMISSION_MODE_8K: return cString::sprintf("8K"); + case TRANSMISSION_MODE_AUTO: return cString::sprintf("%s", tr("Auto")); + } + return cString::sprintf("---"); +} + +cString getBandwidth(int value) +{ + switch (value) { + case BANDWIDTH_8_MHZ: return cString::sprintf("8 %s", tr("MHz")); + case BANDWIDTH_7_MHZ: return cString::sprintf("7 %s", tr("MHz")); + case BANDWIDTH_6_MHZ: return cString::sprintf("6 %s", tr("MHz")); + case BANDWIDTH_AUTO: return cString::sprintf("%s", tr("Auto")); + } + return cString::sprintf("---"); +} + +cString getInversion(int value) +{ + switch (value) { + case INVERSION_OFF: return cString::sprintf("%s", tr("Off")); + case INVERSION_ON: return cString::sprintf("%s", tr("On")); + case INVERSION_AUTO: return cString::sprintf("%s", tr("Auto")); + } + return cString::sprintf("---"); +} + +cString getHierarchy(int value) +{ + switch (value) { + case HIERARCHY_NONE: return cString::sprintf("%s", tr("None")); + case HIERARCHY_1: return cString::sprintf("1"); + case HIERARCHY_2: return cString::sprintf("2"); + case HIERARCHY_4: return cString::sprintf("4"); + case HIERARCHY_AUTO: cString::sprintf("%s", tr("Auto")); + } + return cString::sprintf("---"); +} + +cString getGuard(int value) +{ + switch (value) { + case GUARD_INTERVAL_1_32: return cString::sprintf("1/32"); + case GUARD_INTERVAL_1_16: return cString::sprintf("1/16"); + case GUARD_INTERVAL_1_8: return cString::sprintf("1/8"); + case GUARD_INTERVAL_1_4: return cString::sprintf("1/4"); + case GUARD_INTERVAL_AUTO: cString::sprintf("%s", tr("Auto")); + } + return cString::sprintf("---"); +} + +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")); + } + return cString::sprintf("---"); +} + +cString getAspectRatio(int value) +{ + switch (value) { + case AR_RESERVED: return cString::sprintf("%s", tr("reserved")); + case AR_1_1: return cString::sprintf("1:1"); + case AR_4_3: return cString::sprintf("4:3"); + case AR_16_9: return cString::sprintf("16:9"); + case AR_2_21_1: return cString::sprintf("2.21:1"); + } + return cString::sprintf("---"); +} + +cString getVideoFormat(int value) +{ + switch (value) { + case VF_UNKNOWN: return cString::sprintf("%s", tr("unknown")); + case VF_PAL: return cString::sprintf("%s", tr("PAL")); + case VF_NTSC: return cString::sprintf("%s", tr("NTSC")); + } + return cString::sprintf("---"); +} + +cString getAC3BitStreamMode(int value, int coding) +{ + switch (value) { + case 0: return cString::sprintf("%s", tr("Complete Main (CM)")); + case 1: return cString::sprintf("%s", tr("Music and Effects (ME)")); + case 2: return cString::sprintf("%s", tr("Visually Impaired (VI)")); + case 3: return cString::sprintf("%s", tr("Hearing Impaired (HI)")); + case 4: return cString::sprintf("%s", tr("Dialogue (D)")); + case 5: return cString::sprintf("%s", tr("Commentary (C)")); + case 6: return cString::sprintf("%s", tr("Emergency (E)")); + case 7: return cString::sprintf("%s", (coding == 1) ? tr("Voice Over (VO)") : tr("Karaoke")); + } + return cString::sprintf("---"); +} + +cString getAC3AudioCodingMode(int value, int stream) +{ + if (stream != 7) { + switch (value) { + case 0: return cString::sprintf("1+1 - %s, %s", tr("Ch1"), tr("Ch2")); + case 1: return cString::sprintf("1/0 - %s", tr("C")); + case 2: return cString::sprintf("2/0 - %s, %s", tr("L"), tr("R")); + case 3: return cString::sprintf("3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R")); + case 4: return cString::sprintf("2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S")); + case 5: return cString::sprintf("3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S")); + case 6: return cString::sprintf("2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR")); + case 7: return cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR")); + } + } + return cString::sprintf("---"); +} + +cString getAC3CenterMixLevel(int value) +{ + switch (value) { + case CML_MINUS_3dB: return cString::sprintf("-3.0 %s", tr("dB")); + case CML_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB")); + case CML_MINUS_6dB: return cString::sprintf("-6.0 %s", tr("dB")); + case CML_RESERVED: return cString::sprintf("%s", tr("reserved")); + } + return cString::sprintf("---"); +} + +cString getAC3SurroundMixLevel(int value) +{ + switch (value) { + case SML_MINUS_3dB: return cString::sprintf("-3 %s", tr("dB")); + case SML_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB")); + case SML_0_dB: return cString::sprintf("0 %s", tr("dB")); + case SML_RESERVED: return cString::sprintf("%s", tr("reserved")); + } + return cString::sprintf("---"); +} + +cString getAC3DolbySurroundMode(int value) +{ + switch (value) { + case DSM_NOT_INDICATED: return cString::sprintf("%s", tr("not indicated")); + case DSM_NOT_DOLBYSURROUND: return cString::sprintf("%s", tr("no")); + case DSM_DOLBYSURROUND: return cString::sprintf("%s", tr("yes")); + case DSM_RESERVED: return cString::sprintf("%s", tr("reserved")); + } + return cString::sprintf("---"); +} + +cString getAC3DialogLevel(int value) +{ + if (value > 0) + return cString::sprintf("-%d %s", value, tr("dB")); + return cString::sprintf("---"); +} + +cString getFrequencyMHz(int value) +{ + while (value > 20000) value /= 1000; + return cString::sprintf("%d %s", value, tr("MHz")); +} + +cString getAudioSamplingFreq(int value) +{ + switch (value) { + case FR_NOTVALID: return cString::sprintf("---"); + case FR_RESERVED: return cString::sprintf("%s", tr("reserved")); + } + return cString::sprintf("%.1f %s", ((double)value / 1000.0), tr("kHz")); +} + +cString getAudioBitrate(double value, double stream) +{ + switch ((int)stream) { + case FR_NOTVALID: return cString::sprintf("---"); + case FR_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(value)); + case FR_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(value)); + } + return cString::sprintf("%s (%s)", *getBitrateKbits(stream), *getBitrateKbits(value)); +} + +cString getBitrateMbits(double value) +{ + if (value >= 0) + return cString::sprintf("%.2f %s", value / 1000000.0, tr("Mbit/s")); + return cString::sprintf("--- %s", tr("Mbit/s")); +} + +cString getBitrateKbits(double value) +{ + if (value >= 0) + return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s")); + return cString::sprintf("--- %s", tr("kbit/s")); +} diff --git a/femontools.h b/femontools.h index 890845b..97b87fd 100644 --- a/femontools.h +++ b/femontools.h @@ -10,6 +10,7 @@ #define __FEMONTOOLS_H #include +#include #include #ifdef DEBUG @@ -20,11 +21,39 @@ #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" +cString getFrontendInfo(int cardIndex = 0); cString getFrontendName(int cardIndex = 0); cString getFrontendStatus(int cardIndex = 0); + uint16_t getSNR(int cardIndex = 0); uint16_t getSignal(int cardIndex = 0); + uint32_t getBER(int cardIndex = 0); uint32_t getUNC(int cardIndex = 0); +cString getApids(const cChannel *channel); +cString getDpids(const cChannel *channel); +cString getCAids(const cChannel *channel, bool identify = false); +cString getCA(int value); +cString getCoderate(int value); +cString getTransmission(int value); +cString getBandwidth(int value); +cString getInversion(int value); +cString getHierarchy(int value); +cString getGuard(int value); +cString getModulation(int value); +cString getAspectRatio(int value); +cString getVideoFormat(int value); +cString getAC3BitStreamMode(int value, int coding); +cString getAC3AudioCodingMode(int value, int stream); +cString getAC3CenterMixLevel(int value); +cString getAC3SurroundMixLevel(int value); +cString getAC3DolbySurroundMode(int value); +cString getAC3DialogLevel(int value); +cString getFrequencyMHz(int value); +cString getAudioSamplingFreq(int value); +cString getAudioBitrate(double value, double stream); +cString getBitrateMbits(double value); +cString getBitrateKbits(double value); + #endif // __FEMONTOOLS_H diff --git a/svdrpservice.h b/svdrpservice.h new file mode 100644 index 0000000..416a032 --- /dev/null +++ b/svdrpservice.h @@ -0,0 +1,39 @@ +/* + * svdrpservice.h: Public interface of the plugin's services + * + * See the README file for copyright information and how to reach the author. + */ + +#ifndef _SVDRPSERVICE__H +#define _SVDRPSERVICE__H + +#include + +class cLine: public cListObject { +private: + char *Line; +public: + const char *Text() { return Line; } + cLine(const char *s) { Line = s ? strdup(s) : NULL; }; + virtual ~cLine() { if (Line) free(Line); }; +}; + +struct SvdrpConnection_v1_0 { + // in + cString serverIp; + unsigned short serverPort; + bool shared; + // in+out + int handle; +}; + +struct SvdrpCommand_v1_0 { + // in + cString command; + int handle; + // out + cList reply; + unsigned short responseCode; +}; + +#endif //_SVDRPSERVICE__H diff --git a/symbols/svdrp.xpm b/symbols/svdrp.xpm new file mode 100644 index 0000000..e0d36ab --- /dev/null +++ b/symbols/svdrp.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static const char *const svdrp_xpm[] = { +"60 18 2 1", +". c #FFFFFF", +"+ c #000000", +"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++", +"+..........................................................+", +"+.....+++++....++....++...++++++.....++++++.....++++++.....+", +"+....+++++++...++....++...+++++++....+++++++....+++++++....+", +"+...+++...++...++....++...++...+++...++...+++...++...+++...+", +"+...++....++...++....++...++....++...++....++...++....++...+", +"+...++.........++....++...++....++...++....++...++....++...+", +"+...+++.........++..++....++....++...++...+++...++...+++...+", +"+....+++++......++..++....++....++...+++++++....+++++++....+", +"+.....+++++.....++..++....++....++...++++++.....++++++.....+", +"+........+++....++..++....++....++...++...++....++.........+", +"+.........++.....++++.....++....++...++...++....++.........+", +"+...++....++.....++++.....++....++...++...++....++.........+", +"+...++...+++......++......++...+++...++....++...++.........+", +"+...+++++++.......++......+++++++....++....++...++.........+", +"+....+++++........++......++++++.....++....++...++.........+", +"+..........................................................+", +"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};