diff --git a/HISTORY b/HISTORY index 94c5dbf7..b3a3d6da 100644 --- a/HISTORY +++ b/HISTORY @@ -3266,3 +3266,6 @@ Video Disk Recorder Revision History - Skins need to implement the new cSkinDisplayTrack class to display the audio track menu. - Fixed reusing OSD in cDvbSpuDecoder (thanks to Reinhard Nissl). +- The new setup option "DVB/Audio languages" can be used to control which audio + language shall be selected in case a channel broadcasts in different languages + (see MANUAL for details). diff --git a/MANUAL b/MANUAL index 4125fe70..51780880 100644 --- a/MANUAL +++ b/MANUAL @@ -580,6 +580,15 @@ Version 1.2 updates and also add newly found channels, and '4' will also add newly found transponders. + Audio languages = 0 Some tv stations broadcast various audio tracks in different + languages. This option allows you to define which language(s) + you prefer in such cases. By default, or if none of the + preferred languages is broadcast, the first audio track will + be selected when switching to such a channel. If this option + is set to a non-zero value, the menu page will contain that + many "Audio language" options which allow you to select the + individual preferred languages. + LNB: SLOF = 11700 The switching frequency (in MHz) between low and diff --git a/config.c b/config.c index 36ecb126..eb182154 100644 --- a/config.c +++ b/config.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.c 1.128 2004/10/31 16:17:39 kls Exp $ + * $Id: config.c 1.129 2005/01/04 13:48:49 kls Exp $ */ #include "config.h" @@ -262,6 +262,7 @@ cSetup::cSetup(void) TimeTransponder = 0; MarginStart = 2; MarginStop = 10; + AudioLanguages[0] = -1; EPGLanguages[0] = -1; EPGScanTimeout = 5; EPGBugfixLevel = 2; @@ -415,6 +416,7 @@ bool cSetup::Parse(const char *Name, const char *Value) else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value); else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value); else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value); + else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages); else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages); else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value); else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value); @@ -475,6 +477,7 @@ bool cSetup::Save(void) Store("TimeTransponder", TimeTransponder); Store("MarginStart", MarginStart); Store("MarginStop", MarginStop); + StoreLanguages("AudioLanguages", AudioLanguages); StoreLanguages("EPGLanguages", EPGLanguages); Store("EPGScanTimeout", EPGScanTimeout); Store("EPGBugfixLevel", EPGBugfixLevel); diff --git a/config.h b/config.h index d13ed2fc..4c7b4947 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.206 2004/11/22 16:49:39 kls Exp $ + * $Id: config.h 1.207 2005/01/04 13:47:38 kls Exp $ */ #ifndef __CONFIG_H @@ -222,6 +222,7 @@ public: int TimeSource; int TimeTransponder; int MarginStart, MarginStop; + int AudioLanguages[I18nNumLanguages + 1]; int EPGLanguages[I18nNumLanguages + 1]; int EPGScanTimeout; int EPGBugfixLevel; diff --git a/device.c b/device.c index 3faefab3..a709a4c6 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.66 2005/01/04 13:13:24 kls Exp $ + * $Id: device.c 1.67 2005/01/04 15:38:46 kls Exp $ */ #include "device.h" @@ -541,11 +541,24 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) if (Result == scrOk) { if (LiveView && IsPrimaryDevice()) { + // Set the available audio tracks: ClrAvailableTracks(); for (int i = 0; i < MAXAPIDS; i++) { SetAvailableTrack(ttAudio, i, Channel->Apid(i), Channel->Alang(i)); SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i)); } + // Select the preferred audio track: + eTrackType PreferredTrack = ttAudioFirst; + int LanguagePreference = -1; + for (int i = ttAudioFirst; i <= ttDolbyLast; i++) { + const tTrackId *TrackId = GetTrack(eTrackType(i)); + if (TrackId && TrackId->id && I18nIsPreferredLanguage(Setup.AudioLanguages, I18nLanguageIndex(TrackId->language), LanguagePreference)) + PreferredTrack = eTrackType(i); + } + // Make sure we're set to an available audio track: + const tTrackId *Track = GetTrack(GetCurrentAudioTrack()); + if (!Track || !Track->id || PreferredTrack != GetCurrentAudioTrack()) + SetCurrentAudioTrack(PreferredTrack); currentChannel = Channel->Number(); } cStatus::MsgChannelSwitch(this, Channel->Number()); // only report status if channel switch successfull diff --git a/menu.c b/menu.c index 8582c47b..82fa59b4 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.327 2005/01/04 13:40:38 kls Exp $ + * $Id: menu.c 1.328 2005/01/05 10:26:59 kls Exp $ */ #include "menu.h" @@ -1911,6 +1911,9 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key) class cMenuSetupDVB : public cMenuSetupBase { private: + int originalNumAudioLanguages; + int numAudioLanguages; + void Setup(void); const char *updateChannelsTexts[5]; public: cMenuSetupDVB(void); @@ -1919,6 +1922,9 @@ public: cMenuSetupDVB::cMenuSetupDVB(void) { + for (numAudioLanguages = 0; numAudioLanguages < I18nNumLanguages && data.AudioLanguages[numAudioLanguages] >= 0; numAudioLanguages++) + ; + originalNumAudioLanguages = numAudioLanguages; updateChannelsTexts[0] = tr("no"); updateChannelsTexts[1] = tr("names only"); updateChannelsTexts[2] = tr("names and PIDs"); @@ -1926,22 +1932,58 @@ cMenuSetupDVB::cMenuSetupDVB(void) updateChannelsTexts[4] = tr("add new transponders"); SetSection(tr("DVB")); + Setup(); +} + +void cMenuSetupDVB::Setup(void) +{ + int current = Current(); + + Clear(); + Add(new cMenuEditIntItem( tr("Setup.DVB$Primary DVB interface"), &data.PrimaryDVB, 1, cDevice::NumDevices())); Add(new cMenuEditBoolItem(tr("Setup.DVB$Video format"), &data.VideoFormat, "4:3", "16:9")); Add(new cMenuEditStraItem(tr("Setup.DVB$Update channels"), &data.UpdateChannels, 5, updateChannelsTexts)); + Add(new cMenuEditIntItem( tr("Setup.DVB$Audio languages"), &numAudioLanguages, 0, I18nNumLanguages)); + for (int i = 0; i < numAudioLanguages; i++) + Add(new cMenuEditStraItem(tr("Setup.EPG$Audio language"), &data.AudioLanguages[i], I18nNumLanguages, I18nLanguages())); + + SetCurrent(Get(current)); + Display(); } eOSState cMenuSetupDVB::ProcessKey(eKeys Key) { - int oldPrimaryDVB = Setup.PrimaryDVB; - bool oldVideoFormat = Setup.VideoFormat; + int oldPrimaryDVB = ::Setup.PrimaryDVB; + bool oldVideoFormat = ::Setup.VideoFormat; + int oldnumAudioLanguages = numAudioLanguages; eOSState state = cMenuSetupBase::ProcessKey(Key); + if (Key != kNone) { + if (numAudioLanguages != oldnumAudioLanguages) { + for (int i = oldnumAudioLanguages; i < numAudioLanguages; i++) { + data.AudioLanguages[i] = 0; + for (int l = 0; l < I18nNumLanguages; l++) { + int k; + for (k = 0; k < oldnumAudioLanguages; k++) { + if (data.AudioLanguages[k] == l) + break; + } + if (k >= oldnumAudioLanguages) { + data.AudioLanguages[i] = l; + break; + } + } + } + data.AudioLanguages[numAudioLanguages] = -1; + Setup(); + } + } if (state == osBack && Key == kOk) { - if (Setup.PrimaryDVB != oldPrimaryDVB) + if (::Setup.PrimaryDVB != oldPrimaryDVB) state = osSwitchDvb; - if (Setup.VideoFormat != oldVideoFormat) - cDevice::PrimaryDevice()->SetVideoFormat(Setup.VideoFormat); + if (::Setup.VideoFormat != oldVideoFormat) + cDevice::PrimaryDevice()->SetVideoFormat(::Setup.VideoFormat); } return state; }