summaryrefslogtreecommitdiff
path: root/ttxtsubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ttxtsubs.c')
-rw-r--r--ttxtsubs.c477
1 files changed, 371 insertions, 106 deletions
diff --git a/ttxtsubs.c b/ttxtsubs.c
index ae1ca63..02f09a9 100644
--- a/ttxtsubs.c
+++ b/ttxtsubs.c
@@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: ttxtsubs.c,v 1.20 2003/07/19 02:03:15 ragge Exp ragge $
+ * $Id: ttxtsubs.c,v 1.22 2004/03/01 04:36:32 ragge Exp $
*/
#include <vdr/plugin.h>
@@ -12,39 +12,63 @@
#include <vdr/menuitems.h>
#include <vdr/config.h>
+#include "ttxtsubsglobals.h"
#include "ttxtsubsdisplayer.h"
#include "ttxtsubsrecorder.h"
#include "utils.h"
#include "siinfo.h"
#include "ttxtsubs.h"
-static const char *VERSION = "0.0.4b";
+static const char *VERSION = "0.0.5pre1";
static const char *DESCRIPTION = "Teletext subtitles";
-//static const char *MAINMENUENTRY = "Ttxtsubs";
+
+cTtxtsubsConf globals;
// ISO 639-2 language codes in VDR order
-// XXX should be replaced by something that allows for other languages and for real language names!
+// 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[] =
-{ "eng", //English
- "deu", //Deutsch
- "slv", //Slovenian
- "ita", //Italian
- "dut", //"nld"? Dutch
- "por", //Portuguese
- "fre", //"fra"? French
- "nor", //Norwegian
- "fin", //Finnish
- "pol", //Polish
- "spa", //Spanish
- "gre", //Greek
- "swe", //"sve? Swedish
- "rom", //Romanian
- "hun", //Hungarian
- "cat", //Catalanian
+char *gLanguages[][2] = {
+ "","", //None
+ "eng","", //English
+ "deu","ger", //Deutsch
+ "slv","", //Slovenian
+ "ita","", //Italian
+ "dut","nld", //Dutch
+ "por","", //Portuguese
+ "fre","fra", //French
+ "nor","", //Norwegian
+ "fin","", //Finnish
+ "pol","", //Polish
+ "spa","esl", //Spanish
+ "gre","ell", //Greek
+ "swe","sve", //Swedish
+ "ron","rum", //Romanian
+ "hun","", //Hungarian
+ "cat","", //Catalanian
// Not in translations!
- "dan" //Danish
- };
+ "dan","" //Danish
+};
+const char *gLanguageNames[] = {
+ "-",
+ "English",
+ "Deutsch",
+ "Slovenski",
+ "Italiano",
+ "Nederlands",
+ "Português",
+ "Français",
+ "Norsk",
+ "suomi", // this is not a typo - it's really lowercase!
+ "Polski",
+ "Español",
+ "Ellinika",
+ "Svenska",
+ "Romaneste",
+ "Magyar",
+ "Català",
+ "Dansk"
+};
int gNumLanguages = sizeof(gLanguages) / sizeof(gLanguages[0]);
class cPluginTtxtsubs : public cPlugin, public cStatus, public cVDRTtxtsubsHookListener {
@@ -59,20 +83,11 @@ public:
virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Start(void);
virtual void Housekeeping(void);
- //virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
+ virtual const char *MainMenuEntry(void);
virtual cOsdObject *MainMenuAction(void);
virtual cMenuSetupPage *SetupMenu(void);
virtual bool SetupParse(const char *Name, const char *Value);
- // -- Setup stuff
- virtual char *Language(void) { return mLanguage; };
- virtual int HearingImpaired(void) { return mHearingImpaired; };
- virtual int Record(void) { return mRecord; };
-
- virtual void SetLanguage(char *lang) { strncpy(mLanguage, lang, 4); mLanguage[3] = '\0'; };
- virtual void SetHearingImpaired(int hi) { mHearingImpaired = hi; };
- virtual void SetRecord(int record) { mRecord = record; };
-
// -- cStatus
protected:
virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
@@ -103,15 +118,14 @@ public:
void StopTtxt(void);
void ShowTtxt(void);
void HideTtxt(void);
+ void parseLanguages(const char *val);
+ void parseHIs(const char *val);
private:
- // Add any member variables or functions you may need here.
- cTtxtSubsDisplayer *mRec;
+ cTtxtSubsDisplayer *mDispl;
- // Setup items
- char mLanguage[4];
- int mHearingImpaired;
- int mRecord;
+ char mOldLanguage[4]; // language chosen from previous version
+ int mOldHearingImpaired; // HI setting chosen from previous version
// ugly hack for now
int mPage;
@@ -119,30 +133,31 @@ private:
class cMenuSetupTtxtsubs : public cMenuSetupPage {
public:
- cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs);
+ cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore = 0);
+ ~cMenuSetupTtxtsubs(void);
protected:
virtual void Store(void);
private:
cPluginTtxtsubs *mTtxtsubs;
- char mLanguage[4];
- int mLanguageNo;
- int mHearingImpaired;
- int mRecord;
+ int mLanguageNo[MAXLANGUAGES];
+ int mLangHI[MAXLANGUAGES];
+ int mSavedFrenchSpecial;
+ int mDoStore;
+ cTtxtsubsConf mConf;
};
cPluginTtxtsubs::cPluginTtxtsubs(void)
:
- mRec(NULL),
- mHearingImpaired(0),
- mRecord(1),
- mPage(0x199)
+ mDispl(NULL),
+ mOldHearingImpaired(0)
{
// Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
-
- strncpy(mLanguage, "unk", 4);
+
+ memset(mOldLanguage, 0, 4);
+ strncpy(globals.mLanguages[0][0], "unk", 4);
}
cPluginTtxtsubs::~cPluginTtxtsubs()
@@ -166,13 +181,37 @@ bool cPluginTtxtsubs::Start(void)
{
// Start any background activities the plugin shall perform.
- if(!memcmp(mLanguage, "unk", 3)) {
- int n = Setup.OSDLanguage;
- if(n > gNumLanguages) {
- strncpy(mLanguage, "eng", 4);
+ if(!memcmp(globals.mLanguages[0][0], "unk", 3)) {
+ // no language found in setup
+ if(strlen(mOldLanguage)) {
+ // use old setup lang, first try to find it amongst known languages
+ for(int i = 0; i < gNumLanguages; i++) {
+ if(!memcmp(mOldLanguage, gLanguages[i][0], 3) ||
+ !memcmp(mOldLanguage, gLanguages[i][1], 3)) {
+ strncpy(globals.mLanguages[0][0], gLanguages[i][0], 4);
+ globals.mLanguages[0][0][3] = '\0';
+ strncpy(globals.mLanguages[0][1], gLanguages[i][1], 4);
+ globals.mLanguages[0][1][3] = '\0';
+ }
+ }
+ if(!memcmp(globals.mLanguages[0][0], "unk", 3)) {
+ // not found there, just copy it
+ memcpy(globals.mLanguages[0][0], mOldLanguage, 3);
+ globals.mLanguages[0][0][3] = '\0';
+ }
+ globals.mHearingImpaireds[0][0] = mOldHearingImpaired;
+ globals.mHearingImpaireds[0][1] = mOldHearingImpaired;
} else {
- strncpy(mLanguage, gLanguages[n], 4);
- mLanguage[3] = '\0';
+ // get lang from OSD lang
+ int n = Setup.OSDLanguage + 1;
+ if(n > gNumLanguages) {
+ strncpy(globals.mLanguages[0][0], "eng", 4);
+ } else {
+ strncpy(globals.mLanguages[0][0], gLanguages[n][0], 4);
+ globals.mLanguages[0][0][3] = '\0';
+ strncpy(globals.mLanguages[0][1], gLanguages[n][1], 4);
+ globals.mLanguages[0][1][3] = '\0';
+ }
}
}
@@ -188,9 +227,45 @@ void cPluginTtxtsubs::Housekeeping(void)
// Perform any cleanup or other regular tasks.
}
+const char *cPluginTtxtsubs::MainMenuEntry(void)
+{
+ switch(globals.mMainMenuEntry) {
+ case 1:
+ if(globals.mDoDisplay)
+ return tr("Hide teletext subtitles");
+ else
+ return tr("Display teletext subtitles");
+ case 2:
+ if(globals.mBottomLB)
+ return tr("Position Teletext Subtitles for 4:3/Anamorph");
+ else
+ return tr("Position Teletext Subtitles for Letterbox");
+ case 3:
+ return tr("Teletext Subtitles");
+ default:
+ return NULL;
+ }
+
+ return NULL;
+}
+
cOsdObject *cPluginTtxtsubs::MainMenuAction(void)
{
// Perform the action when selected from the main VDR menu.
+
+ switch(globals.mMainMenuEntry) {
+ case 1:
+ globals.mDoDisplay = globals.mDoDisplay ? 0 : 1;
+ return NULL;
+ case 2:
+ globals.mBottomLB = globals.mBottomLB ? 0 : 1;
+ return NULL;
+ case 3:
+ return new cMenuSetupTtxtsubs(this, 1);
+ default:
+ return NULL;
+ }
+
return NULL;
}
@@ -201,9 +276,19 @@ cMenuSetupPage *cPluginTtxtsubs::SetupMenu(void)
bool cPluginTtxtsubs::SetupParse(const char *Name, const char *Value)
{
- if(!strcasecmp(Name, "Language")) { strncpy(mLanguage, Value, 4); mLanguage[3] = '\0'; }
- else if(!strcasecmp(Name, "HearingImpaired")) mHearingImpaired = atoi(Value);
- else if(!strcasecmp(Name, "Record")) mRecord = atoi(Value);
+ if(!strcasecmp(Name, "Display")) globals.mDoDisplay = atoi(Value);
+ else if(!strcasecmp(Name, "Record")) globals.mDoRecord = 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, "Languages")) parseLanguages(Value);
+ else if(!strcasecmp(Name, "HearingImpaireds")) parseHIs(Value);
+ // Handle old settings
+ else if(!strcasecmp(Name, "Language")) {
+ strncpy(mOldLanguage, Value, 4); mOldLanguage[3] = '\0'; }
+ else if(!strcasecmp(Name, "HearingImpaired")) mOldHearingImpaired = atoi(Value);
else
return false;
return true;
@@ -211,6 +296,9 @@ bool cPluginTtxtsubs::SetupParse(const char *Name, const char *Value)
void cPluginTtxtsubs::ChannelSwitch(const cDevice *Device, int ChannelNumber)
{
+ dprint("cPluginTtxtsubs::ChannelSwitch(devicenr: %d, channelnr: %d) - mDispl: %x\n",
+ Device->DeviceNumber(), ChannelNumber, mDispl); // XXX
+
if(Device->IsPrimaryDevice()) {
if(ChannelNumber) {
cChannel *c = Channels.GetByNumber(ChannelNumber);
@@ -221,7 +309,7 @@ void cPluginTtxtsubs::ChannelSwitch(const cDevice *Device, int ChannelNumber)
if(GetTtxtInfo(Device->ActualDevice()->CardIndex(), ChannelNumber, c->Sid(), c->Vpid(), &info)) {
fprintf(stderr, "ttxtsubs: Error: GetTtxtInfo failed!\n");
} else {
- if(FindSubs(&info, mLanguage, mHearingImpaired, &pid, &page)) {
+ 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);
@@ -236,6 +324,8 @@ void cPluginTtxtsubs::ChannelSwitch(const cDevice *Device, int ChannelNumber)
void cPluginTtxtsubs::Replaying(const cControl *Control, const char *Name)
{
+ dprint("cPluginTtxtsubs::Replaying\n"); // XXX
+
StopTtxt();
StartTtxtPlay(mPage);
// XXX this page number is just a fallback for old recordings which
@@ -244,7 +334,7 @@ void cPluginTtxtsubs::Replaying(const cControl *Control, const char *Name)
void cPluginTtxtsubs::PlayerTeletextData(uint8_t *p, int length)
{
- cTtxtSubsPlayer *r = dynamic_cast<cTtxtSubsPlayer *>(mRec);
+ cTtxtSubsPlayer *r = dynamic_cast<cTtxtSubsPlayer *>(mDispl);
if(!r) {
fprintf(stderr, "ttxtsubs: ERROR: not a cTtxtSubsPlayer!\n");
@@ -256,8 +346,8 @@ void cPluginTtxtsubs::PlayerTeletextData(uint8_t *p, int length)
cTtxtSubsRecorderBase *cPluginTtxtsubs::NewTtxtSubsRecorder(cDevice *dev, const cChannel *ch)
{
- if(mRecord)
- return new cTtxtSubsRecorder(dev, ch, mLanguage, mHearingImpaired);
+ if(globals.mDoRecord)
+ return new cTtxtSubsRecorder(dev, ch);
else
return NULL;
}
@@ -267,18 +357,16 @@ cTtxtSubsRecorderBase *cPluginTtxtsubs::NewTtxtSubsRecorder(cDevice *dev, const
void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page)
{
- //dprint("cPluginTtxtsubs::StartTtxtLive\n");
+ dprint("cPluginTtxtsubs::StartTtxtLive(devicenr: %d, pid: %d, page: %03x)\n",
+ Device->DeviceNumber(), pid, page); // XXX
-#if 0
- return; // XXX TEST - No live subs
-#endif
-
- if(!mRec) {
+ if(!mDispl) {
cTtxtSubsLiveReceiver *r;
//dprint("teletext subtitles started on pid %d\n", pid);
- mRec = r = new cTtxtSubsLiveReceiver(pid, page);
+ mDispl = r = new cTtxtSubsLiveReceiver(pid, page);
if(!cDevice::PrimaryDevice()->ActualDevice()->AttachReceiver(r))
fprintf(stderr, "ttxtsubs: Error: AttachReceiver failed!\n"); //
+ ShowTtxt();
} else
fprintf(stderr, "ttxtsubs: Error: StartTtxtLive called when already started!\n");
}
@@ -287,9 +375,10 @@ void cPluginTtxtsubs::StartTtxtPlay(int backup_page)
{
dprint("cPluginTtxtsubs::StartTtxtPlay\n");
- if(!mRec) {
+ if(!mDispl) {
dprint("ttxtsubs: teletext subtitles replayer started with initial page %03x\n", backup_page);
- mRec = new cTtxtSubsPlayer(mLanguage, mHearingImpaired, backup_page);
+ mDispl = new cTtxtSubsPlayer(backup_page);
+ ShowTtxt();
} else
fprintf(stderr, "ttxtsubs: Error: StartTtxtPlay called when already started!\n");
}
@@ -298,68 +387,244 @@ void cPluginTtxtsubs::StopTtxt(void)
{
dprint("cPluginTtxtsubs::StopTtxt\n");
- if(mRec) {
+ if(mDispl) {
+ cTtxtSubsDisplayer *d = mDispl;
HideTtxt();
- delete mRec;
- mRec = NULL;
+ mDispl = NULL;
+ delete d;
}
}
void cPluginTtxtsubs::ShowTtxt(void)
{
- if(mRec)
- mRec->ShowDisplay();
+ if(globals.mDoDisplay)
+ if(mDispl)
+ mDispl->ShowDisplay();
}
void cPluginTtxtsubs::HideTtxt(void)
{
- if(mRec)
- mRec->HideDisplay();
+ if(mDispl)
+ mDispl->HideDisplay();
+}
+
+void cPluginTtxtsubs::parseLanguages(const char *val) {
+ size_t i;
+ const char *p = val;
+ const char *p2;
+ size_t len;
+
+ for(i = 0; i < (MAXLANGUAGES*2); i++) {
+ if(*p == '\0')
+ break; // end of string
+
+ p2 = strchr(p, ','); // find end of entry
+ if(p2) {
+ len = p2 - p;
+ } else { // no more , found
+ len = strlen(p);
+ }
+
+ if(len) {
+ size_t trlen = len;
+ if(trlen > 3)
+ trlen = 3;
+ memcpy(globals.mLanguages[i/2][i%2], p, trlen);
+ globals.mLanguages[i/2][i%2][trlen] = '\0';
+ }
+
+ p += len + 1;
+ }
+}
+
+void cPluginTtxtsubs::parseHIs(const char *val)
+{
+ size_t i;
+
+ for(i = 0; i < (MAXLANGUAGES*2); i++) {
+ if(val[i] == '\0')
+ break;
+ globals.mHearingImpaireds[i/2][i%2] = val[i] != '0';
+ }
}
// ----- cMenuSetupTtxtsubs -----
-cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs)
+//#define TEST
+class cMenuSetupTtxtsubsLanguages : public cMenuSetupPage {
+ public:
+ cMenuSetupTtxtsubsLanguages(cPluginTtxtsubs *ttxtsubs);
+ protected:
+ virtual void Store(void);
+ private:
+ cPluginTtxtsubs *mTtxtsubs;
+};
+
+cMenuSetupTtxtsubsLanguages::cMenuSetupTtxtsubsLanguages(cPluginTtxtsubs *ttxtsubs)
+ :
+ mTtxtsubs(ttxtsubs)
+{}
+
+void cMenuSetupTtxtsubsLanguages::Store(void)
+{
+ fprintf(stderr, "cMenuSetupTtxtsubsLanguages::Store\n");
+}
+
+cMenuSetupTtxtsubs::cMenuSetupTtxtsubs(cPluginTtxtsubs *ttxtsubs, int doStore)
:
mTtxtsubs(ttxtsubs),
- mLanguageNo(-1),
- mHearingImpaired(mTtxtsubs->HearingImpaired()),
- mRecord(mTtxtsubs->Record())
+ mDoStore(doStore),
+ mConf(globals)
{
- memcpy(mLanguage, ttxtsubs->Language(), 3);
- mLanguage[3] = '\0';
+ //static char *mainMenuAlts[] = {"off", "Display on/off", "4:3/Letterbox", "This menu"};
+ // can't get it to store changes in file
+ static char *mainMenuAlts[] = {"off", "Display on/off", "4:3/Letterbox"};
+ static int numMainMenuAlts = sizeof(mainMenuAlts) / sizeof(mainMenuAlts[0]);
+ static char *textPosAlts[] = {"Left", "Center", "Right"};
+ static int numTextPosAlts = sizeof(textPosAlts) / sizeof(textPosAlts[0]);
+
+ mSavedFrenchSpecial = mConf.mFrenchSpecial;
+
+ for(int n = 0; n < MAXLANGUAGES; n++) {
+ mLanguageNo[n] = -1;
+ mLangHI[n] = mConf.mHearingImpaireds[n][0];
+
+ for(int i = 0; i < gNumLanguages; i++) {
+ if(!strncmp(mConf.mLanguages[n][0], gLanguages[i][0], 4) &&
+ !strncmp(mConf.mLanguages[n][1], gLanguages[i][1], 4)) {
+ mLanguageNo[n] = i;
+ break;
+ }
+ }
+ }
- for(int i = 0; i < gNumLanguages; i++) {
- if(!memcmp(mLanguage, gLanguages[i], 3)) {
- mLanguageNo = i;
- break;
+ Add(new cMenuEditBoolItem(tr("Display Subtitles"), &mConf.mDoDisplay, tr("no"), tr("yes")));
+ Add(new cMenuEditBoolItem(tr("Record Subtitles"), &mConf.mDoRecord, tr("no"), tr("yes")));
+ 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,
+ numMainMenuAlts, mainMenuAlts));
+ if(mConf.mTextPos < 0 || mConf.mTextPos >= numTextPosAlts)
+ mConf.mTextPos = 0; // menu item segfaults if out of range
+ Add(new cMenuEditStraItem(tr("Text Horizontal Position"), &mConf.mTextPos,
+ numTextPosAlts, textPosAlts));
+ Add(new cMenuEditBoolItem(tr("Text Vertical Position"),
+ &mConf.mBottomLB, tr("4:3/Anamorph"), tr("Letterbox")));
+ Add(new cMenuEditIntItem(tr("Text Vertical Adjust"),
+ &mConf.mBottomAdj, -100, 45));
+ Add(new cMenuEditBoolItem(tr("Workaround for some French chns"),
+ &mConf.mFrenchSpecial, tr("no"), tr("yes")));
+
+ for(int n = 0; n < MAXLANGUAGES; n++) {
+ char str[100];
+ char *allowedc = "abcdefghijklmnopqrstuvwxyz";
+
+ cOsdItem *item = new cOsdItem("----------------------------");
+ item->SetColor(clrCyan);
+ Add(item);
+
+ sprintf(str, "Language %d", n + 1);
+ if(mLanguageNo[n] >= 0) {
+ Add(new cMenuEditStraItem(tr(str), &mLanguageNo[n], gNumLanguages, gLanguageNames));
+ } else {
+ Add(new cMenuEditStrItem(tr(str), mConf.mLanguages[n][0], 4, allowedc));
+ Add(new cMenuEditStrItem(tr(str), mConf.mLanguages[n][1], 4, allowedc));
}
+
+ sprintf(str, "Language %d Hearing Impaired", n + 1);
+ Add(new cMenuEditBoolItem(tr(str), &(mConf.mHearingImpaireds[n][0]),
+ tr("no"), tr("yes")));
}
- if(mLanguageNo >= 0)
- Add(new cMenuEditStraItem(tr("Language"), &mLanguageNo, gNumLanguages, gLanguages));
- else
- Add(new cMenuEditStrItem(tr("Language"), mLanguage, 4, "abcdefghijklmnopqrstuvwxyz"));
-
- Add(new cMenuEditBoolItem(tr("Hearing Impaired"), &mHearingImpaired, tr("no"), tr("yes")));
- Add(new cMenuEditBoolItem(tr("Record Subtitles"), &mRecord, tr("no"), tr("yes")));
+#ifdef TEST
+ //AddSubMenu(new cMenuSetupTtxtsubsLanguages(mTtxtsubs));
+#endif
+}
+
+cMenuSetupTtxtsubs::~cMenuSetupTtxtsubs(void)
+{
+ if(mSavedFrenchSpecial != mConf.mFrenchSpecial)
+ ClearSICache();
+
+ if(mDoStore) {
+ Store();
+ // Setup.Save(); // Can't get it to write to conf file, menu item disabled.
+ }
}
void cMenuSetupTtxtsubs::Store(void)
{
- if(mLanguageNo >= 0) {
- SetupStore("Language", gLanguages[mLanguageNo]);
- mTtxtsubs->SetLanguage(gLanguages[mLanguageNo]);
- } else {
- SetupStore("Language", mLanguage);
- mTtxtsubs->SetLanguage(mLanguage);
+ for(int n=0; n < MAXLANGUAGES; n++) {
+ if(mLanguageNo[n] >= 0) {
+ strncpy(mConf.mLanguages[n][0], gLanguages[mLanguageNo[n]][0], 4);
+ mConf.mLanguages[n][0][3] = '\0';
+ strncpy(mConf.mLanguages[n][1], gLanguages[mLanguageNo[n]][1], 4);
+ mConf.mLanguages[n][1][3] = '\0';
+ }
+
+ mConf.mHearingImpaireds[n][1] = mConf.mHearingImpaireds[n][0];
}
+
+ SetupStore("Display", mConf.mDoDisplay);
+ SetupStore("Record", mConf.mDoRecord);
+ SetupStore("TextPos", mConf.mTextPos);
+ SetupStore("BottomLB", mConf.mBottomLB);
+ SetupStore("BottomAdj", mConf.mBottomAdj);
+ SetupStore("FrenchSpecial", mConf.mFrenchSpecial);
+ SetupStore("MainMenuEntry", mConf.mMainMenuEntry);
+
+ char lstr[MAXLANGUAGES*2*4 + 1];
+ char histr[MAXLANGUAGES*2 + 1];
+ lstr[0] = '\0';
+ histr[0] = '\0';
+ for(int n=0; n < MAXLANGUAGES; n++) {
+ strncat(lstr, mConf.mLanguages[n][0], 3);
+ strcat(lstr, ",");
+ strncat(lstr, mConf.mLanguages[n][1], 3);
+ if(n != (MAXLANGUAGES - 1))
+ strcat(lstr, ",");
+
+ strcat(histr, mConf.mHearingImpaireds[n][0] ? "1" : "0");
+ strcat(histr, mConf.mHearingImpaireds[n][1] ? "1" : "0");
+ }
+ SetupStore("Languages", lstr);
+ SetupStore("HearingImpaireds", histr);
+
+ globals = mConf;
+}
+
+
+// returns the index to choise number for the given language,
+// lower is more preferred. The result is times two, plus one
+// if the HI wanted but not found, or -1 if no match.
+// Non HI wanted but found is no match.
+
+int cTtxtsubsConf::langChoise(const char *lang, const int HI)
+{
+ size_t i, j;
+ int result = -1;
- SetupStore("HearingImpaired", mHearingImpaired);
- mTtxtsubs->SetHearingImpaired(mHearingImpaired);
+ for(i = 0; i < MAXLANGUAGES; i++) {
+ for(j = 0; j < 2; j++) {
+ if(!mLanguages[i][j][0])
+ continue;
+
+ if(!memcmp(lang, mLanguages[i][j], 3)) {
+ if( ( HI && mHearingImpaireds[i][j] ) ||
+ ( !HI && !mHearingImpaireds[i][j] ) ) {
+ result = i*2;
+ goto x;
+ }
+ if( !HI && mHearingImpaireds[i][j] ) {
+ result = 1 + i*2;
+ goto x;
+ }
+ }
+ }
+ }
- SetupStore("Record", mRecord);
- mTtxtsubs->SetRecord(mRecord);
+ x:
+ return result;
}