diff options
Diffstat (limited to 'ttxtsubs.c')
| -rw-r--r-- | ttxtsubs.c | 360 |
1 files changed, 259 insertions, 101 deletions
@@ -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]; |
