mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Fixed an incomplete initialization of the filter parameters in eit.c (thanks to Jeremy Hall). - Fixed the 'newplugin' script for use with the NEWSTRUCT driver (thanks to Andreas Schultz for reporting this one). If you have already created a plugin directory and Makefile with 'newplugin', please apply the following patch to it: ------------------------------------------------------- --- Makefile 2002/06/10 16:24:06 1.4 +++ Makefile 2002/09/17 15:36:36 1.5 @@ -15,7 +15,12 @@ ### The directory environment: +ifdef NEWSTRUCT +DVBDIR = ../../../../DVB/include +DEFINES += -DNEWSTRUCT +else DVBDIR = ../../../../DVB/ost/include +endif VDRDIR = ../../.. VDRINC = $(VDRDIR)/include LIBDIR = ../../lib @@ -34,7 +39,7 @@ INCLUDES = -I$(VDRINC) -I$(DVBDIR) -DEFINES = -DPLUGIN_NAME_I18N='"$(PLUGIN)"' +DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ### The object files (add further files here): ------------------------------------------------------- This is the diff for the 'setup' example that comes with VDR, so your line numbers may be different. - Added a missing 'public' keyword in device.h (thanks to Martin Hammerschmid). - Fixed a race condition when starting 'Transfer Mode'. - Rearranged the remote control key handling to allow plugins to implement additional types of remote controls (see PLUGINS.html, section "Remote Control"). The previously used files 'keys.conf' and 'keys-pc.conf' have been replaced by the file 'remote.conf', which holds the key definitions of all remote controls. - The LIRC remote control keys are now handled just like the keyboard and RCU keys. This means that you can use the lircd.conf file as is for your remote control, without the need of editing it to make the key names the same as used in VDR. When first starting VDR it will go into the "Learning keys" mode and ask you to press the various keys. The resulting key assignment will be stored in the file 'remote.conf'. Since I have no way of testing the LIRC support, I hope I didn't break it in the process... - While learning the remote control keys it is now possible to press the 'Menu' key to skip the definition of keys that are not available on your particular RC unit. - Fixed handling DVD subtitles in the SPU decoder (thanks to Andreas Schultz). - Avoiding restarts due to 'panic level' when switching channels on the primary device during EPG scan.
264 lines
6.6 KiB
Perl
Executable File
264 lines
6.6 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
|
|
# newplugin: Initializing a new plugin source directory
|
|
#
|
|
# Creates a new plugin source directory from which to start implementing
|
|
# a plugin for VDR.
|
|
# See the file PLUGINS.html for detailed instructions on how to
|
|
# write a plugin.
|
|
#
|
|
# Usage: newplugin <name>
|
|
#
|
|
# See the main source file 'vdr.c' for copyright information and
|
|
# how to reach the author.
|
|
#
|
|
# $Id: newplugin 1.8 2002/09/17 15:24:23 kls Exp $
|
|
|
|
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
|
|
|
|
die "Please use only lowercase letters and digits in the plugin name\n" if ($PLUGIN_NAME =~ tr/a-z0-9//c);
|
|
|
|
$PLUGIN_CLASS = ucfirst($PLUGIN_NAME);
|
|
|
|
$PLUGIN_VERSION = "0.0.1";
|
|
$PLUGIN_DESCRIPTION = "Enter description for '$PLUGIN_NAME' plugin";
|
|
$PLUGIN_MAINENTRY = $PLUGIN_CLASS;
|
|
|
|
$PLUGINS_SRC = "PLUGINS/SRC";
|
|
|
|
$README = qq
|
|
{This is a "plugin" for the Video Disk Recorder (VDR).
|
|
|
|
Written by: Your Name <email\@host.dom>
|
|
|
|
Project's homepage: URL
|
|
|
|
Latest version available at: URL
|
|
|
|
See the file COPYING for license information.
|
|
|
|
Description:
|
|
};
|
|
|
|
$HISTORY_TITLE = "VDR Plugin '$PLUGIN_NAME' Revision History";
|
|
$HISTORY_LINE = '-' x length($HISTORY_TITLE);
|
|
$HISTORY_DATE = sprintf("%4d-%02d-%02d", (localtime)[5] + 1900, (localtime)[4] + 1, (localtime)[3]);
|
|
$HISTORY = qq
|
|
{$HISTORY_TITLE
|
|
$HISTORY_LINE
|
|
|
|
$HISTORY_DATE: Version $PLUGIN_VERSION
|
|
|
|
- Initial revision.
|
|
};
|
|
|
|
$MAKEFILE = qq
|
|
{#
|
|
# Makefile for a Video Disk Recorder plugin
|
|
#
|
|
# \$Id\$
|
|
|
|
# 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 = $PLUGIN_NAME
|
|
|
|
### 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 directory environment:
|
|
|
|
ifdef NEWSTRUCT
|
|
DVBDIR = ../../../../DVB/include
|
|
DEFINES += -DNEWSTRUCT
|
|
else
|
|
DVBDIR = ../../../../DVB/ost/include
|
|
endif
|
|
VDRDIR = ../../..
|
|
VDRINC = \$(VDRDIR)/include
|
|
LIBDIR = ../../lib
|
|
TMPDIR = /tmp
|
|
|
|
### The version number of VDR (taken from VDR's "config.h"):
|
|
|
|
VDRVERSION = \$(shell grep 'define VDRVERSION ' \$(VDRDIR)/config.h | awk '{ print \$\$3 }' | sed -e 's/"//g')
|
|
|
|
### The name of the distribution archive:
|
|
|
|
ARCHIVE = \$(PLUGIN)-\$(VERSION)
|
|
PACKAGE = vdr-\$(ARCHIVE)
|
|
|
|
### Includes and Defines (add further entries here):
|
|
|
|
INCLUDES = -I\$(VDRINC) -I\$(DVBDIR)
|
|
|
|
DEFINES += -DPLUGIN_NAME_I18N='"\$(PLUGIN)"'
|
|
|
|
### The object files (add further files here):
|
|
|
|
OBJS = \$(PLUGIN).o
|
|
|
|
### The C++ compiler and options:
|
|
|
|
CXX = g++
|
|
CXXFLAGS = -O2 -Wall -Woverloaded-virtual
|
|
|
|
### 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: \$(OBJS)
|
|
\$(CXX) \$(CXXFLAGS) -shared \$(OBJS) -o \$\@
|
|
\@cp \$\@ \$(LIBDIR)/\$\@.\$(VDRVERSION)
|
|
|
|
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* *~
|
|
};
|
|
|
|
$MAIN = qq
|
|
{/*
|
|
* $PLUGIN_NAME.c: A plugin for the Video Disk Recorder
|
|
*
|
|
* See the README file for copyright information and how to reach the author.
|
|
*
|
|
* \$Id\$
|
|
*/
|
|
|
|
#include <vdr/plugin.h>
|
|
|
|
static const char *VERSION = "$PLUGIN_VERSION";
|
|
static const char *DESCRIPTION = "$PLUGIN_DESCRIPTION";
|
|
static const char *MAINMENUENTRY = "$PLUGIN_MAINENTRY";
|
|
|
|
class cPlugin$PLUGIN_CLASS : public cPlugin {
|
|
private:
|
|
// Add any member variables or functions you may need here.
|
|
public:
|
|
cPlugin$PLUGIN_CLASS(void);
|
|
virtual ~cPlugin$PLUGIN_CLASS();
|
|
virtual const char *Version(void) { return VERSION; }
|
|
virtual const char *Description(void) { return DESCRIPTION; }
|
|
virtual const char *CommandLineHelp(void);
|
|
virtual bool ProcessArgs(int argc, char *argv[]);
|
|
virtual bool Start(void);
|
|
virtual void Housekeeping(void);
|
|
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
|
virtual cOsdMenu *MainMenuAction(void);
|
|
virtual cMenuSetupPage *SetupMenu(void);
|
|
virtual bool SetupParse(const char *Name, const char *Value);
|
|
};
|
|
|
|
cPlugin${PLUGIN_CLASS}::cPlugin$PLUGIN_CLASS(void)
|
|
{
|
|
// Initialize any member varaiables here.
|
|
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
|
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
|
}
|
|
|
|
cPlugin${PLUGIN_CLASS}::~cPlugin$PLUGIN_CLASS()
|
|
{
|
|
// Clean up after yourself!
|
|
}
|
|
|
|
const char *cPlugin${PLUGIN_CLASS}::CommandLineHelp(void)
|
|
{
|
|
// Return a string that describes all known command line options.
|
|
return NULL;
|
|
}
|
|
|
|
bool cPlugin${PLUGIN_CLASS}::ProcessArgs(int argc, char *argv[])
|
|
{
|
|
// Implement command line argument processing here if applicable.
|
|
return true;
|
|
}
|
|
|
|
bool cPlugin${PLUGIN_CLASS}::Start(void)
|
|
{
|
|
// Start any background activities the plugin shall perform.
|
|
return true;
|
|
}
|
|
|
|
void cPlugin${PLUGIN_CLASS}::Housekeeping(void)
|
|
{
|
|
// Perform any cleanup or other regular tasks.
|
|
}
|
|
|
|
cOsdMenu *cPlugin${PLUGIN_CLASS}::MainMenuAction(void)
|
|
{
|
|
// Perform the action when selected from the main VDR menu.
|
|
return NULL;
|
|
}
|
|
|
|
cMenuSetupPage *cPlugin${PLUGIN_CLASS}::SetupMenu(void)
|
|
{
|
|
// Return a setup menu in case the plugin supports one.
|
|
return NULL;
|
|
}
|
|
|
|
bool cPlugin${PLUGIN_CLASS}::SetupParse(const char *Name, const char *Value)
|
|
{
|
|
// Parse your own setup parameters and store their values.
|
|
return false;
|
|
}
|
|
|
|
VDRPLUGINCREATOR(cPlugin$PLUGIN_CLASS); // Don't touch this!
|
|
};
|
|
|
|
$PLUGINDIR = "$PLUGINS_SRC/$PLUGIN_NAME";
|
|
|
|
die "The directory $PLUGINS_SRC doesn't exist!\n" unless (-d "$PLUGINS_SRC");
|
|
die "A plugin named '$PLUGIN_NAME' already exists in $PLUGINS_SRC!\n" if (-e "$PLUGINDIR");
|
|
mkdir("$PLUGINDIR") || die "$!";
|
|
|
|
CreateFile("README", $README);
|
|
CreateFile("HISTORY", $HISTORY);
|
|
CreateFile("Makefile", $MAKEFILE);
|
|
CreateFile("$PLUGIN_NAME.c", $MAIN);
|
|
`cp COPYING "$PLUGINDIR"` if (-e "COPYING");
|
|
|
|
print qq{
|
|
The new plugin source directory has been created in "$PLUGINDIR".
|
|
|
|
The next steps you should perform now are:
|
|
|
|
* edit the file "README" to adjust it to your specific implementation
|
|
* fill in the code skeleton in "$PLUGIN_NAME.c" to implement your plugin function
|
|
* add further source files if necessary
|
|
* adapt the "Makefile" if necessary
|
|
* do "make plugins" from the VDR source directory to build your plugin
|
|
|
|
};
|
|
|
|
sub CreateFile
|
|
{
|
|
my ($Name, $Content) = @_;
|
|
open(FILE, ">$PLUGINDIR/$Name") || die "$Name: $!\n";
|
|
print FILE $Content;
|
|
close(FILE);
|
|
}
|
|
|