diff options
-rw-r--r-- | README.txt | 21 | ||||
-rw-r--r-- | softhddev.c | 48 | ||||
-rw-r--r-- | softhddev.h | 4 | ||||
-rw-r--r-- | softhddevice.cpp | 74 |
4 files changed, 116 insertions, 31 deletions
@@ -95,6 +95,9 @@ Setup: /etc/vdr/setup.conf softhddevice.MakePrimary = 1 0 = no change, 1 make softhddevice primary at start + softhddevice.HideMainMenuEntry = 0 + 0 = show softhddevice main menu entry, 1 = hide entry + <res> of the next parameters is 567i, 720p, 1080i_fake or 1080i. 1080i_fake is 1280x1080 or 1440x1080 1080i is "real" 1920x1080 @@ -122,12 +125,30 @@ Setup: /etc/vdr/setup.conf softhddevice.AudioPassthrough = 0 0 = none, 1 = AC-3 +Setup: /etc/vdr/remote.conf +------ + + Add "XKeySym." definitions to /etc/vdr/remote.conf to control + the vdr and plugin with the connected input device. + + fe. + XKeySym.Up Up + XKeySym.Down Down + ... + + Additional to the x11 input sends the window close button "Close". + + fe. + XKeySym.Power Close Commandline: ------------ Use vdr -h to see the command line arguments support by the plugin. +Running: +-------- + Warning: -------- libav is not supported, expect many bugs with it. diff --git a/softhddev.c b/softhddev.c index 72c31e6..cebffcd 100644 --- a/softhddev.c +++ b/softhddev.c @@ -52,7 +52,7 @@ static char ConfigVdpauDecoder = 1; ///< use vdpau decoder, if possible #define ConfigVdpauDecoder 0 ///< no vdpau decoder configured #endif -static const char DeviceStopped = 1; ///< flag device stopped +static volatile char VideoFreezed; ///< video freezed ////////////////////////////////////////////////////////////////////////////// // Audio @@ -195,13 +195,16 @@ int PlayAudio(const uint8_t * data, int size, // channel switch: SetAudioChannelDevice: SetDigitalAudioDevice: + if (VideoFreezed) { // video freezed + return 0; + } if (NewAudioStream) { // FIXME: does this clear the audio ringbuffer? CodecAudioClose(MyAudioDecoder); AudioCodecID = CODEC_ID_NONE; NewAudioStream = 0; } - if (SkipAudio) { + if (SkipAudio) { // skip audio return size; } // PES header 0x00 0x00 0x01 ID @@ -348,8 +351,8 @@ static AVPacket VideoPacketRb[VIDEO_PACKET_MAX]; static int VideoPacketWrite; ///< write pointer static int VideoPacketRead; ///< read pointer static atomic_t VideoPacketsFilled; ///< how many of the buffer is used -static volatile char VideoFreezed; ///< video freezed static volatile char VideoClearBuffers; ///< clear video buffers +static volatile char SkipVideo; ///< skip video #ifdef DEBUG static int VideoMaxPacketSize; ///< biggest used packet buffer @@ -648,6 +651,12 @@ int PlayVideo(const uint8_t * data, int size) if (!MyVideoDecoder) { // no x11 video started return size; } + if (SkipVideo) { // skip video + return size; + } + if (VideoFreezed) { // video freezed + return 0; + } if (NewVideoStream) { // channel switched Debug(3, "video: new stream %d\n", GetMsTicks() - VideoSwitch); // FIXME: hack to test results @@ -668,7 +677,7 @@ int PlayVideo(const uint8_t * data, int size) n = data[8]; // header size // wrong size if (size < 9 + n + 4) { - Error(_("[softhddev] invalid video packet\n")); + Error(_("[softhddev] invalid video packet %d bytes\n"), size); return size; } // FIXME: hack to test results @@ -761,6 +770,7 @@ int PlayVideo(const uint8_t * data, int size) */ void SetPlayMode(void) { + Resume(); if (MyVideoDecoder) { if (VideoCodecID != CODEC_ID_NONE) { NewVideoStream = 1; @@ -774,6 +784,7 @@ void SetPlayMode(void) } VideoFreezed = 0; SkipAudio = 0; + SkipVideo = 0; } /** @@ -910,6 +921,7 @@ void OsdClose(void) */ void OsdDrawARGB(int x, int y, int height, int width, const uint8_t * argb) { + Resume(); VideoOsdDrawARGB(x, y, height, width, argb); } @@ -1138,3 +1150,31 @@ void Stop(void) void MainThreadHook(void) { } + +////////////////////////////////////////////////////////////////////////////// +// Suspend/Resume +////////////////////////////////////////////////////////////////////////////// + +/** +** Suspend plugin. +*/ +void Suspend(void) +{ + // FIXME: close audio + // FIXME: close video + // FIXME: stop x11, if started + SkipVideo = 1; + SkipAudio = 1; +} + +/** +** Resume plugin. +*/ +void Resume(void) +{ + if (SkipVideo && SkipAudio) { + Debug(3, "[softhddev]%s:\n", __FUNCTION__); + SkipVideo = 0; + SkipAudio = 0; + } +} diff --git a/softhddev.h b/softhddev.h index fbd4673..51e07ba 100644 --- a/softhddev.h +++ b/softhddev.h @@ -76,6 +76,10 @@ extern "C" /// C plugin main thread hook extern void MainThreadHook(void); + /// Suspend plugin + extern void Suspend(void); + /// Resume plugin + extern void Resume(void); #ifdef __cplusplus } #endif diff --git a/softhddevice.cpp b/softhddevice.cpp index b1ddd9d..7d40b61 100644 --- a/softhddevice.cpp +++ b/softhddevice.cpp @@ -46,7 +46,7 @@ static const char *const VERSION = "0.3.0"; static const char *const DESCRIPTION = trNOOP("A software and GPU emulated HD device"); -//static const char *MAINMENUENTRY = trNOOP("Soft-HD-Device"); +static const char *MAINMENUENTRY = trNOOP("Suspend Soft-HD-Device"); static class cSoftHdDevice *MyDevice; ////////////////////////////////////////////////////////////////////////////// @@ -58,6 +58,7 @@ static const char *const Resolution[RESOLUTIONS] = { }; static char ConfigMakePrimary; ///< config primary wanted +static char ConfigHideMainMenuEntry; ///< config hide main menu entry /// config deinterlace static int ConfigVideoDeinterlace[RESOLUTIONS]; @@ -306,6 +307,7 @@ class cMenuSetupSoft:public cMenuSetupPage { protected: int MakePrimary; + int HideMainMenuEntry; int Scaling[RESOLUTIONS]; int Deinterlace[RESOLUTIONS]; int SkipChromaDeinterlace[RESOLUTIONS]; @@ -356,6 +358,9 @@ cMenuSetupSoft::cMenuSetupSoft(void) MakePrimary = ConfigMakePrimary; Add(new cMenuEditBoolItem(tr("Make primary device"), &MakePrimary, tr("no"), tr("yes"))); + HideMainMenuEntry = ConfigHideMainMenuEntry; + Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &HideMainMenuEntry, + tr("no"), tr("yes"))); // // video // @@ -397,6 +402,8 @@ void cMenuSetupSoft::Store(void) int i; SetupStore("MakePrimary", ConfigMakePrimary = MakePrimary); + SetupStore("HideMainMenuEntry", ConfigHideMainMenuEntry = + HideMainMenuEntry); for (i = 0; i < RESOLUTIONS; ++i) { char buf[128]; @@ -584,6 +591,9 @@ void cSoftHdDevice::Play(void) ::Play(); } +/** +** Puts the device into "freeze frame" mode. +*/ void cSoftHdDevice::Freeze(void) { dsyslog("[softhddev]%s:\n", __FUNCTION__); @@ -759,8 +769,8 @@ class cPluginSoftHdDevice:public cPlugin virtual void Stop(void); // virtual void Housekeeping(void); virtual void MainThreadHook(void); -// virtual const char *MainMenuEntry(void); -// virtual cOsdObject *MainMenuAction(void); + virtual const char *MainMenuEntry(void); + virtual cOsdObject *MainMenuAction(void); virtual cMenuSetupPage *SetupMenu(void); virtual bool SetupParse(const char *, const char *); // virtual bool Service(const char *Id, void *Data = NULL); @@ -860,14 +870,29 @@ void cPluginSoftHdDevice::Housekeeping(void) // Perform any cleanup or other regular tasks. } +#endif + +/** +** Create main menu entry. +*/ const char *cPluginSoftHdDevice::MainMenuEntry(void) { //dsyslog("[softhddev]%s:\n", __FUNCTION__); - return tr(MAINMENUENTRY); - return NULL; + + return ConfigHideMainMenuEntry ? NULL : tr(MAINMENUENTRY); } -#endif +/** +** Perform the action when selected from the main VDR menu. +*/ +cOsdObject *cPluginSoftHdDevice::MainMenuAction(void) +{ + dsyslog("[softhddev]%s:\n", __FUNCTION__); + + Suspend(); + + return NULL; +} /** ** Called for every plugin once during every cycle of VDR's main program @@ -886,25 +911,6 @@ void cPluginSoftHdDevice::MainThreadHook(void) ::MainThreadHook(); } -#if 0 - -bool cPluginSoftHdDevice::Service(const char *Id, void *Data) -{ - dsyslog("[softhddev]%s:\n", __FUNCTION__); - - return false; -} - -cOsdObject *cPluginSoftHdDevice::MainMenuAction(void) -{ - // Perform the action when selected from the main VDR menu. - dsyslog("[softhddev]%s:\n", __FUNCTION__); - - return NULL; -} - -#endif - /** ** Return our setup menu. */ @@ -923,13 +929,16 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value) int i; char buf[128]; - dsyslog("[softhddev]%s: '%s' = '%s'\n", __FUNCTION__, name, value); + //dsyslog("[softhddev]%s: '%s' = '%s'\n", __FUNCTION__, name, value); - // FIXME: handle the values if (!strcmp(name, "MakePrimary")) { ConfigMakePrimary = atoi(value); return true; } + if (!strcmp(name, "HideMainMenuEntry")) { + ConfigHideMainMenuEntry = atoi(value); + return true; + } for (i = 0; i < RESOLUTIONS; ++i) { snprintf(buf, sizeof(buf), "%s.%s", Resolution[i], "Scaling"); if (!strcmp(name, buf)) { @@ -975,4 +984,15 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value) return false; } +#if 0 + +bool cPluginSoftHdDevice::Service(const char *Id, void *Data) +{ + dsyslog("[softhddev]%s:\n", __FUNCTION__); + + return false; +} + +#endif + VDRPLUGINCREATOR(cPluginSoftHdDevice); // Don't touch this! |