mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 1.1.5
- Added direct access to the index data of cPalette (needed for displaying SPUs, thanks to Andreas Schultz). - The status monitor function cStatus::Replaying() now gets a 'cControl *' argument instead of a 'cDvbPlayerControl *' in order to allow additional players to call this function. cPlayer and cControl have been given the functions GetIndex() and GetReplayMode() to allow access to the player's status. - Added cOsd::OpenRaw() to create a raw OSD (needed for displaying SPUs). - Changed the symantics of the Name parameter in cStatus::Recording() and cStatus::Replaying(). It is no longer the full directory name of the recording, but rather just the basic name. This has been changed to allow players that can't provide a name to simply use a string that describes the player type (like, e.g., "DVD"). - Fixed a hangup when switching to the next file during replay. - Fixed a possible race condition in the cDvbPlayer (thanks to Andreas Schultz for pointing out this one). - Disabled channels on Transponder 12070 in 'channels.conf', which apparently no longer transmits.
This commit is contained in:
parent
54d069c95c
commit
a4112a96a6
@ -155,6 +155,8 @@ Andreas Schultz <aschultz@warp10.net>
|
||||
for fixing a crash in case there is no 'epg.data' at program start
|
||||
for fixing a bug in the EPG bugfix mechanism if the extended description is shorter
|
||||
than 3 characters
|
||||
for adding direct access to the index data of cPalette (needed for displaying SPUs)
|
||||
for pointing out a possible race condition in the cDvbPlayer
|
||||
|
||||
Aaron Holtzman
|
||||
for writing 'ac3dec'
|
||||
|
19
HISTORY
19
HISTORY
@ -1359,3 +1359,22 @@ Video Disk Recorder Revision History
|
||||
- The following limitations apply to this version:
|
||||
+ The '-a' option (for Dolby Digital audio) doesn't work yet.
|
||||
+ Switching between different language tracks doesn't work yet.
|
||||
|
||||
2002-07-21: Version 1.1.5
|
||||
|
||||
- Added direct access to the index data of cPalette (needed for displaying SPUs,
|
||||
thanks to Andreas Schultz).
|
||||
- The status monitor function cStatus::Replaying() now gets a 'cControl *' argument instead
|
||||
of a 'cDvbPlayerControl *' in order to allow additional players to call this function.
|
||||
cPlayer and cControl have been given the functions GetIndex() and GetReplayMode() to
|
||||
allow access to the player's status.
|
||||
- Added cOsd::OpenRaw() to create a raw OSD (needed for displaying SPUs).
|
||||
- Changed the symantics of the Name parameter in cStatus::Recording() and
|
||||
cStatus::Replaying(). It is no longer the full directory name of the recording,
|
||||
but rather just the basic name. This has been changed to allow players that can't
|
||||
provide a name to simply use a string that describes the player type (like, e.g.,
|
||||
"DVD").
|
||||
- Fixed a hangup when switching to the next file during replay.
|
||||
- Fixed a possible race condition in the cDvbPlayer (thanks to Andreas Schultz
|
||||
for pointing out this one).
|
||||
- Disabled channels on Transponder 12070 in 'channels.conf', which apparently no longer transmits.
|
||||
|
70
PLUGINS.html
70
PLUGINS.html
@ -12,7 +12,7 @@ This interface allows programmers to develop additional functionality for VDR co
|
||||
separate from the core VDR source, without the need of patching the original
|
||||
VDR code (and all the problems of correlating various patches).
|
||||
<p>
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
This document is divided into two parts, the first one describing the
|
||||
<a href="#Part I - The Outside Interface"><i>outside</i> interface</a>
|
||||
of the plugin system, and the second one describing the
|
||||
@ -23,18 +23,18 @@ The <i>inside</i> interface provides the plugin code access to VDR's internal da
|
||||
structures and allows it to hook itself into specific areas to perform special actions.
|
||||
<!--X1.1.3--></td></tr></table>
|
||||
<p>
|
||||
<!--X1.1.1--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
Important modifications introduced in version 1.1.1 are marked like this.
|
||||
<!--X1.1.1--></td></tr></table>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
Important modifications introduced in version 1.1.2 are marked like this.
|
||||
<!--X1.1.2--></td></tr></table>
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
Important modifications introduced in version 1.1.3 are marked like this.
|
||||
<!--X1.1.3--></td></tr></table>
|
||||
<!--X1.1.4--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
<!--X1.1.4--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
Important modifications introduced in version 1.1.4 are marked like this.
|
||||
<!--X1.1.4--></td></tr></table>
|
||||
<!--X1.1.5--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
Important modifications introduced in version 1.1.5 are marked like this.
|
||||
<!--X1.1.5--></td></tr></table>
|
||||
|
||||
<a name="Part I - The Outside Interface"><hr><center><h1>Part I - The Outside Interface</h1></center>
|
||||
|
||||
@ -131,7 +131,7 @@ from the web, it will typically have a name like
|
||||
<p>
|
||||
and will unpack into a directory named
|
||||
<p>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<tt>hello-0.0.1</tt>
|
||||
<!--X1.1.2--></td></tr></table>
|
||||
<p>
|
||||
@ -139,7 +139,7 @@ To use the <tt>plugins</tt> and <tt>plugins-clean</tt> targets from the VDR <tt>
|
||||
you need to unpack such an archive into the <tt>VDR/PLUGINS/SRC</tt> directory and
|
||||
create a symbolic link with the basic plugin name, as in
|
||||
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||
ln -s hello-0.0.1 hello
|
||||
</pre></td></tr></table><p>
|
||||
@ -205,7 +205,6 @@ its memory. You don't need to worry about the details behind all this.
|
||||
If your plugin requires additional source files, simply add them to your plugin's
|
||||
source directory and adjust the <tt>Makefile</tt> accordingly.
|
||||
<p>
|
||||
<!--X1.1.1--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
Header files usually contain preprocessor statements that prevent the same
|
||||
file (or rather its contents, to be precise) from being included more than once, like
|
||||
|
||||
@ -237,7 +236,6 @@ The 'hello' example that comes with VDR makes use of <a href="#Internationalizat
|
||||
and implements a file named <tt>i18n.h</tt>. To make sure it won't clash with VDR's
|
||||
<tt>i18n.h</tt> it uses the macro <tt>_I18N__H</tt> (one underline at the beginning
|
||||
and two replacing the dot).
|
||||
<!--X1.1.1--></td></tr></table>
|
||||
|
||||
<hr><h2>Construction and Destruction</h2>
|
||||
|
||||
@ -424,7 +422,7 @@ If a plugin implements a function that runs in the background (presumably in a
|
||||
thread of its own), or wants to make use of <a href="#Internationalization">internationalization</a>,
|
||||
it needs to implement the function
|
||||
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||
virtual bool Start(void);
|
||||
</pre></td></tr></table><p>
|
||||
@ -436,7 +434,7 @@ its task. This may, for instance, be a thread that collects data from the DVB
|
||||
stream, which is later presented to the user via a function that is available
|
||||
from the main menu.
|
||||
<p>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
A return value of <i>false</i> indicates that something has gone wrong and the
|
||||
plugin will not be able to perform its task. In that case, the plugin should
|
||||
write a proper error message to the log file. The first plugin that returns
|
||||
@ -500,7 +498,7 @@ interaction is possible. If a specific action takes longer than a few seconds,
|
||||
the plugin should launch a separate thread to do this.
|
||||
</b>
|
||||
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<hr><h2>Housekeeping</h2>
|
||||
|
||||
<center><i><b>Chores, chores...</b></i></center><p>
|
||||
@ -547,7 +545,6 @@ previously stored in the global setup data (see below). It shall return
|
||||
<i>true</i> if the parameter was parsed correctly, <i>false</i> in case of
|
||||
an error. If <i>false</i> is returned, an error message will be written to
|
||||
the log file (and program execution will continue).
|
||||
<!--X1.1.1--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
A possible implementation of <tt>SetupParse()</tt> could look like this:
|
||||
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||
@ -563,7 +560,6 @@ bool cPluginHello::SetupParse(const char *Name, const char *Value)
|
||||
|
||||
It is important to make sure that the parameter names are exactly the same as
|
||||
used in the <a href="#The Setup menu"><i>Setup</i> menu</a>'s <tt>Store()</tt> function.
|
||||
<!--X1.1.1--></td></tr></table>
|
||||
<p>
|
||||
The plugin's setup parameters are stored in the same file as VDR's parameters.
|
||||
In order to allow each plugin (and VDR itself) to have its own set of parameters,
|
||||
@ -602,7 +598,6 @@ needs setup parameters that are not directly user adjustable. It can use
|
||||
<tt>SetupStore()</tt> and <tt>SetupParse()</tt> without presenting these
|
||||
parameters to the user.
|
||||
|
||||
<!--X1.1.1--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<a name="The Setup menu"><hr><h2>The Setup menu</h2>
|
||||
|
||||
<center><i><b>Have it your way!</b></i></center><p>
|
||||
@ -660,9 +655,8 @@ You can first assign the temporary values to the global variables and then do th
|
||||
<tt>SetupStore()</tt> calls, or you can define a class or struct that contains all
|
||||
your setup parameters and use that one to copy all parameters with one single statement
|
||||
(like VDR does with its cSetup class).
|
||||
<!--X1.1.1--></td></tr></table>
|
||||
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.1.2--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<hr><h2>Configuration files</h2>
|
||||
|
||||
<center><i><b>I want my own stuff!</b></i></center><p>
|
||||
@ -832,7 +826,7 @@ and display their help and/or version information in addition to its own output.
|
||||
|
||||
If you want to make your plugin available to other VDR users, you'll need to
|
||||
make a package that can be easily distributed.
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
The <tt>Makefile</tt> that has been created by the call to
|
||||
<a href="#Initializing a new plugin directory"><tt>newplugin</tt></a>
|
||||
provides the target <tt>dist</tt>, which does this for you.
|
||||
@ -854,7 +848,7 @@ vdr-hello-0.0.1.tgz
|
||||
in your source directory, where <tt>hello</tt> will be replaced with your actual
|
||||
plugin's name, and <tt>0.0.1</tt> will be your plugin's current version number.
|
||||
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
<!--X1.1.3--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<a name="Part II - The Inside Interface"><hr><center><h1>Part II - The Inside Interface</h1></center>
|
||||
|
||||
<hr><h2>Status monitor</h2>
|
||||
@ -931,7 +925,7 @@ member functions are available in <tt>cStatus</tt>. You only need to implement
|
||||
the functions you actually want to use.
|
||||
<!--X1.1.3--></td></tr></table>
|
||||
|
||||
<!--X1.1.4--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
<!--X1.1.4--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
<hr><h2>Players</h2>
|
||||
|
||||
<center><i><b>Play it again, Sam!</b></i></center><p>
|
||||
@ -1082,5 +1076,37 @@ that they already know. If you absolutely want to do things differently, just go
|
||||
ahead - it's your show...
|
||||
<!--X1.1.4--></td></tr></table>
|
||||
|
||||
<!--X1.1.5--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
<hr><h2>The On Screen Display</h2>
|
||||
|
||||
<center><i><b>Express yourself</b></i></center><p>
|
||||
|
||||
Most of the time a plugin should be able to access the OSD through the
|
||||
standard mechanisms also used by VDR itself. However, these set up the OSD in
|
||||
a manner of textual rows and columns, and automatically set the various
|
||||
windows and color depths.
|
||||
<p>
|
||||
If a plugin needs to have total control over the OSD, it can call the
|
||||
static function
|
||||
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||
#include <vdr/osd.h>
|
||||
|
||||
cOsdBase *MyOsd = cOsd::OpenRaw(x, y);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
where <tt>x</tt> and <tt>y</tt> are the coordinates of the upper left corner
|
||||
of the OSD area on the screen. Such a "raw" OSD doesn't display anything
|
||||
yet, so you need to at least call the function
|
||||
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||
MyOsd->Create(...);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
to define an actual OSD drawing area (see VDR/osdbase.h for the declarations
|
||||
of these functions, and VDR/osd.c to see how VDR opens the OSD and sets up
|
||||
its windows and color depths).
|
||||
<!--X1.1.5--></td></tr></table>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@ -4,3 +4,7 @@ VDR Plugin 'status' Revision History
|
||||
2002-05-18: Version 0.0.1
|
||||
|
||||
- Initial revision.
|
||||
|
||||
2002-07-13: Version 0.0.2
|
||||
|
||||
- Changed the interface of cStatus::Replaying().
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id$
|
||||
# $Id: Makefile 1.1 2002/06/10 16:24:09 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
|
@ -3,13 +3,13 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
* $Id: status.c 1.2 2002/07/13 10:55:55 kls Exp $
|
||||
*/
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/status.h>
|
||||
|
||||
static const char *VERSION = "0.0.1";
|
||||
static const char *VERSION = "0.0.2";
|
||||
static const char *DESCRIPTION = "Status monitor test";
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -19,7 +19,7 @@ class cStatusTest : public cStatus {
|
||||
protected:
|
||||
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||
virtual void Recording(const cDevice *Device, const char *Name);
|
||||
virtual void Replaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name);
|
||||
virtual void Replaying(const cControl *Control, const char *Name);
|
||||
virtual void SetVolume(int Volume, bool Absolute);
|
||||
virtual void OsdClear(void);
|
||||
virtual void OsdTitle(const char *Title);
|
||||
@ -41,7 +41,7 @@ void cStatusTest::Recording(const cDevice *Device, const char *Name)
|
||||
dsyslog("status: cStatusTest::Recording %d %s", Device->CardIndex(), Name);
|
||||
}
|
||||
|
||||
void cStatusTest::Replaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name)
|
||||
void cStatusTest::Replaying(const cControl *Control, const char *Name)
|
||||
{
|
||||
dsyslog("status: cStatusTest::Replaying %s", Name);
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ Premiere Direkt 2B:11719:h:0:27500:767:768;769:0:101:181
|
||||
Premiere Direkt 3A:11719:h:0:27500:511:512;515:0:101:180
|
||||
Premiere Direkt 3B:11719:h:0:27500:1279:1280;1283:0:101:183
|
||||
Premiere Direkt 4A:12031:h:0:27500:2815:2816:0:101:18
|
||||
Premiere Direkt 4B:12070:h:0:27500:1535:1536:0:101:216
|
||||
:#Premiere Direkt 4B:12070:h:0:27500:1535:1536:0:101:216
|
||||
:PW Erotic
|
||||
Beate-Uhse.TV:11758:h:0:27500:1023:1024:0:101:21
|
||||
Premiere Erotik 1:12031:h:0:27500:1279:1280:0:101:513
|
||||
@ -89,11 +89,11 @@ Premiere Erotik 4:11719:h:0:27500:3583:3584:0:101:780
|
||||
Premiere Sport 1:11720:h:0:27500:255:256,257:0:101:17
|
||||
Premiere Sport 2:12031:h:0:27500:3839:3840:0:101:27
|
||||
:Formel 1
|
||||
Supersignal:12070:h:0:27500:255:256:0:101:211
|
||||
Cockpitkanal:12070:h:0:27500:511:512:0:101:212
|
||||
Boxengasse:12070:h:0:27500:767:768:0:101:213
|
||||
Verfolgerfeld:12070:h:0:27500:1023:1024:0:101:214
|
||||
Infokanal:12070:h:0:27500:1279:1280:0:101:215
|
||||
:#Supersignal:12070:h:0:27500:255:256:0:101:211
|
||||
:#Cockpitkanal:12070:h:0:27500:511:512:0:101:212
|
||||
:#Boxengasse:12070:h:0:27500:767:768:0:101:213
|
||||
:#Verfolgerfeld:12070:h:0:27500:1023:1024:0:101:214
|
||||
:#Infokanal:12070:h:0:27500:1279:1280:0:101:215
|
||||
Multikanal:11720:h:0:27500:255:256:0:101:17
|
||||
:Beta Digital
|
||||
N24:12480:v:0:27500:2047:2048:0:0:47
|
||||
|
4
config.h
4
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.h 1.119 2002/06/16 14:49:52 kls Exp $
|
||||
* $Id: config.h 1.120 2002/07/13 09:46:59 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -19,7 +19,7 @@
|
||||
#include "eit.h"
|
||||
#include "tools.h"
|
||||
|
||||
#define VDRVERSION "1.1.4"
|
||||
#define VDRVERSION "1.1.5"
|
||||
|
||||
#define MAXPRIORITY 99
|
||||
#define MAXLIFETIME 99
|
||||
|
17
dvbplayer.c
17
dvbplayer.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbplayer.c 1.4 2002/06/23 10:52:51 kls Exp $
|
||||
* $Id: dvbplayer.c 1.7 2002/07/14 14:30:36 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbplayer.h"
|
||||
@ -116,8 +116,8 @@ public:
|
||||
int SkipFrames(int Frames);
|
||||
void SkipSeconds(int Seconds);
|
||||
void Goto(int Position, bool Still = false);
|
||||
void GetIndex(int &Current, int &Total, bool SnapToIFrame = false);
|
||||
bool GetReplayMode(bool &Play, bool &Forward, int &Speed);
|
||||
virtual bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false);
|
||||
virtual bool GetReplayMode(bool &Play, bool &Forward, int &Speed);
|
||||
};
|
||||
|
||||
#define MAX_VIDEO_SLOWMOTION 63 // max. arg to pass to VIDEO_SLOWMOTION // TODO is this value correct?
|
||||
@ -132,7 +132,7 @@ cDvbPlayer::cDvbPlayer(const char *FileName)
|
||||
backTrace = NULL;
|
||||
index = NULL;
|
||||
eof = false;
|
||||
active = false;
|
||||
active = true;
|
||||
playMode = pmPlay;
|
||||
playDir = pdForward;
|
||||
trickSpeed = NORMAL_SPEED;
|
||||
@ -292,7 +292,6 @@ void cDvbPlayer::Activate(bool On)
|
||||
|
||||
void cDvbPlayer::Action(void)
|
||||
{
|
||||
active = true;
|
||||
dsyslog("dvbplayer thread started (pid=%d)", getpid());
|
||||
|
||||
uchar b[MAXFRAMESIZE];
|
||||
@ -310,6 +309,7 @@ void cDvbPlayer::Action(void)
|
||||
isyslog("resuming replay at index %d (%s)", readIndex, IndexToHMSF(readIndex, true));
|
||||
|
||||
while (active && NextFile()) {
|
||||
pfd[1].fd = replayFile; // NextFile() may have returned a new file handle!
|
||||
{
|
||||
LOCK_THREAD;
|
||||
|
||||
@ -593,7 +593,7 @@ void cDvbPlayer::Goto(int Index, bool Still)
|
||||
}
|
||||
}
|
||||
|
||||
void cDvbPlayer::GetIndex(int &Current, int &Total, bool SnapToIFrame)
|
||||
bool cDvbPlayer::GetIndex(int &Current, int &Total, bool SnapToIFrame)
|
||||
{
|
||||
if (index) {
|
||||
if (playMode == pmStill)
|
||||
@ -607,9 +607,10 @@ void cDvbPlayer::GetIndex(int &Current, int &Total, bool SnapToIFrame)
|
||||
}
|
||||
}
|
||||
Total = index->Last();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
Current = Total = -1;
|
||||
Current = Total = -1;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cDvbPlayer::GetReplayMode(bool &Play, bool &Forward, int &Speed)
|
||||
|
7
menu.c
7
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 1.201 2002/06/23 11:07:19 kls Exp $
|
||||
* $Id: menu.c 1.202 2002/07/14 10:55:37 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -2442,7 +2442,7 @@ cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer)
|
||||
recorder = new cRecorder(fileName, ch->ca, timer->priority, ch->vpid, ch->apid1, ch->apid2, ch->dpid1, ch->dpid2);
|
||||
if (device->AttachReceiver(recorder)) {
|
||||
Recording.WriteSummary();
|
||||
cStatus::MsgRecording(device, fileName);
|
||||
cStatus::MsgRecording(device, Recording.Name());
|
||||
Interface->DisplayRecording(device->CardIndex(), true);
|
||||
}
|
||||
else
|
||||
@ -2688,7 +2688,8 @@ cReplayControl::cReplayControl(void)
|
||||
timeoutShow = 0;
|
||||
timeSearchActive = false;
|
||||
marks.Load(fileName);
|
||||
cStatus::MsgReplaying(this, fileName);
|
||||
cRecording Recording(fileName);
|
||||
cStatus::MsgReplaying(this, Recording.Name());
|
||||
}
|
||||
|
||||
cReplayControl::~cReplayControl()
|
||||
|
16
osd.c
16
osd.c
@ -4,12 +4,13 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osd.c 1.29 2002/06/16 13:24:00 kls Exp $
|
||||
* $Id: osd.c 1.31 2002/07/14 10:57:45 kls Exp $
|
||||
*/
|
||||
|
||||
#include "osd.h"
|
||||
#include <string.h>
|
||||
#include "device.h"
|
||||
#include "dvbosd.h"
|
||||
#include "i18n.h"
|
||||
#include "status.h"
|
||||
|
||||
@ -19,7 +20,7 @@
|
||||
WINDOW *cOsd::window = NULL;
|
||||
int cOsd::colorPairs[MaxColorPairs] = { 0 };
|
||||
#else
|
||||
cDvbOsd *cOsd::osd = NULL;
|
||||
cOsdBase *cOsd::osd = NULL;
|
||||
#endif
|
||||
int cOsd::cols = 0;
|
||||
int cOsd::rows = 0;
|
||||
@ -67,6 +68,15 @@ void cOsd::SetColor(eDvbColor colorFg, eDvbColor colorBg)
|
||||
}
|
||||
#endif
|
||||
|
||||
cOsdBase *cOsd::OpenRaw(int x, int y)
|
||||
{
|
||||
#ifdef DEBUG_OSD
|
||||
return NULL;
|
||||
#else
|
||||
return osd ? NULL : new cDvbOsd(cDevice::PrimaryDevice()->OsdDeviceHandle(), x, y);
|
||||
#endif
|
||||
}
|
||||
|
||||
void cOsd::Open(int w, int h)
|
||||
{
|
||||
int d = (h < 0) ? Setup.OSDheight + h : 0;
|
||||
@ -95,7 +105,7 @@ void cOsd::Open(int w, int h)
|
||||
int x = (720 - w + charWidth) / 2; //TODO PAL vs. NTSC???
|
||||
int y = (576 - Setup.OSDheight * lineHeight) / 2 + d;
|
||||
//XXX
|
||||
osd = new cDvbOsd(cDevice::PrimaryDevice()->OsdDeviceHandle(), x, y);
|
||||
osd = OpenRaw(x, y);
|
||||
//XXX TODO this should be transferred to the places where the individual windows are requested (there's too much detailed knowledge here!)
|
||||
if (h / lineHeight == 5) { //XXX channel display
|
||||
osd->Create(0, 0, w, h, 4);
|
||||
|
10
osd.h
10
osd.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osd.h 1.32 2002/06/23 09:13:17 kls Exp $
|
||||
* $Id: osd.h 1.33 2002/07/13 12:47:06 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __OSD_H
|
||||
@ -14,7 +14,7 @@
|
||||
#include <ncurses.h>
|
||||
#endif
|
||||
#include "config.h"
|
||||
#include "dvbosd.h"
|
||||
#include "osdbase.h"
|
||||
#include "interface.h"
|
||||
#include "osdbase.h"
|
||||
#include "tools.h"
|
||||
@ -62,12 +62,16 @@ private:
|
||||
static int colorPairs[MaxColorPairs];
|
||||
static void SetColor(eDvbColor colorFg, eDvbColor colorBg = clrBackground);
|
||||
#else
|
||||
static cDvbOsd *osd;
|
||||
static cOsdBase *osd;
|
||||
#endif
|
||||
static int cols, rows;
|
||||
public:
|
||||
static void Initialize(void);
|
||||
static void Shutdown(void);
|
||||
static cOsdBase *OpenRaw(int x, int y);
|
||||
// Returns a raw OSD without any predefined windows or colors.
|
||||
// If the "normal" OSD is currently in use, NULL will be returned.
|
||||
// The caller must delete this object before the "normal" OSD is used again!
|
||||
static void Open(int w, int h);
|
||||
static void Close(void);
|
||||
static void Clear(void);
|
||||
|
13
osdbase.c
13
osdbase.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osdbase.c 1.4 2002/05/18 12:39:16 kls Exp $
|
||||
* $Id: osdbase.c 1.5 2002/07/13 14:42:47 kls Exp $
|
||||
*/
|
||||
|
||||
#include "osdbase.h"
|
||||
@ -23,6 +23,17 @@ cPalette::cPalette(int Bpp)
|
||||
full = false;
|
||||
}
|
||||
|
||||
void cPalette::SetColor(int Index, eDvbColor Color)
|
||||
{
|
||||
if (Index < maxColors) {
|
||||
if (numColors < Index)
|
||||
numColors = Index + 1;
|
||||
used[Index] = true;
|
||||
color[Index] = Color;
|
||||
fetched[Index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
int cPalette::Index(eDvbColor Color)
|
||||
{
|
||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osdbase.h 1.2 2002/05/18 12:38:17 kls Exp $
|
||||
* $Id: osdbase.h 1.4 2002/07/13 14:45:55 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __OSDBASE_H
|
||||
@ -50,6 +50,8 @@ private:
|
||||
bool full;
|
||||
protected:
|
||||
typedef unsigned char tIndexes[MAXNUMCOLORS];
|
||||
void SetColor(int Index, eDvbColor Color);
|
||||
eDvbColor GetColor(int Index) { return color[Index]; }
|
||||
public:
|
||||
cPalette(int Bpp);
|
||||
int Index(eDvbColor Color);
|
||||
@ -62,7 +64,6 @@ class cBitmap : public cPalette {
|
||||
private:
|
||||
cFont *font;
|
||||
eDvbFont fontType;
|
||||
void SetIndex(int x, int y, char Index);
|
||||
char *bitmap;
|
||||
bool clearWithBackground;
|
||||
protected:
|
||||
@ -74,6 +75,7 @@ public:
|
||||
bool ClearWithBackground(void) { return clearWithBackground; }
|
||||
eDvbFont SetFont(eDvbFont Font);
|
||||
bool Dirty(int &x1, int &y1, int &x2, int &y2);
|
||||
void SetIndex(int x, int y, char Index);
|
||||
void SetPixel(int x, int y, eDvbColor Color);
|
||||
void SetBitmap(int x, int y, const cBitmap &Bitmap);
|
||||
int Width(void) { return width; }
|
||||
|
13
player.h
13
player.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: player.h 1.4 2002/06/23 12:56:38 kls Exp $
|
||||
* $Id: player.h 1.5 2002/07/13 11:12:26 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __PLAYER_H
|
||||
@ -41,6 +41,15 @@ public:
|
||||
cPlayer(void);
|
||||
virtual ~cPlayer();
|
||||
bool IsAttached(void) { return device != NULL; }
|
||||
virtual bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false) { return false; }
|
||||
// Returns the current and total frame index, optionally snapped to the
|
||||
// nearest I-frame.
|
||||
virtual bool GetReplayMode(bool &Play, bool &Forward, int &Speed) { return false; }
|
||||
// Returns the current replay mode (if applicable).
|
||||
// 'Play' tells whether we are playing or pausing, 'Forward' tells whether
|
||||
// we are going forward or backward and 'Speed' is -1 if this is normal
|
||||
// play/pause mode, 0 if it is single speed fast/slow forward/back mode
|
||||
// and >0 if this is multi speed mode.
|
||||
};
|
||||
|
||||
class cControl : public cOsdObject {
|
||||
@ -54,6 +63,8 @@ public:
|
||||
cControl(cPlayer *Player, bool Hidden = false);
|
||||
virtual ~cControl();
|
||||
virtual void Hide(void) = 0;
|
||||
bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false) { return player->GetIndex(Current, Total, SnapToIFrame); }
|
||||
bool GetReplayMode(bool &Play, bool &Forward, int &Speed) { return player->GetReplayMode(Play, Forward, Speed); }
|
||||
static void Launch(cControl *Control);
|
||||
static void Attach(void);
|
||||
static void Shutdown(void);
|
||||
|
6
status.c
6
status.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: status.c 1.3 2002/06/16 13:24:36 kls Exp $
|
||||
* $Id: status.c 1.4 2002/07/13 10:49:34 kls Exp $
|
||||
*/
|
||||
|
||||
#include "status.h"
|
||||
@ -35,10 +35,10 @@ void cStatus::MsgRecording(const cDevice *Device, const char *Name)
|
||||
sm->Recording(Device, Name);
|
||||
}
|
||||
|
||||
void cStatus::MsgReplaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name)
|
||||
void cStatus::MsgReplaying(const cControl *Control, const char *Name)
|
||||
{
|
||||
for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
|
||||
sm->Replaying(DvbPlayerControl, Name);
|
||||
sm->Replaying(Control, Name);
|
||||
}
|
||||
|
||||
void cStatus::MsgSetVolume(int Volume, bool Absolute)
|
||||
|
19
status.h
19
status.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: status.h 1.3 2002/06/16 13:24:50 kls Exp $
|
||||
* $Id: status.h 1.5 2002/07/14 10:54:39 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __STATUS_H
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
#include "config.h"
|
||||
#include "device.h"
|
||||
#include "dvbplayer.h"
|
||||
#include "player.h"
|
||||
#include "tools.h"
|
||||
|
||||
class cStatus : public cListObject {
|
||||
@ -25,11 +25,14 @@ protected:
|
||||
// If ChannelNumber is 0, this is before the channel is being switched,
|
||||
// otherwise ChannelNumber is the number of the channel that has been switched to.
|
||||
virtual void Recording(const cDevice *Device, const char *Name) {}
|
||||
// The given DVB device has started recording Name. Name is the full directory
|
||||
// name of the recording. If Name is NULL, the recording has ended.
|
||||
virtual void Replaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name) {}
|
||||
// The given player control has started replaying Name. Name is the full directory
|
||||
// name of the recording. If Name is NULL, the replay has ended.
|
||||
// The given DVB device has started recording Name. Name is the name of the
|
||||
// recording, without any directory path.
|
||||
// If Name is NULL, the recording has ended.
|
||||
virtual void Replaying(const cControl *Control, const char *Name) {}
|
||||
// The given player control has started replaying Name. Name is the name of the
|
||||
// recording, without any directory path. In case of a player that can't provide
|
||||
// a name, Name can be a string that identifies the player type (like, e.g., "DVD").
|
||||
// If Name is NULL, the replay has ended.
|
||||
virtual void SetVolume(int Volume, bool Absolute) {}
|
||||
// The volume has been set to the given value, either
|
||||
// absolutely or relative to the current volume.
|
||||
@ -60,7 +63,7 @@ public:
|
||||
// These functions are called whenever the related status information changes:
|
||||
static void MsgChannelSwitch(const cDevice *Device, int ChannelNumber);
|
||||
static void MsgRecording(const cDevice *Device, const char *Name);
|
||||
static void MsgReplaying(const cDvbPlayerControl *DvbPlayerControl, const char *Name);
|
||||
static void MsgReplaying(const cControl *Control, const char *Name);
|
||||
static void MsgSetVolume(int Volume, bool Absolute);
|
||||
static void MsgOsdClear(void);
|
||||
static void MsgOsdTitle(const char *Title);
|
||||
|
118
tmp.dif
118
tmp.dif
@ -1,118 +0,0 @@
|
||||
--- dvb.c
|
||||
+++ dvb.c Wed May 29 17:41:53 2002
|
||||
@@ -444,6 +444,8 @@
|
||||
break;
|
||||
if (!dvb->arm_ready)
|
||||
continue;
|
||||
+ if (down_interruptible(&dvb->dcomlock))
|
||||
+ continue;
|
||||
newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2);
|
||||
if (newloops==dvb->arm_loops) {
|
||||
printk("dvb%d: ARM crashed!\n", dvb->num);
|
||||
@@ -451,6 +453,7 @@
|
||||
newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1;
|
||||
}
|
||||
dvb->arm_loops=newloops;
|
||||
+ up(&dvb->dcomlock);
|
||||
}
|
||||
dvb->arm_thread = NULL;
|
||||
return 0;
|
||||
@@ -1158,6 +1161,31 @@
|
||||
return blen;
|
||||
}
|
||||
|
||||
+/* Timer to avoid broken data transfer in gpioirq() */
|
||||
+
|
||||
+#define GPIO_RXTIME_FRAME ((32*HZ)/1000)
|
||||
+
|
||||
+static void gpio_receive_timeout(unsigned long data)
|
||||
+{
|
||||
+ struct dvb_struct *dvb = (struct dvb_struct *)data;
|
||||
+ dvb->debitimer.expires = 0;
|
||||
+}
|
||||
+
|
||||
+static void gpio_receive_timer(struct dvb_struct *dvb, unsigned long ticks)
|
||||
+{
|
||||
+ dvb_demux_filter_t *dvbdmxfilter = dvb->handle2filter[((dvb->debitype)>>8)&0x1f];
|
||||
+
|
||||
+ if (!dvbdmxfilter || dvbdmxfilter->type != DMX_TYPE_TS)
|
||||
+ return;
|
||||
+ mod_timer(&dvb->debitimer, jiffies + ticks);
|
||||
+}
|
||||
+
|
||||
+static inline int gpio_rx_pending(struct dvb_struct *dvb)
|
||||
+{
|
||||
+ return !timer_pending(&dvb->debitimer) && \
|
||||
+ dvb->debitimer.expires == 0;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
gpioirq(struct saa7146* saa, void *data)
|
||||
{
|
||||
@@ -1313,6 +1341,7 @@
|
||||
iwdebi(dvb, DEBINOSWAP, RX_BUFF, 0, 2);
|
||||
break;
|
||||
} /* yes, fall through */
|
||||
+ gpio_receive_timer(dvb, GPIO_RXTIME_FRAME);
|
||||
case DATA_TS_RECORD:
|
||||
case DATA_PES_RECORD:
|
||||
saa7146_write(dvb->saa_mem, IER,
|
||||
@@ -1843,7 +1872,7 @@
|
||||
bpp=dvb->osdbpp[dvb->osdwin]+1;
|
||||
bpl=((w*bpp+7)&~7)/8;
|
||||
size=h*bpl;
|
||||
- lpb=(32*1024)/bpl;
|
||||
+ lpb=(16*1024)/bpl;
|
||||
bnum=size/(lpb*bpl);
|
||||
brest=size-bnum*lpb*bpl;
|
||||
|
||||
@@ -1851,6 +1880,10 @@
|
||||
LoadBitmap(dvb, bpp2bit[dvb->osdbpp[dvb->osdwin]], w, lpb, inc, data);
|
||||
BlitBitmap(dvb, dvb->osdwin, x0, y0+i*lpb, 0);
|
||||
data+=lpb*inc;
|
||||
+ if (gpio_rx_pending(dvb)) {
|
||||
+ set_current_state(TASK_INTERRUPTIBLE);
|
||||
+ schedule_timeout(GPIO_RXTIME_FRAME);
|
||||
+ }
|
||||
}
|
||||
if (brest) {
|
||||
LoadBitmap(dvb, bpp2bit[dvb->osdbpp[dvb->osdwin]], w, brest/bpl, inc, data);
|
||||
@@ -3819,6 +3852,7 @@
|
||||
return TTBStop(dvb);
|
||||
|
||||
if (dvbdmxfeed->type == DMX_TYPE_TS) {
|
||||
+ del_timer(&dvb->debitimer);
|
||||
if (dvbdmxfeed->ts_type & TS_DECODER) {
|
||||
if (dvbdmxfeed->pes_type>=DMX_TS_PES_OTHER ||
|
||||
!dvbdmx->pesfilter[dvbdmxfeed->pes_type])
|
||||
@@ -5472,8 +5506,12 @@
|
||||
spin_lock_init (&dvb->debilock);
|
||||
sema_init(&dvb->dcomlock, 1);
|
||||
init_waitqueue_head(&dvb->debiq);
|
||||
+ init_timer(&dvb->debitimer);
|
||||
dvb->debilock=SPIN_LOCK_UNLOCKED;
|
||||
dvb->debitype=-1;
|
||||
+ dvb->debitimer.function = gpio_receive_timeout;
|
||||
+ dvb->debitimer.data = (unsigned long) dvb;
|
||||
+ dvb->debitimer.expires = jiffies;
|
||||
|
||||
dvb->num=num;
|
||||
dvb->i2cbus=adap;
|
||||
@@ -5741,6 +5779,7 @@
|
||||
|
||||
/* release the saa7146s */
|
||||
for( i = 0; i < num_dvb; i++) {
|
||||
+ del_timer_sync(&(dvbs[i].debitimer));
|
||||
dvbs[i].arm_rmmod=1;
|
||||
wake_up_interruptible(&dvbs[i].arm_wait);
|
||||
while (dvbs[i].arm_thread)
|
||||
--- dvb.h
|
||||
+++ dvb.h Wed May 29 17:41:08 2002
|
||||
@@ -566,6 +566,7 @@
|
||||
spinlock_t debilock;
|
||||
struct semaphore dcomlock;
|
||||
WAIT_QUEUE debiq;
|
||||
+ struct timer_list debitimer;
|
||||
int debitype;
|
||||
int debilen;
|
||||
int debibuf;
|
Loading…
x
Reference in New Issue
Block a user