mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 13:36:53 +02:00
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.
This commit is contained in:
parent
6ce0ca32bd
commit
42c6b69490
7
HISTORY
7
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.
|
||||
|
2
Makefile
2
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)
|
||||
|
29
README
29
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."
|
||||
|
30
femon.c
30
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();
|
||||
}
|
||||
|
||||
|
8
femon.h
8
femon.h
@ -11,7 +11,7 @@
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
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,16 +39,16 @@ public:
|
||||
};
|
||||
|
||||
class cMenuFemonSetup : public cMenuSetupPage {
|
||||
private:
|
||||
private:
|
||||
const char *dispmodes[eFemonModeMaxNumber];
|
||||
const char *skins[eFemonSkinMaxNumber];
|
||||
const char *themes[eFemonThemeMaxNumber];
|
||||
cFemonConfig data;
|
||||
virtual void Setup(void);
|
||||
protected:
|
||||
protected:
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
virtual void Store(void);
|
||||
public:
|
||||
public:
|
||||
cMenuFemonSetup(void);
|
||||
};
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#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] =
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
@ -1,6 +0,0 @@
|
||||
VDR Plugin 'femonclient' Revision History
|
||||
-----------------------------------------
|
||||
|
||||
2005-08-28: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
@ -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* *~
|
@ -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.
|
||||
|
@ -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 <stdlib.h>
|
||||
#include <vdr/interface.h>
|
||||
#include <vdr/plugin.h>
|
||||
#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!
|
BIN
femonclient/vdr-femonclient-0.0.1.tgz
Normal file
BIN
femonclient/vdr-femonclient-0.0.1.tgz
Normal file
Binary file not shown.
88
femoni18n.c
88
femoni18n.c
@ -647,28 +647,6 @@ const tI18nPhrase Phrases[] = {
|
||||
"", // Dansk
|
||||
"", // Èesky (Czech)
|
||||
},
|
||||
{ "Use syslog output", // English
|
||||
"Benutze syslog Ausgabe", // Deutsch
|
||||
"", // Slovenski
|
||||
"Registra su syslog", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Português
|
||||
"Enregistrer les infos dans syslog", // Français
|
||||
"", // Norsk
|
||||
"Kirjaa systeemilokiin", // suomi
|
||||
"", // Polski
|
||||
"Usar syslog como registro", // Español
|
||||
"", // ÅëëçíéêÜ (Greek)
|
||||
"", // Svenska
|
||||
"", // Romaneste
|
||||
"", // Magyar
|
||||
"", // Català
|
||||
"¸áßÞÛì×ÞÒÐâì áÛãÖÑã syslog", // ÀãááÚØÙ (Russian)
|
||||
"", // Hrvatski (Croatian)
|
||||
"Kirjuta süsteemilogisse", // Eesti
|
||||
"", // Dansk
|
||||
"", // Èesky (Czech)
|
||||
},
|
||||
{ "Audio", // English
|
||||
"Audio", // Deutsch
|
||||
"Audio", // Slovenski
|
||||
@ -2319,6 +2297,72 @@ const tI18nPhrase Phrases[] = {
|
||||
"", // Dansk
|
||||
"", // Èesky (Czech)
|
||||
},
|
||||
{ "Use SVDRP service", // English
|
||||
"SVDRP Service verwenden", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Português
|
||||
"", // Français
|
||||
"", // Norsk
|
||||
"Käytä SVDRP-palvelua", // suomi
|
||||
"", // Polski
|
||||
"", // Español
|
||||
"", // ÅëëçíéêÜ (Greek)
|
||||
"", // Svenska
|
||||
"", // Romaneste
|
||||
"", // Magyar
|
||||
"", // Català
|
||||
"", // ÀãááÚØÙ (Russian)
|
||||
"", // Hrvatski (Croatian)
|
||||
"", // Eesti
|
||||
"", // Dansk
|
||||
"", // Èesky (Czech)
|
||||
},
|
||||
{ "SVDRP service IP", // English
|
||||
"SVDRP Service IP", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Português
|
||||
"", // Français
|
||||
"", // Norsk
|
||||
"SVDRP-palvelun IP-osoite", // suomi
|
||||
"", // Polski
|
||||
"", // Español
|
||||
"", // ÅëëçíéêÜ (Greek)
|
||||
"", // Svenska
|
||||
"", // Romaneste
|
||||
"", // Magyar
|
||||
"", // Català
|
||||
"", // ÀãááÚØÙ (Russian)
|
||||
"", // Hrvatski (Croatian)
|
||||
"", // Eesti
|
||||
"", // Dansk
|
||||
"", // Èesky (Czech)
|
||||
},
|
||||
{ "SVDRP service port", // English
|
||||
"SVDRP Service Port", // Deutsch
|
||||
"", // Slovenski
|
||||
"", // Italiano
|
||||
"", // Nederlands
|
||||
"", // Português
|
||||
"", // Français
|
||||
"", // Norsk
|
||||
"SVDRP-palvelun portti", // suomi
|
||||
"", // Polski
|
||||
"", // Español
|
||||
"", // ÅëëçíéêÜ (Greek)
|
||||
"", // Svenska
|
||||
"", // Romaneste
|
||||
"", // Magyar
|
||||
"", // Català
|
||||
"", // ÀãááÚØÙ (Russian)
|
||||
"", // Hrvatski (Croatian)
|
||||
"", // Eesti
|
||||
"", // Dansk
|
||||
"", // Èesky (Czech)
|
||||
},
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
798
femonosd.c
798
femonosd.c
File diff suppressed because it is too large
Load Diff
15
femonosd.h
15
femonosd.h
@ -15,16 +15,26 @@
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/thread.h>
|
||||
#include <vdr/status.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/transfer.h>
|
||||
#include <vdr/tools.h>
|
||||
#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();
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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
|
||||
|
318
femontools.c
318
femontools.c
@ -10,8 +10,47 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#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"));
|
||||
}
|
||||
|
29
femontools.h
29
femontools.h
@ -10,6 +10,7 @@
|
||||
#define __FEMONTOOLS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/tools.h>
|
||||
|
||||
#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
|
||||
|
39
svdrpservice.h
Normal file
39
svdrpservice.h
Normal file
@ -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 <vdr/tools.h>
|
||||
|
||||
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<cLine> reply;
|
||||
unsigned short responseCode;
|
||||
};
|
||||
|
||||
#endif //_SVDRPSERVICE__H
|
23
symbols/svdrp.xpm
Normal file
23
symbols/svdrp.xpm
Normal file
@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const svdrp_xpm[] = {
|
||||
"60 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+..........................................................+",
|
||||
"+.....+++++....++....++...++++++.....++++++.....++++++.....+",
|
||||
"+....+++++++...++....++...+++++++....+++++++....+++++++....+",
|
||||
"+...+++...++...++....++...++...+++...++...+++...++...+++...+",
|
||||
"+...++....++...++....++...++....++...++....++...++....++...+",
|
||||
"+...++.........++....++...++....++...++....++...++....++...+",
|
||||
"+...+++.........++..++....++....++...++...+++...++...+++...+",
|
||||
"+....+++++......++..++....++....++...+++++++....+++++++....+",
|
||||
"+.....+++++.....++..++....++....++...++++++.....++++++.....+",
|
||||
"+........+++....++..++....++....++...++...++....++.........+",
|
||||
"+.........++.....++++.....++....++...++...++....++.........+",
|
||||
"+...++....++.....++++.....++....++...++...++....++.........+",
|
||||
"+...++...+++......++......++...+++...++....++...++.........+",
|
||||
"+...+++++++.......++......+++++++....++....++...++.........+",
|
||||
"+....+++++........++......++++++.....++....++...++.........+",
|
||||
"+..........................................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
Loading…
Reference in New Issue
Block a user