summaryrefslogtreecommitdiff
path: root/ttxtsubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ttxtsubs.c')
-rw-r--r--ttxtsubs.c360
1 files changed, 259 insertions, 101 deletions
diff --git a/ttxtsubs.c b/ttxtsubs.c
index 7a332d1..aafccfb 100644
--- a/ttxtsubs.c
+++ b/ttxtsubs.c
@@ -10,7 +10,9 @@
#include <vdr/status.h>
#include <vdr/vdrttxtsubshooks.h>
#include <vdr/menuitems.h>
+#include <vdr/thread.h>
#include <vdr/config.h>
+#include <semaphore.h>
#define TIMEMEASURE 0
#if TIMEMEASURE
@@ -31,39 +33,54 @@
#include "utils.h"
#include "siinfo.h"
#include "ttxtsubs.h"
+#include "ttxtsubspagemenu.h"
+#include "ttxtsubschannelsettings.h"
-static const char *VERSION = "0.0.5";
-static const char *DESCRIPTION = "Teletext subtitles";
+#if defined(APIVERSNUM) && APIVERSNUM < 10400
+#error "This version of ttxtsubs only works with vdr version >= 1.4.0!"
+#endif
+
+#ifndef trNOOP
+#define trNOOP(s) (s)
+#endif
+#ifndef trVDR
+#define trVDR(s) tr(s)
+#endif
+
+static const char *VERSION = "0.0.5-RRE";
+static const char *DESCRIPTION = trNOOP("Teletext subtitles");
cTtxtsubsConf globals;
+cTtxtSubsChannelSettings TtxtSubsChannelSettings;
// ISO 639-2 language codes in VDR order
// XXX should be replaced with something that allows for other languages and for real language names!
// <http://www.avio-systems.com/dtvcc/iso639-2.txt>
// <http://www.loc.gov/standards/iso639-2/englangn_ascii.html>
-char *gLanguages[][2] = {
- "","", //None
- "eng","", //English
- "deu","ger", //Deutsch
- "slv","", //Slovenian
- "ita","", //Italian
- "dut","nld", //Dutch
- "por","", //Portuguese
- "fre","fra", //French
- "nor","", //Norwegian
- "fin","suo", //Finnish
- "pol","", //Polish
- "spa","esl", //Spanish
- "gre","ell", //Greek
- "swe","sve", //Swedish
- "ron","rum", //Romanian
- "hun","", //Hungarian
- "cat","", //Catalanian
-#if VDRVERSNUM >= 10300
- "rus","", //Russian
-#endif
- // Not in translations!
- "dan","" //Danish
+const char *gLanguages[][2] = {
+ {"",""}, //None
+ {"eng",""}, //English
+ {"deu","ger"}, //Deutsch
+ {"slv",""}, //Slovenian
+ {"ita",""}, //Italian
+ {"dut","nld"}, //Dutch
+ {"por",""}, //Portuguese
+ {"fre","fra"}, //French
+ {"nor",""}, //Norwegian
+ {"fin","suo"}, //Finnish
+ {"pol",""}, //Polish
+ {"spa","esl"}, //Spanish
+ {"gre","ell"}, //Greek
+ {"swe","sve"}, //Swedish
+ {"ron","rum"}, //Romanian
+ {"hun",""}, //Hungarian
+ {"cat",""}, //Catalanian
+ {"rus",""}, //Russian
+ {"hrv","scr"}, //Croatian
+ {"est",""}, //Estonian
+ {"dan",""}, //Danish
+ {"cze","ces"}, //Czech
+ {"tur",""} //Turkish
};
const char *gLanguageNames[] = {
"-",
@@ -78,20 +95,21 @@ const char *gLanguageNames[] = {
"suomi", // this is not a typo - it's really lowercase!
"Polski",
"Español",
- "Ellinika",
+ "ÅëëçíéêÜ",
"Svenska",
"Romaneste",
"Magyar",
"Català",
-#if VDRVERSNUM >= 10300
"ÀãááÚØÙ",
-#endif
- // Not in translations!
- "Dansk"
+ "Hrvatski",
+ "Eesti",
+ "Dansk",
+ "Èesky",
+ "Türkçe"
};
int gNumLanguages = sizeof(gLanguages) / sizeof(gLanguages[0]);
-class cPluginTtxtsubs : public cPlugin, public cStatus, public cVDRTtxtsubsHookListener {
+class cPluginTtxtsubs : public cPlugin, public cStatus, public cVDRTtxtsubsHookListener, public cThread {
public:
cPluginTtxtsubs(void);
virtual ~cPluginTtxtsubs();
@@ -102,6 +120,7 @@ public:
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Start(void);
+ virtual void Stop(void);
virtual void Housekeeping(void);
virtual const char *MainMenuEntry(void);
virtual cOsdObject *MainMenuAction(void);
@@ -111,11 +130,7 @@ public:
// -- cStatus
protected:
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
- 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 Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
// virtual void OsdClear(void) { ShowTtxt(); }
// virtual void OsdTitle(const char *Title) { HideTtxt(); }
// virtual void OsdStatusMessage(const char *Message) { HideTtxt(); }
@@ -131,9 +146,12 @@ public:
virtual void PlayerTeletextData(uint8_t *p, int length);
virtual cTtxtSubsRecorderBase *NewTtxtSubsRecorder(cDevice *dev, const cChannel *ch);
+ // -- cThread
+ void Action(void);
+
// -- internal
private:
- void StartTtxtLive(const cDevice *Device, int pid, int page);
+ void StartTtxtLive(const cDevice *Device, tChannelID chnid, int pid, int page);
void StartTtxtPlay(int page);
void StopTtxt(void);
void ShowTtxt(void);
@@ -149,6 +167,12 @@ private:
// ugly hack for now
int mPage;
+ // wait for channel switch
+ sem_t chswitchwait;
+ cMutex getchmutex;
+ int switchChannel;
+ int lastc;
+ const cDevice *switchDevice;
};
class cMenuSetupTtxtsubs : public cMenuSetupPage {
@@ -163,6 +187,10 @@ class cMenuSetupTtxtsubs : public cMenuSetupPage {
int mLangHI[MAXLANGUAGES];
int mSavedFrenchSpecial;
int mDoStore;
+ int mTransparency;
+ int mRed;
+ int mGreen;
+ int mBlue;
cTtxtsubsConf mConf;
};
@@ -178,6 +206,8 @@ cPluginTtxtsubs::cPluginTtxtsubs(void)
memset(mOldLanguage, 0, 4);
strncpy(globals.mLanguages[0][0], "unk", 4);
+ sem_init(&chswitchwait,0,0);
+ lastc=0;
}
cPluginTtxtsubs::~cPluginTtxtsubs()
@@ -201,8 +231,12 @@ bool cPluginTtxtsubs::Start(void)
{
// Start any background activities the plugin shall perform.
- RegisterI18n(Phrases);
+ cThread::Start();
+ TtxtSubsChannelSettings.Load(AddDirectory(ConfigDirectory("ttxtsubs"),"channelsettings.dat"));
+#if defined(APIVERSNUM) && APIVERSNUM < 10507
+ RegisterI18n(Phrases);
+#endif
if(!memcmp(globals.mLanguages[0][0], "unk", 3)) {
// no language found in setup
if(strlen(mOldLanguage)) {
@@ -225,6 +259,7 @@ bool cPluginTtxtsubs::Start(void)
globals.mHearingImpaireds[0][1] = mOldHearingImpaired;
} else {
// get lang from OSD lang
+#if defined(APIVERSNUM) && APIVERSNUM < 10507
int n = Setup.OSDLanguage + 1;
if(n > gNumLanguages) {
strncpy(globals.mLanguages[0][0], "eng", 4);
@@ -234,6 +269,10 @@ bool cPluginTtxtsubs::Start(void)
strncpy(globals.mLanguages[0][1], gLanguages[n][1], 4);
globals.mLanguages[0][1][3] = '\0';
}
+#else
+ strncpy(globals.mLanguages[0][0], Setup.OSDLanguage, 4);
+ globals.mLanguages[0][0][3] = '\0';
+#endif
}
}
@@ -244,6 +283,12 @@ bool cPluginTtxtsubs::Start(void)
return true;
}
+void cPluginTtxtsubs::Stop(void)
+{
+ cThread::Cancel();
+ StopTtxt();
+}
+
void cPluginTtxtsubs::Housekeeping(void)
{
// Perform any cleanup or other regular tasks.
@@ -253,7 +298,7 @@ const char *cPluginTtxtsubs::MainMenuEntry(void)
{
switch(globals.mMainMenuEntry) {
case 1:
- if(globals.mDoDisplay)
+ if(globals.mRealDoDisplay)
return tr("Hide teletext subtitles");
else
return tr("Display teletext subtitles");
@@ -263,7 +308,7 @@ const char *cPluginTtxtsubs::MainMenuEntry(void)
else
return tr("Position Teletext Subtitles for Letterbox");
case 3:
- return tr("Teletext Subtitles");
+ return tr("Page Selection");
default:
return NULL;
}
@@ -277,13 +322,13 @@ cOsdObject *cPluginTtxtsubs::MainMenuAction(void)
switch(globals.mMainMenuEntry) {
case 1:
- globals.mDoDisplay = globals.mDoDisplay ? 0 : 1;
+ globals.mRealDoDisplay = globals.mRealDoDisplay ? 0 : 1;
return NULL;
case 2:
globals.mBottomLB = globals.mBottomLB ? 0 : 1;
return NULL;
case 3:
- return new cMenuSetupTtxtsubs(this, 1);
+ return new cTtxtsubsPageMenu();
default:
return NULL;
}
@@ -298,16 +343,23 @@ cMenuSetupPage *cPluginTtxtsubs::SetupMenu(void)
bool cPluginTtxtsubs::SetupParse(const char *Name, const char *Value)
{
- if(!strcasecmp(Name, "Display")) globals.mDoDisplay = atoi(Value);
+ if(!strcasecmp(Name, "Display")) { globals.mDoDisplay = atoi(Value); globals.mRealDoDisplay=globals.mDoDisplay; }
else if(!strcasecmp(Name, "Record")) globals.mDoRecord = atoi(Value);
+ else if(!strcasecmp(Name, "LiveDelay")) globals.mLiveDelay = atoi(Value);
+ else if(!strcasecmp(Name, "ReplayDelay")) globals.mReplayDelay = atoi(Value);
else if(!strcasecmp(Name, "MainMenuEntry")) globals.mMainMenuEntry = atoi(Value);
else if(!strcasecmp(Name, "TextPos")) globals.mTextPos = atoi(Value);
else if(!strcasecmp(Name, "BottomLB")) globals.mBottomLB = atoi(Value);
else if(!strcasecmp(Name, "BottomAdj")) globals.mBottomAdj = atoi(Value);
else if(!strcasecmp(Name, "FrenchSpecial")) globals.mFrenchSpecial = atoi(Value);
else if(!strcasecmp(Name, "LineSpacing")) globals.mLineSpacing = atoi(Value);
+ else if(!strcasecmp(Name, "DvbSources")) globals.mDvbSources = atoi(Value);
+#if defined(APIVERSNUM) && APIVERSNUM >= 10503
+ else if(!strcasecmp(Name, "FontSize")) globals.mFontSize = atoi(Value);
+#endif
else if(!strcasecmp(Name, "FgColor")) globals.mFgColor = atoi(Value);
else if(!strcasecmp(Name, "BgColor")) globals.mBgColor = atoi(Value);
+ else if(!strcasecmp(Name, "CustomColor")) globals.mCustomColor = atoi(Value);
else if(!strcasecmp(Name, "Languages")) parseLanguages(Value);
else if(!strcasecmp(Name, "HearingImpaireds")) parseHIs(Value);
// Handle old settings
@@ -319,51 +371,113 @@ bool cPluginTtxtsubs::SetupParse(const char *Name, const char *Value)
return true;
}
+void cPluginTtxtsubs::Action(void)
+{
+ while(true) {
+ sem_wait(&chswitchwait);
+ int cn;
+ const cDevice *dev;
+ getchmutex.Lock();
+ cn=switchChannel;
+ dev=switchDevice;
+ getchmutex.Unlock();
+ if (cn!=lastc) {
+ StopTtxt();
+ lastc=0;
+ cChannel *c = Channels.GetByNumber(cn);
+ if(c) {
+ //int manual_page = TtxtSubsChannelSettings.Page(c->GetChannelID());
+ //if (manual_page>0) {
+ // printf("ttxtsubs: manual page %03x selected\n", manual_page);
+ // if (c->Tpid()) StartTtxtLive(dev, c->GetChannelID(), c->Tpid(), manual_page);
+ //} else if(manual_page==0) {
+ struct ttxtinfo info;
+ int pid, page;
+ char lang[4] = "";
+ bool geterror=true;
+ if((globals.dvbSources() == 0) || ((globals.dvbSources() == 1) && c->IsSat()) || ((globals.dvbSources() == 2) && c->IsTerr()) || ((globals.dvbSources() == 3) && c->IsCable()))
+ {
+ int tries=0; //sometimes it doesn't find subtitles even if they're there
+ //the problem is that while the dish is moving it's picking the signal
+ //from a different satellite, so what really should be done is to
+ //check if the dish is positioned
+ while(tries<=2) {
+ while(geterror=GetTtxtInfo(dev->ActualDevice()->CardIndex(), c, &info)) {
+ esyslog("ttxtsubs: Error: GetTtxtInfo failed!");
+ cCondWait::SleepMs(1000);
+ getchmutex.Lock();
+ bool changed=(cn!=switchChannel);
+ getchmutex.Unlock();
+ if (changed) {
+ esyslog("ttxtsubs: Channel changed while looking for teletext info");
+ break;
+ }
+ }
+ if (!geterror) {
+ if(FindSubs(&info, &pid, &page, lang)) {
+ //dprint("CHANNELSWITCH, pid: %d page: %x\n", pid, page);
+ mPage = page; // XXX remember this for playback (temporary hack)!
+ for(int i = 0; i < gNumLanguages; i++) {
+ if(!memcmp(lang, gLanguages[i][0], 3) ||
+ !memcmp(lang, gLanguages[i][1], 3)) {
+ globals.mI18nLanguage = i - 1;
+ }
+ }
+#if defined(APIVERSNUM) && APIVERSNUM < 10507
+ if(globals.mI18nLanguage < 0 || globals.mI18nLanguage >= I18nNumLanguages)
+#else
+ if(globals.mI18nLanguage < 0 || globals.mI18nLanguage >= I18nLanguages()->Size())
+#endif
+ globals.mI18nLanguage = 0; // default to iso8859-1 if no predefined charset
+ StartTtxtLive(dev, c->GetChannelID(), pid, page);
+ FreeTtxtInfoData(&info);
+ break;
+ } else { //!FindSubs
+ FreeTtxtInfoData(&info);
+ tries++;
+ }
+ } else break; //if(!geterror)..
+ } //while(tries<=2)
+ }
+ lastc=cn;
+ //}
+ }
+ }
+ }
+}
+
void cPluginTtxtsubs::ChannelSwitch(const cDevice *Device, int ChannelNumber)
{
#if TIMEMEASURE
struct timeval tv, tv2;
gettimeofday(&tv, NULL);
#endif
- dprint("cPluginTtxtsubs::ChannelSwitch(devicenr: %d, channelnr: %d) - mDispl: %x\n",
- Device->DeviceNumber(), ChannelNumber, mDispl); // XXX
+ //dprint("cPluginTtxtsubs::ChannelSwitch(devicenr: %d, channelnr: %d) - mDispl: %x\n", Device->DeviceNumber(), ChannelNumber, mDispl); // XXX
- if(Device->IsPrimaryDevice()) {
+ if(Device->IsPrimaryDevice() && !Device->Replaying()) {
if(ChannelNumber) {
- cChannel *c = Channels.GetByNumber(ChannelNumber);
- if(c) {
- struct ttxtinfo info;
- int pid, page;
-
- if(GetTtxtInfo(Device->ActualDevice()->CardIndex(), ChannelNumber, c->Sid(), c->Vpid(), &info)) {
- fprintf(stderr, "ttxtsubs: Error: GetTtxtInfo failed!\n");
- } else {
- if(FindSubs(&info, &pid, &page)) {
- //fprintf(stderr, "CHANNELSWITCH, pid: %d page: %x\n", pid, page);
- mPage = page; // XXX remember this for playback (temporary hack)!
- StartTtxtLive(Device, pid, page);
- }
- FreeTtxtInfoData(&info);
- }
- }
- } else
- StopTtxt();
+ getchmutex.Lock();
+ switchChannel=ChannelNumber;
+ switchDevice=Device;
+ getchmutex.Unlock();
+ sem_post(&chswitchwait);
+ }
}
#if TIMEMEASURE
gettimeofday(&tv2, NULL);
TIMEVALSIMPL(tv, tv2);
// tv2.tv_sec - tv.tv_sec + 1000000 * (tv2.tv_usec - tv.tv_usec);
- fprintf(stderr, "ttxtsubs: Channel switch time: %d.%06d s\n",
+ isyslog("ttxtsubs: Channel switch time: %d.%06d s",
tv2.tv_sec - tv.tv_sec, tv2.tv_usec - tv.tv_usec);
#endif
}
-void cPluginTtxtsubs::Replaying(const cControl *Control, const char *Name)
+void cPluginTtxtsubs::Replaying(const cControl *Control, const char *Name, const char *FileName, bool On)
{
- dprint("cPluginTtxtsubs::Replaying\n"); // XXX
-
+ //dprint("cPluginTtxtsubs::Replaying\n"); // XXX
StopTtxt();
- StartTtxtPlay(mPage);
+ if(On)
+ StartTtxtPlay(mPage);
// XXX this page number is just a fallback for old recordings which
// don't have a index page
}
@@ -373,7 +487,7 @@ void cPluginTtxtsubs::PlayerTeletextData(uint8_t *p, int length)
cTtxtSubsPlayer *r = dynamic_cast<cTtxtSubsPlayer *>(mDispl);
if(!r) {
- fprintf(stderr, "ttxtsubs: ERROR: not a cTtxtSubsPlayer!\n");
+ esyslog("ttxtsubs: ERROR: not a cTtxtSubsPlayer!");
return;
}
@@ -391,38 +505,38 @@ cTtxtSubsRecorderBase *cPluginTtxtsubs::NewTtxtSubsRecorder(cDevice *dev, const
// -- internal
-void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page)
+void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, tChannelID chnid, int pid, int page)
{
- dprint("cPluginTtxtsubs::StartTtxtLive(devicenr: %d, pid: %d, page: %03x)\n",
- Device->DeviceNumber(), pid, page); // XXX
+ //dprint("cPluginTtxtsubs::StartTtxtLive(devicenr: %d, pid: %d, page: %03x)\n",
+ // Device->DeviceNumber(), pid, page); // XXX
if(!mDispl) {
cTtxtSubsLiveReceiver *r;
//dprint("teletext subtitles started on pid %d\n", pid);
- mDispl = r = new cTtxtSubsLiveReceiver(pid, page); // takes 0.01-0.015 s
+ mDispl = r = new cTtxtSubsLiveReceiver(chnid, pid, page); // takes 0.01-0.015 s
if(!cDevice::PrimaryDevice()->ActualDevice()->AttachReceiver(r))
// takes 0.02-0.04 s on a full featured card
- fprintf(stderr, "ttxtsubs: Error: AttachReceiver failed!\n"); //
+ esyslog("ttxtsubs: Error: AttachReceiver failed!");
ShowTtxt();
} else
- fprintf(stderr, "ttxtsubs: Error: StartTtxtLive called when already started!\n");
+ esyslog("ttxtsubs: Error: StartTtxtLive called when already started!");
}
void cPluginTtxtsubs::StartTtxtPlay(int backup_page)
{
- dprint("cPluginTtxtsubs::StartTtxtPlay\n");
+ //dprint("cPluginTtxtsubs::StartTtxtPlay\n");
if(!mDispl) {
- dprint("ttxtsubs: teletext subtitles replayer started with initial page %03x\n", backup_page);
+ isyslog("ttxtsubs: teletext subtitles replayer started with initial page %03x", backup_page);
mDispl = new cTtxtSubsPlayer(backup_page);
ShowTtxt();
} else
- fprintf(stderr, "ttxtsubs: Error: StartTtxtPlay called when already started!\n");
+ esyslog("ttxtsubs: Error: StartTtxtPlay called when already started!");
}
void cPluginTtxtsubs::StopTtxt(void)
{
- dprint("cPluginTtxtsubs::StopTtxt\n");
+ //dprint("cPluginTtxtsubs::StopTtxt\n");
if(mDispl) {
cTtxtSubsDisplayer *d = mDispl;
@@ -434,7 +548,7 @@ void cPluginTtxtsubs::StopTtxt(void)
void cPluginTtxtsubs::ShowTtxt(void)
{
- if(globals.mDoDisplay)
+ if(globals.mRealDoDisplay)
if(mDispl)
mDispl->ShowDisplay();
}
@@ -504,12 +618,14 @@ cMenuSetupTtxtsubsLanguages::cMenuSetupTtxtsubsLanguages(cPluginTtxtsubs *ttxtsu
void cMenuSetupTtxtsubsLanguages::Store(void)
{
- fprintf(stderr, "cMenuSetupTtxtsubsLanguages::Store\n");
+ //dprint("cMenuSetupTtxtsubsLanguages::Store\n");
}
-const char * mainMenuAlts[4] = {NULL, NULL, NULL, NULL};
+const char * mainMenuAlts[5] = {NULL, NULL, NULL, NULL, NULL};
const char * textPosAlts[4];
+const char * dvbSources[5];
const char * textColors[12];
+const char * const colorValues[17] = {"#00", "#11", "#22", "#33", "#44", "#55", "#66", "#77", "#88", "#99", "#AA", "#BB", "#CC", "#DD", "#EE", "#FF", NULL};
cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
:
@@ -517,19 +633,27 @@ cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
mDoStore(doStore),
mConf(globals)
{
+ char *buf = NULL;
//static char *mainMenuAlts[] = {"off", "Display on/off", "4:3/Letterbox", "This menu"};
// can't get it to store changes in file
if(mainMenuAlts[0] == NULL) {
- mainMenuAlts[0] = tr("off");
+ mainMenuAlts[0] = trVDR("off");
mainMenuAlts[1] = tr("Display on/off");
mainMenuAlts[2] = tr("4:3/Letterbox");
- mainMenuAlts[3] = NULL;
+ mainMenuAlts[3] = tr("Page Mode");
+ mainMenuAlts[4] = NULL;
textPosAlts[0] = tr("Left");
textPosAlts[1] = tr("Center");
textPosAlts[2] = tr("Right");
textPosAlts[3] = NULL;
+ dvbSources[0] = tr("All");
+ dvbSources[1] = tr("Only DVB-S");
+ dvbSources[2] = tr("Only DVB-T");
+ dvbSources[3] = tr("Only DVB-C");
+ dvbSources[4] = NULL;
+
textColors[0] = tr("Black");
textColors[1] = tr("White");
textColors[2] = tr("Red");
@@ -538,14 +662,16 @@ cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
textColors[5] = tr("Magenta");
textColors[6] = tr("Blue");
textColors[7] = tr("Cyan");
- textColors[8] = tr("Grey");
+ textColors[8] = tr("Custom");
textColors[9] = tr("Transparent");
- textColors[10] = tr("Background");
+ textColors[10] = tr("Grey");
textColors[11] = NULL;
}
const int numTextPosAlts = sizeof(textPosAlts) / sizeof(textPosAlts[0]) - 1;
const int numMainMenuAlts = sizeof(mainMenuAlts) / sizeof(mainMenuAlts[0]) - 1;
+ const int numDvbSources = sizeof(dvbSources) / sizeof(dvbSources[0]) - 1;
const int numTextColors = sizeof(textColors) / sizeof(textColors[0]) - 1;
+ const int numColorValues = sizeof(colorValues) / sizeof(colorValues[0]) - 1;
mSavedFrenchSpecial = mConf.mFrenchSpecial;
@@ -562,8 +688,10 @@ cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
}
}
- Add(new cMenuEditBoolItem(tr("Display Subtitles"), &mConf.mDoDisplay, tr("no"), tr("yes")));
- Add(new cMenuEditBoolItem(tr("Record Subtitles"), &mConf.mDoRecord, tr("no"), tr("yes")));
+ Add(new cMenuEditBoolItem(tr("Display Subtitles"), &mConf.mDoDisplay));
+ Add(new cMenuEditBoolItem(tr("Record Subtitles"), &mConf.mDoRecord));
+ Add(new cMenuEditIntItem(tr("Live Delay"), &mConf.mLiveDelay, 0, 5000));
+ Add(new cMenuEditIntItem(tr("Replay Delay"), &mConf.mReplayDelay, 0, 5000));
if(mConf.mMainMenuEntry < 0 || mConf.mMainMenuEntry >= numMainMenuAlts)
mConf.mMainMenuEntry = 0; // menu item segfaults if out of range
Add(new cMenuEditStraItem(tr("Main Menu Alternative"), &mConf.mMainMenuEntry,
@@ -578,6 +706,15 @@ cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
&mConf.mBottomAdj, -100, 45));
Add(new cMenuEditIntItem( tr("Line Spacing Adjust"),
&mConf.mLineSpacing, -25, 25));
+ Add(new cMenuEditBoolItem(tr("Workaround for some French chns"),
+ &mConf.mFrenchSpecial));
+ if(mConf.mDvbSources < 0 || mConf.mDvbSources >= numDvbSources)
+ mConf.mDvbSources = 0; // menu item segfaults if out of range
+ Add(new cMenuEditStraItem(tr("DVB Source Selection"),
+ &mConf.mDvbSources, 4, dvbSources));
+#if defined(APIVERSNUM) && APIVERSNUM >= 10503
+ Add(new cMenuEditIntItem(tr("Font Size (pixel)"), &mConf.mFontSize, 10, MAXFONTSIZE));
+#endif
if(mConf.mFgColor < 0 || mConf.mFgColor >= numTextColors)
mConf.mFgColor = 1; // menu item segfaults if out of range
Add(new cMenuEditStraItem(tr("Text Color"), &mConf.mFgColor,
@@ -586,19 +723,32 @@ cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
mConf.mBgColor = 0; // menu item segfaults if out of range
Add(new cMenuEditStraItem(tr("Background Color"), &mConf.mBgColor,
numTextColors, textColors));
- Add(new cMenuEditBoolItem(tr("Workaround for some French chns"),
- &mConf.mFrenchSpecial, tr("no"), tr("yes")));
+
+ // the color code is borrowed from AIO patches
+ mBlue = (mConf.mCustomColor & 0x0000000F);
+ if (mBlue < 0 || mBlue >= numColorValues) mBlue = 0;
+ mGreen = (mConf.mCustomColor & 0x00000F00) >> 8;
+ if (mGreen < 0 || mGreen >= numColorValues) mGreen = 0;
+ mRed = (mConf.mCustomColor & 0x000F0000) >> 16;
+ if (mRed < 0 || mRed >= numColorValues) mRed = 0;
+ mTransparency = (mConf.mCustomColor & 0x0F000000) >> 24;
+ if (mTransparency < 0 || mTransparency >= numColorValues) mTransparency = 0;
+ asprintf(&buf, "%s: --------------------------------------------", tr("Custom Color"));
+ cOsdItem *item = new cOsdItem(buf);
+ item->SetSelectable(false);
+ free(buf);
+ Add(item);
+ Add(new cMenuEditStraItem(tr("Red Value"), &mRed, numColorValues, colorValues));
+ Add(new cMenuEditStraItem(tr("Green Value"), &mGreen, numColorValues, colorValues));
+ Add(new cMenuEditStraItem(tr("Blue Value"), &mBlue, numColorValues, colorValues));
+ Add(new cMenuEditStraItem(tr("Transparency Value"), &mTransparency, numColorValues, colorValues));
for(int n = 0; n < MAXLANGUAGES; n++) {
char str[100];
- char *allowedc = "abcdefghijklmnopqrstuvwxyz";
+ const char *allowedc = "abcdefghijklmnopqrstuvwxyz";
cOsdItem *item = new cOsdItem("--------------------------------------------------------");
-#if defined(ELCHIAIOVERSION)
- item->SetColor(clrScrolLine);
-#else
- item->SetColor(clrCyan);
-#endif
+ item->SetSelectable(false);
Add(item);
sprintf(str, "%s %d", tr("Language"), n + 1);
@@ -610,8 +760,7 @@ cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
}
sprintf(str, "%s %d %s", tr("Language"), n + 1, tr("Hearing Impaired"));
- Add(new cMenuEditBoolItem(str, &(mConf.mHearingImpaireds[n][0]),
- tr("no"), tr("yes")));
+ Add(new cMenuEditBoolItem(str, &(mConf.mHearingImpaireds[n][0])));
}
#ifdef TEST
@@ -621,8 +770,6 @@ cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
cMenuSetupTtxtsubs::~cMenuSetupTtxtsubs(void)
{
- if(mSavedFrenchSpecial != mConf.mFrenchSpecial)
- ClearSICache();
if(mDoStore) {
Store();
@@ -645,14 +792,25 @@ void cMenuSetupTtxtsubs::Store(void)
SetupStore("Display", mConf.mDoDisplay);
SetupStore("Record", mConf.mDoRecord);
+ SetupStore("LiveDelay", mConf.mLiveDelay);
+ SetupStore("ReplayDelay", mConf.mReplayDelay);
SetupStore("TextPos", mConf.mTextPos);
SetupStore("BottomLB", mConf.mBottomLB);
SetupStore("BottomAdj", mConf.mBottomAdj);
SetupStore("FrenchSpecial", mConf.mFrenchSpecial);
SetupStore("MainMenuEntry", mConf.mMainMenuEntry);
SetupStore("LineSpacing", mConf.mLineSpacing);
+ SetupStore("DvbSources", mConf.mDvbSources);
+#if defined(APIVERSNUM) && APIVERSNUM >= 10503
+ SetupStore("FontSize", mConf.mFontSize);
+#endif
SetupStore("FgColor", mConf.mFgColor);
SetupStore("BgColor", mConf.mBgColor);
+ mConf.mCustomColor = (mBlue ) | (mBlue << 4) |
+ (mGreen << 8) | (mGreen << 12) |
+ (mRed << 16) | (mRed << 20) |
+ (mTransparency << 24) | (mTransparency << 28);
+ SetupStore("CustomColor", mConf.mCustomColor);
char lstr[MAXLANGUAGES*2*4 + 1];
char histr[MAXLANGUAGES*2 + 1];