mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Making sure the current audio track is actually one of the ones available in a recording
This commit is contained in:
parent
450e58439a
commit
1f677366c4
51
device.c
51
device.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: device.c 1.81 2005/01/30 14:41:57 kls Exp $
|
* $Id: device.c 1.82 2005/02/06 11:32:05 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
@ -137,6 +137,7 @@ cDevice::cDevice(void)
|
|||||||
pesAssembler = new cPesAssembler;
|
pesAssembler = new cPesAssembler;
|
||||||
ClrAvailableTracks();
|
ClrAvailableTracks();
|
||||||
currentAudioTrack = ttAudioFirst;
|
currentAudioTrack = ttAudioFirst;
|
||||||
|
currentAudioTrackMissingCount = 0;
|
||||||
|
|
||||||
for (int i = 0; i < MAXRECEIVERS; i++)
|
for (int i = 0; i < MAXRECEIVERS; i++)
|
||||||
receiver[i] = NULL;
|
receiver[i] = NULL;
|
||||||
@ -551,24 +552,7 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
|||||||
for (int i = 0; i < MAXDPIDS; i++)
|
for (int i = 0; i < MAXDPIDS; i++)
|
||||||
SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i));
|
SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i));
|
||||||
}
|
}
|
||||||
// Select the preferred audio track:
|
EnsureAudioTrack(true);
|
||||||
eTrackType PreferredTrack = ttAudioFirst;
|
|
||||||
int LanguagePreference = -1;
|
|
||||||
int StartCheck = Setup.CurrentDolby ? ttDolbyFirst : ttAudioFirst;
|
|
||||||
int EndCheck = ttDolbyLast;
|
|
||||||
for (int i = StartCheck; i <= EndCheck; i++) {
|
|
||||||
const tTrackId *TrackId = GetTrack(eTrackType(i));
|
|
||||||
if (TrackId && TrackId->id && I18nIsPreferredLanguage(Setup.AudioLanguages, I18nLanguageIndex(TrackId->language), LanguagePreference))
|
|
||||||
PreferredTrack = eTrackType(i);
|
|
||||||
if (Setup.CurrentDolby && i == ttDolbyLast) {
|
|
||||||
i = ttAudioFirst - 1;
|
|
||||||
EndCheck = ttAudioLast;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Make sure we're set to an available audio track:
|
|
||||||
const tTrackId *Track = GetTrack(GetCurrentAudioTrack());
|
|
||||||
if (!Track || !Track->id || PreferredTrack != GetCurrentAudioTrack())
|
|
||||||
SetCurrentAudioTrack(PreferredTrack);
|
|
||||||
}
|
}
|
||||||
cStatus::MsgChannelSwitch(this, Channel->Number()); // only report status if channel switch successfull
|
cStatus::MsgChannelSwitch(this, Channel->Number()); // only report status if channel switch successfull
|
||||||
}
|
}
|
||||||
@ -678,6 +662,10 @@ bool cDevice::SetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const c
|
|||||||
availableTracks[t].flags = Flags;
|
availableTracks[t].flags = Flags;
|
||||||
availableTracks[t].id = Id; // setting 'id' last to avoid the need for extensive locking
|
availableTracks[t].id = Id; // setting 'id' last to avoid the need for extensive locking
|
||||||
}
|
}
|
||||||
|
if (t == currentAudioTrack)
|
||||||
|
currentAudioTrackMissingCount = 0;
|
||||||
|
else if (!availableTracks[currentAudioTrack].id && currentAudioTrackMissingCount++ > NumAudioTracks() * 10)
|
||||||
|
EnsureAudioTrack();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -717,6 +705,31 @@ bool cDevice::SetCurrentAudioTrack(eTrackType Type)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cDevice::EnsureAudioTrack(bool Force)
|
||||||
|
{
|
||||||
|
if (Force || !availableTracks[currentAudioTrack].id) {
|
||||||
|
eTrackType PreferredTrack = ttAudioFirst;
|
||||||
|
int LanguagePreference = -1;
|
||||||
|
int StartCheck = Setup.CurrentDolby ? ttDolbyFirst : ttAudioFirst;
|
||||||
|
int EndCheck = ttDolbyLast;
|
||||||
|
for (int i = StartCheck; i <= EndCheck; i++) {
|
||||||
|
const tTrackId *TrackId = GetTrack(eTrackType(i));
|
||||||
|
if (TrackId && TrackId->id && I18nIsPreferredLanguage(Setup.AudioLanguages, I18nLanguageIndex(TrackId->language), LanguagePreference))
|
||||||
|
PreferredTrack = eTrackType(i);
|
||||||
|
if (Setup.CurrentDolby && i == ttDolbyLast) {
|
||||||
|
i = ttAudioFirst - 1;
|
||||||
|
EndCheck = ttAudioLast;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Make sure we're set to an available audio track:
|
||||||
|
const tTrackId *Track = GetTrack(GetCurrentAudioTrack());
|
||||||
|
if (!Track || !Track->id || PreferredTrack != GetCurrentAudioTrack()) {
|
||||||
|
dsyslog("setting audio track to %d", PreferredTrack);
|
||||||
|
SetCurrentAudioTrack(PreferredTrack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool cDevice::CanReplay(void) const
|
bool cDevice::CanReplay(void) const
|
||||||
{
|
{
|
||||||
return HasDecoder();
|
return HasDecoder();
|
||||||
|
7
device.h
7
device.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: device.h 1.53 2005/01/22 14:58:07 kls Exp $
|
* $Id: device.h 1.54 2005/02/06 11:25:37 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DEVICE_H
|
#ifndef __DEVICE_H
|
||||||
@ -315,6 +315,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
tTrackId availableTracks[ttMaxTrackTypes];
|
tTrackId availableTracks[ttMaxTrackTypes];
|
||||||
eTrackType currentAudioTrack;
|
eTrackType currentAudioTrack;
|
||||||
|
int currentAudioTrackMissingCount;
|
||||||
bool pre_1_3_19_PrivateStream;
|
bool pre_1_3_19_PrivateStream;
|
||||||
protected:
|
protected:
|
||||||
virtual void SetAudioTrackDevice(eTrackType Type);
|
virtual void SetAudioTrackDevice(eTrackType Type);
|
||||||
@ -339,6 +340,10 @@ public:
|
|||||||
bool SetCurrentAudioTrack(eTrackType Type);
|
bool SetCurrentAudioTrack(eTrackType Type);
|
||||||
///< Sets the current audio track to the given Type.
|
///< Sets the current audio track to the given Type.
|
||||||
///< \return Returns true if Type is a valid audio track, false otherwise.
|
///< \return Returns true if Type is a valid audio track, false otherwise.
|
||||||
|
void EnsureAudioTrack(bool Force = false);
|
||||||
|
///< Makes sure an audio track is selected that is actually available.
|
||||||
|
///< If Force is true, the language and Dolby Digital settings will
|
||||||
|
///< be verified even if the current audio track is available.
|
||||||
|
|
||||||
// Audio facilities
|
// Audio facilities
|
||||||
|
|
||||||
|
3
menu.c
3
menu.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: menu.c 1.339 2005/02/05 11:35:23 kls Exp $
|
* $Id: menu.c 1.340 2005/02/06 11:33:13 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -2850,6 +2850,7 @@ cDisplayTracks *cDisplayTracks::currentDisplayTracks = NULL;
|
|||||||
cDisplayTracks::cDisplayTracks(void)
|
cDisplayTracks::cDisplayTracks(void)
|
||||||
:cOsdObject(true)
|
:cOsdObject(true)
|
||||||
{
|
{
|
||||||
|
cDevice::PrimaryDevice()->EnsureAudioTrack();
|
||||||
// Get the actual audio track descriptions from the EPG if we're not replaying:
|
// Get the actual audio track descriptions from the EPG if we're not replaying:
|
||||||
if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice())
|
if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice())
|
||||||
SetTrackDescriptions();
|
SetTrackDescriptions();
|
||||||
|
Loading…
Reference in New Issue
Block a user