Implemented preferred audio languages

This commit is contained in:
Klaus Schmidinger 2005-01-05 10:48:22 +01:00
parent da59a45f61
commit 42ab8c8797
6 changed files with 80 additions and 9 deletions

View File

@ -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).

9
MANUAL
View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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

54
menu.c
View File

@ -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;
}