mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Added compiler options "-fPIC -g" to all plugins (thanks to Rolf Ahrenberg). - Fixed initializing the day index when editing the weekday parameter of a repeating timer (thanks to Marco Schlüßler). - No longer removing superfluous hyphens in EPG data - would become too language dependent to handle all kinds of exceptions. - Modified switching to Dolby Digital audio in live mode, if the driver and firmware can handle live DD without the need of a Transfer Mode (thanks to Werner Fink). Live DD mode requires a full featured DVB card and a LinuxDVB driver with firmware version 0x2622 or higher. Older versions will use Transfer Mode just like before. - Implemented handling of the "CA PMT Reply" for CAMs (thanks to Marco Schlüßler for figuring out some obscure length bytes in the CA PMT Reply data of AlphaCrypt CAMs). - Some preparations for being able to record several encrypted channels from the same transponder at the same time (or record and view different encrypted channels), provided the CAM in use can handle this. This is work in progress and isn't actively used, yet. - Fixed SetProgress() in the 'skincurses' plugin in case Total is 0 (reported by Stefan Huelswitt). - Added a copy constructor to cString and fixed its assignment operator (thanks to Holger Brunn). - The new function Skins.QueueMessage() can be called from a background thread to queue a message for display. See VDR/skins.h for details. - The SVDRP command MESG uses the new message queueing facility, so MESG commands may now be executed at any time, and the message will be displayed (no more "pending message").
296 lines
7.6 KiB
Perl
Executable File
296 lines
7.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.22 2005/11/11 13:20:14 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 C++ compiler and options:
|
|
|
|
CXX ?= g++
|
|
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
|
|
|
### The directory environment:
|
|
|
|
DVBDIR = ../../../../DVB
|
|
VDRDIR = ../../..
|
|
LIBDIR = ../../lib
|
|
TMPDIR = /tmp
|
|
|
|
### Allow user defined options to overwrite defaults:
|
|
|
|
-include \$(VDRDIR)/Make.config
|
|
|
|
### 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\$(VDRDIR)/include -I\$(DVBDIR)/include
|
|
|
|
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 = \$(CXX) -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 Initialize(void);
|
|
virtual bool Start(void);
|
|
virtual void Stop(void);
|
|
virtual void Housekeeping(void);
|
|
virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
|
|
virtual cOsdObject *MainMenuAction(void);
|
|
virtual cMenuSetupPage *SetupMenu(void);
|
|
virtual bool SetupParse(const char *Name, const char *Value);
|
|
virtual bool Service(const char *Id, void *Data = NULL);
|
|
virtual const char **SVDRPHelpPages(void);
|
|
virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
|
|
};
|
|
|
|
cPlugin${PLUGIN_CLASS}::cPlugin$PLUGIN_CLASS(void)
|
|
{
|
|
// Initialize any member variables 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}::Initialize(void)
|
|
{
|
|
// Initialize any background activities the plugin shall perform.
|
|
return true;
|
|
}
|
|
|
|
bool cPlugin${PLUGIN_CLASS}::Start(void)
|
|
{
|
|
// Start any background activities the plugin shall perform.
|
|
return true;
|
|
}
|
|
|
|
void cPlugin${PLUGIN_CLASS}::Stop(void)
|
|
{
|
|
// Stop any background activities the plugin shall perform.
|
|
}
|
|
|
|
void cPlugin${PLUGIN_CLASS}::Housekeeping(void)
|
|
{
|
|
// Perform any cleanup or other regular tasks.
|
|
}
|
|
|
|
cOsdObject *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;
|
|
}
|
|
|
|
bool cPlugin${PLUGIN_CLASS}::Service(const char *Id, void *Data)
|
|
{
|
|
// Handle custom service requests from other plugins
|
|
return false;
|
|
}
|
|
|
|
const char **cPlugin${PLUGIN_CLASS}::SVDRPHelpPages(void)
|
|
{
|
|
// Return help text for SVDRP commands this plugin implements
|
|
return NULL;
|
|
}
|
|
|
|
cString cPlugin${PLUGIN_CLASS}::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
|
|
{
|
|
// Process SVDRP commands this plugin implements
|
|
return NULL;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|