mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
VDR developer version 2.1.2 is now available at ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.2.tar.bz2 A 'diff' against the previous version is available at ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.1-2.1.2.diff MD5 checksums: 4725e9cb26fea8fa3682dd30f5594a50 vdr-2.1.2.tar.bz2 869d9b298b432a505186328bcf0b53c6 vdr-2.1.1-2.1.2.diff WARNING: ======== This is a *developer* version. Even though *I* use it in my productive environment, I strongly recommend that you only use it under controlled conditions and for testing and debugging. From the HISTORY file: - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). - Fixed displaying DVB subtitles (thanks to Rolf Ahrenberg for helping to debug and understand subtitle page refreshes): + Fixed handling DVB subtitle fill region codes for 2 and 8 bpp. + Fixed handling pages without an explicit END_OF_DISPLAY_SET_SEGMENT. The FINISHPAGE_HACK is no longer necessary. + Fixed handling "page refreshes". The data is now parsed and stored closer to the DVB standard specs, introducing "object refs" and "region refs". + The debug output now goes into an HTML file named dbg-log.htm and shows the actual bitmaps (dbg-nnn.jpg) used to display the subtitles. That way it is much easier to see what's actually going on. + Fixed handling subtitles encoded as a string of characters (the very first character was always skipped). - Fixed wrong initialization of Setup.PositionerSwing (reported by Arthur Konovalov). - Updated the Estonian OSD texts (thanks to Arthur Konovalov). - Fixed cleaning up old EPG events in case no epg data file is given (reported by Dave Pickles). - Unified the internal sequence of actions when pressing the Blue and the Back key, respectively, during replay (reported by Thomas Maass). - The Yellow button in the main menu no longer acts as "Pause" if "Pause key handling" is set to "do not pause live video" (suggested by Ulf Kiener). - The code for distributing recordings over several video directories has been removed. VDR now by default assumes that the video directory is one big disk. If you absolutely need to use several separate disks to store recordings, you can write a plugin that uses the new cVideoDirectory API to implement the necessary functionality (see PLUGINS.html, section "The video directory"). You can copy the respective code from previous versions of videodir.c. IMPORTANT NOTE: If you write a plugin that implements a distributed video directory, =============== be sure to make cVideoDirectory::Rename() follow symbolic links! This functionality was never implemented in VDR and it therefore used a workaround in cutter.c. See the section marked with // XXX this can be removed once RenameVideoFile() follows symlinks in previous versions of cutter.c. + CloseVideoFile() is obsolete and has been removed. + The functions OpenVideoFile(), RenameVideoFile(), RemoveVideoFile(), VideoFileSpaceAvailable(), VideoDiskSpace(), RemoveEmptyVideoDirectories(), IsOnVideoDirectoryFileSystem() and PrefixVideoFileName() are now static members of cVideoDirectory and need to be called with the proper prefix. + The name of the video directory is now available through cVideoDirectory::Name(). - Added renaming and moving recordings and folders, editing a recording's priority and lifetime, and queueing cutting jobs (inspired by the "extrecmenu" plugin from Martin Prochnow). + The "Recording info" menu now has a new Blue button named "Edit", which opens a dialog in which several properties of the selected recording can be changed. It can be renamed or moved into another folder and its priority and lifetime can be modified (inspired by the "extrecmenu" plugin from Martin Prochnow). The new blue "Edit" button in the "Recordings" menu opens a dialog in which a folder can be renamed or moved. See MANUAL, section "Managing folders". + In the "Edit recording" menu the Yellow button ("Delete marks") allows you to delete all editing marks of the selected recording. + cCutter is no longer a static class. Cutting requests should now be invoked by calling RecordingsHandler.Add(ruCut, FileName). See the new cRecordingsHandler class in recording.h. + Cutting jobs are now placed in a queue (together with any move or copy jobs) and are processed one by one. + The new SVDRP command RENR can be used to rename a recording (suggested by Rolf Ahrenberg). + Note that in several places in the source code a "copy" operation is mentioned, however there is no user interface for this, yet. - Changed some variable names in positioner.c to match the names used in the page with the explanation on vdr-portal.de. - Updated the Italian OSD texts (thanks to Diego Pierotto). - Fixed writing group separators to channels.conf that contain a comma (reported by Eike Edener). - Now also checking the source (in addition to the transponder) when setting the system time from the TDT, which avoids problems in case devices are tuned to the same transponder on different sources, and these broadcast different time data (reported by Torsten Lang). - Changed cRecorder::Action() to use cTimeMs instead of time() to avoid problems with unjustified "video data stream broken" errors in case the system time is changed while a recording is active (reported by Torsten Lang). - Revised the section on "Learning the remote control keys" in the INSTALL file to avoid the impression that there actually is a default remote.conf file, and to not use any alphabetic keys for special functions, so that they remain available for textual input. - The function cRecordings::MBperMinute() now only takes into account recordings with less than 5 seconds per megabyte, in an attempt to filter out radio recordings (thanks to Harald Koenig). The result of this function was way off any realistic value in case there are many radio recordings in the video directory. - Added maximum signal strength value for TechniSat SkyStar 2 DVB-S rev 2.3P (thanks to Guido Cordaro). - Fixed an inconsistent behavior between opening the Recordings menu manually via the main menu and by pressing the Recordings key. In the latter case it automatically opened all sub folders to position the cursor to the last replayed recording, which is unexpected at this point (reported by Helmut Auer). You can still navigate to the last replayed recording (if any) by pressing Ok repeatedly in the Recordings menu.
305 lines
8.4 KiB
C++
305 lines
8.4 KiB
C++
/*
|
|
* menu.h: The actual menu implementations
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: menu.h 3.3 2013/10/16 09:14:58 kls Exp $
|
|
*/
|
|
|
|
#ifndef __MENU_H
|
|
#define __MENU_H
|
|
|
|
#include "ci.h"
|
|
#include "device.h"
|
|
#include "epg.h"
|
|
#include "osdbase.h"
|
|
#include "dvbplayer.h"
|
|
#include "menuitems.h"
|
|
#include "recorder.h"
|
|
#include "skins.h"
|
|
|
|
class cMenuText : public cOsdMenu {
|
|
private:
|
|
char *text;
|
|
eDvbFont font;
|
|
public:
|
|
cMenuText(const char *Title, const char *Text, eDvbFont Font = fontOsd);
|
|
virtual ~cMenuText();
|
|
void SetText(const char *Text);
|
|
virtual void Display(void);
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
class cMenuFolder : public cOsdMenu {
|
|
private:
|
|
cNestedItemList *nestedItemList;
|
|
cList<cNestedItem> *list;
|
|
cString dir;
|
|
cOsdItem *firstFolder;
|
|
bool editing;
|
|
void SetHelpKeys(void);
|
|
void Set(const char *CurrentFolder = NULL);
|
|
void DescendPath(const char *Path);
|
|
eOSState SetFolder(void);
|
|
eOSState Select(void);
|
|
eOSState New(void);
|
|
eOSState Delete(void);
|
|
eOSState Edit(void);
|
|
cMenuFolder(const char *Title, cList<cNestedItem> *List, cNestedItemList *NestedItemList, const char *Dir, const char *Path = NULL);
|
|
public:
|
|
cMenuFolder(const char *Title, cNestedItemList *NestedItemList, const char *Path = NULL);
|
|
cString GetFolder(void);
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
class cMenuCommands : public cOsdMenu {
|
|
private:
|
|
cList<cNestedItem> *commands;
|
|
cString parameters;
|
|
cString title;
|
|
cString command;
|
|
bool confirm;
|
|
char *result;
|
|
bool Parse(const char *s);
|
|
eOSState Execute(void);
|
|
public:
|
|
cMenuCommands(const char *Title, cList<cNestedItem> *Commands, const char *Parameters = NULL);
|
|
virtual ~cMenuCommands();
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
class cMenuEditTimer : public cOsdMenu {
|
|
private:
|
|
cTimer *timer;
|
|
cTimer data;
|
|
int channel;
|
|
bool addIfConfirmed;
|
|
cMenuEditStrItem *file;
|
|
cMenuEditDateItem *day;
|
|
cMenuEditDateItem *firstday;
|
|
eOSState SetFolder(void);
|
|
void SetFirstDayItem(void);
|
|
void SetHelpKeys(void);
|
|
public:
|
|
cMenuEditTimer(cTimer *Timer, bool New = false);
|
|
virtual ~cMenuEditTimer();
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
class cMenuEvent : public cOsdMenu {
|
|
private:
|
|
const cEvent *event;
|
|
public:
|
|
cMenuEvent(const cEvent *Event, bool CanSwitch = false, bool Buttons = false);
|
|
virtual void Display(void);
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
class cMenuMain : public cOsdMenu {
|
|
private:
|
|
bool replaying;
|
|
cOsdItem *stopReplayItem;
|
|
cOsdItem *cancelEditingItem;
|
|
cOsdItem *stopRecordingItem;
|
|
int recordControlsState;
|
|
static cOsdObject *pluginOsdObject;
|
|
void Set(void);
|
|
bool Update(bool Force = false);
|
|
public:
|
|
cMenuMain(eOSState State = osUnknown, bool OpenSubMenus = false);
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
static cOsdObject *PluginOsdObject(void);
|
|
};
|
|
|
|
class cDisplayChannel : public cOsdObject {
|
|
private:
|
|
cSkinDisplayChannel *displayChannel;
|
|
int group;
|
|
bool withInfo;
|
|
cTimeMs lastTime;
|
|
int number;
|
|
bool timeout;
|
|
const cPositioner *positioner;
|
|
cChannel *channel;
|
|
const cEvent *lastPresent;
|
|
const cEvent *lastFollowing;
|
|
static cDisplayChannel *currentDisplayChannel;
|
|
void DisplayChannel(void);
|
|
void DisplayInfo(void);
|
|
void Refresh(void);
|
|
cChannel *NextAvailableChannel(cChannel *Channel, int Direction);
|
|
public:
|
|
cDisplayChannel(int Number, bool Switched);
|
|
cDisplayChannel(eKeys FirstKey);
|
|
virtual ~cDisplayChannel();
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
static bool IsOpen(void) { return currentDisplayChannel != NULL; }
|
|
};
|
|
|
|
class cDisplayVolume : public cOsdObject {
|
|
private:
|
|
cSkinDisplayVolume *displayVolume;
|
|
cTimeMs timeout;
|
|
static cDisplayVolume *currentDisplayVolume;
|
|
virtual void Show(void);
|
|
cDisplayVolume(void);
|
|
public:
|
|
virtual ~cDisplayVolume();
|
|
static cDisplayVolume *Create(void);
|
|
static void Process(eKeys Key);
|
|
eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
class cDisplayTracks : public cOsdObject {
|
|
private:
|
|
cSkinDisplayTracks *displayTracks;
|
|
cTimeMs timeout;
|
|
eTrackType types[ttMaxTrackTypes];
|
|
char *descriptions[ttMaxTrackTypes + 1]; // list is NULL terminated
|
|
int numTracks, track, audioChannel;
|
|
static cDisplayTracks *currentDisplayTracks;
|
|
virtual void Show(void);
|
|
cDisplayTracks(void);
|
|
public:
|
|
virtual ~cDisplayTracks();
|
|
static bool IsOpen(void) { return currentDisplayTracks != NULL; }
|
|
static cDisplayTracks *Create(void);
|
|
static void Process(eKeys Key);
|
|
eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
class cDisplaySubtitleTracks : public cOsdObject {
|
|
private:
|
|
cSkinDisplayTracks *displayTracks;
|
|
cTimeMs timeout;
|
|
eTrackType types[ttMaxTrackTypes];
|
|
char *descriptions[ttMaxTrackTypes + 1]; // list is NULL terminated
|
|
int numTracks, track;
|
|
static cDisplaySubtitleTracks *currentDisplayTracks;
|
|
virtual void Show(void);
|
|
cDisplaySubtitleTracks(void);
|
|
public:
|
|
virtual ~cDisplaySubtitleTracks();
|
|
static bool IsOpen(void) { return currentDisplayTracks != NULL; }
|
|
static cDisplaySubtitleTracks *Create(void);
|
|
static void Process(eKeys Key);
|
|
eOSState ProcessKey(eKeys Key);
|
|
};
|
|
|
|
cOsdObject *CamControl(void);
|
|
bool CamMenuActive(void);
|
|
|
|
class cMenuRecordingItem;
|
|
|
|
class cMenuRecordings : public cOsdMenu {
|
|
private:
|
|
char *base;
|
|
int level;
|
|
int recordingsState;
|
|
int helpKeys;
|
|
static cString path;
|
|
static cString fileName;
|
|
void SetHelpKeys(void);
|
|
void Set(bool Refresh = false);
|
|
bool Open(bool OpenSubMenus = false);
|
|
eOSState Play(void);
|
|
eOSState Rewind(void);
|
|
eOSState Delete(void);
|
|
eOSState Info(void);
|
|
eOSState Sort(void);
|
|
eOSState Commands(eKeys Key = kNone);
|
|
protected:
|
|
cString DirectoryName(void);
|
|
public:
|
|
cMenuRecordings(const char *Base = NULL, int Level = 0, bool OpenSubMenus = false);
|
|
~cMenuRecordings();
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
static void SetPath(const char *Path);
|
|
static void SetRecording(const char *FileName);
|
|
};
|
|
|
|
class cRecordControl {
|
|
private:
|
|
cDevice *device;
|
|
cTimer *timer;
|
|
cRecorder *recorder;
|
|
const cEvent *event;
|
|
cString instantId;
|
|
char *fileName;
|
|
bool GetEvent(void);
|
|
public:
|
|
cRecordControl(cDevice *Device, cTimer *Timer = NULL, bool Pause = false);
|
|
virtual ~cRecordControl();
|
|
bool Process(time_t t);
|
|
cDevice *Device(void) { return device; }
|
|
void Stop(bool ExecuteUserCommand = true);
|
|
const char *InstantId(void) { return instantId; }
|
|
const char *FileName(void) { return fileName; }
|
|
cTimer *Timer(void) { return timer; }
|
|
};
|
|
|
|
class cRecordControls {
|
|
private:
|
|
static cRecordControl *RecordControls[];
|
|
static int state;
|
|
public:
|
|
static bool Start(cTimer *Timer = NULL, bool Pause = false);
|
|
static void Stop(const char *InstantId);
|
|
static bool PauseLiveVideo(void);
|
|
static const char *GetInstantId(const char *LastInstantId);
|
|
static cRecordControl *GetRecordControl(const char *FileName);
|
|
static cRecordControl *GetRecordControl(const cTimer *Timer);
|
|
///< Returns the cRecordControl for the given Timer.
|
|
///< If there is no cRecordControl for Timer, NULL is returned.
|
|
static void Process(time_t t);
|
|
static void ChannelDataModified(cChannel *Channel);
|
|
static bool Active(void);
|
|
static void Shutdown(void);
|
|
static void ChangeState(void) { state++; }
|
|
static bool StateChanged(int &State);
|
|
};
|
|
|
|
class cReplayControl : public cDvbPlayerControl {
|
|
private:
|
|
cSkinDisplayReplay *displayReplay;
|
|
cMarks marks;
|
|
bool marksModified;
|
|
bool visible, modeOnly, shown, displayFrames;
|
|
int lastCurrent, lastTotal;
|
|
bool lastPlay, lastForward;
|
|
int lastSpeed;
|
|
time_t timeoutShow;
|
|
bool timeSearchActive, timeSearchHide;
|
|
int timeSearchTime, timeSearchPos;
|
|
void TimeSearchDisplay(void);
|
|
void TimeSearchProcess(eKeys Key);
|
|
void TimeSearch(void);
|
|
void ShowTimed(int Seconds = 0);
|
|
static cReplayControl *currentReplayControl;
|
|
static cString fileName;
|
|
void ShowMode(void);
|
|
bool ShowProgress(bool Initial);
|
|
void MarkToggle(void);
|
|
void MarkJump(bool Forward);
|
|
void MarkMove(bool Forward);
|
|
void EditCut(void);
|
|
void EditTest(void);
|
|
public:
|
|
cReplayControl(bool PauseLive = false);
|
|
virtual ~cReplayControl();
|
|
void Stop(void);
|
|
virtual cOsdObject *GetInfo(void);
|
|
virtual const cRecording *GetRecording(void);
|
|
virtual eOSState ProcessKey(eKeys Key);
|
|
virtual void Show(void);
|
|
virtual void Hide(void);
|
|
bool Visible(void) { return visible; }
|
|
static void SetRecording(const char *FileName);
|
|
static const char *NowReplaying(void);
|
|
static const char *LastReplayed(void);
|
|
static void ClearLastReplayed(const char *FileName);
|
|
};
|
|
|
|
#endif //__MENU_H
|