diff options
Diffstat (limited to 'device.c')
-rw-r--r-- | device.c | 38 |
1 files changed, 19 insertions, 19 deletions
@@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 2.49 2012/02/15 13:15:19 kls Exp $ + * $Id: device.c 2.55 2012/03/03 11:43:05 kls Exp $ */ #include "device.h" @@ -59,9 +59,6 @@ bool cDeviceHook::DeviceProvidesTransponder(const cDevice *Device, const cChanne // --- cDevice --------------------------------------------------------------- -// The default priority for non-primary devices: -#define DEFAULTPRIORITY -1 - // The minimum number of unknown PS1 packets to consider this a "pre 1.3.19 private stream": #define MIN_PRE_1_3_19_PRIVATESTREAM 10 @@ -229,7 +226,7 @@ static int GetClippedNumProvidedSystems(int AvailableBits, cDevice *Device) return NumProvidedSystems; } -cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView) +cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView, bool Query) { cDevice *AvoidDevice = avoidDevice; avoidDevice = NULL; @@ -269,7 +266,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView if (NumUsableSlots && !CamSlots.Get(j)->Assign(device[i], true)) continue; // CAM slot can't be used with this device bool ndr; - if (device[i]->ProvidesChannel(Channel, (LiveView && device[i]->IsPrimaryDevice()) ? Setup.PrimaryLimit : Priority, &ndr)) { // this device is basicly able to do the job + if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job if (NumUsableSlots && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j)) ndr = true; // using a different CAM slot requires detaching receivers // Put together an integer number that reflects the "impact" using @@ -284,8 +281,8 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView imp <<= 1; imp |= device[i]->Receiving(); // avoid devices that are receiving imp <<= 4; imp |= GetClippedNumProvidedSystems(4, device[i]) - 1; // avoid cards which support multiple delivery systems imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device - imp <<= 8; imp |= min(max(device[i]->Priority() + MAXPRIORITY, 0), 0xFF); // use the device with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used) - imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF); // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used) + imp <<= 8; imp |= device[i]->Priority() - IDLEPRIORITY; // use the device with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used) + imp <<= 8; imp |= (NumUsableSlots ? SlotPriority[j] : IDLEPRIORITY) - IDLEPRIORITY; // use the CAM slot with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used) imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers imp <<= 1; imp |= NumUsableSlots ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels imp <<= 1; imp |= device[i]->AvoidRecording(); // avoid SD full featured cards @@ -304,7 +301,7 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView if (!NumUsableSlots) break; // no CAM necessary, so just one loop over the devices } - if (d) { + if (d && !Query) { if (NeedsDetachReceivers) d->DetachAllReceivers(); if (s) { @@ -655,7 +652,7 @@ bool cDevice::IsTunedToTransponder(const cChannel *Channel) const bool cDevice::MaySwitchTransponder(const cChannel *Channel) const { - return time(NULL) > occupiedTimeout && !Receiving(true) && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid); + return time(NULL) > occupiedTimeout && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid); } bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView) @@ -690,7 +687,7 @@ bool cDevice::SwitchChannel(int Direction) cChannel *channel; while ((channel = Channels.GetByNumber(n, Direction)) != NULL) { // try only channels which are currently available - if (GetDevice(channel, 0, true)) + if (GetDevice(channel, LIVEPRIORITY, true, true)) break; n = channel->Number() + Direction; } @@ -711,13 +708,15 @@ bool cDevice::SwitchChannel(int Direction) eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) { + cStatus::MsgChannelSwitch(this, 0); + if (LiveView) { StopReplay(); DELETENULL(liveSubtitle); DELETENULL(dvbSubtitleConverter); } - cDevice *Device = (LiveView && IsPrimaryDevice()) ? GetDevice(Channel, 0, LiveView) : this; + cDevice *Device = (LiveView && IsPrimaryDevice()) ? GetDevice(Channel, LIVEPRIORITY, true) : this; bool NeedsTransferMode = Device != this; @@ -728,7 +727,6 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) if (NeedsTransferMode) { if (Device && CanReplay()) { - cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel if (Device->SetChannel(Channel, false) == scrOk) // calling SetChannel() directly, not SwitchChannel()! cControl::Launch(new cTransferControl(Device, Channel)); else @@ -739,7 +737,6 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView) } else { Channels.Lock(false); - cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel // Stop section handling: if (sectionHandler) { sectionHandler->SetStatus(false); @@ -880,7 +877,7 @@ void cDevice::SetAudioChannel(int AudioChannel) void cDevice::SetVolume(int Volume, bool Absolute) { int OldVolume = volume; - volume = min(max(Absolute ? Volume : volume + Volume, 0), MAXVOLUME); + volume = constrain(Absolute ? Volume : volume + Volume, 0, MAXVOLUME); SetVolumeDevice(volume); Absolute |= mute; cStatus::MsgSetVolume(Absolute ? volume : volume - OldVolume, Absolute); @@ -1049,7 +1046,8 @@ void cDevice::EnsureSubtitleTrack(void) int LanguagePreference = INT_MAX; // higher than the maximum possible value for (int i = ttSubtitleFirst; i <= ttSubtitleLast; i++) { const tTrackId *TrackId = GetTrack(eTrackType(i)); - if (TrackId && TrackId->id && I18nIsPreferredLanguage(Setup.SubtitleLanguages, TrackId->language, LanguagePreference)) + if (TrackId && TrackId->id && (I18nIsPreferredLanguage(Setup.SubtitleLanguages, TrackId->language, LanguagePreference) || + (i == ttSubtitleFirst + 8 && !*TrackId->language && LanguagePreference == INT_MAX))) // compatibility mode for old subtitles plugin PreferredTrack = eTrackType(i); } // Make sure we're set to an available subtitle track: @@ -1495,7 +1493,9 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly) int cDevice::Priority(void) const { - int priority = IsPrimaryDevice() ? Setup.PrimaryLimit - 1 : DEFAULTPRIORITY; + int priority = IDLEPRIORITY; + if (IsPrimaryDevice() && !Replaying() && ActualDevice() == PrimaryDevice()) + priority = TRANSFERPRIORITY; // we use the same value here, no matter whether it's actual Transfer Mode or real live viewing cMutexLock MutexLock(&mutexReceiver); for (int i = 0; i < MAXRECEIVERS; i++) { if (receiver[i]) @@ -1509,11 +1509,11 @@ bool cDevice::Ready(void) return true; } -bool cDevice::Receiving(bool CheckAny) const +bool cDevice::Receiving(bool Dummy) const { cMutexLock MutexLock(&mutexReceiver); for (int i = 0; i < MAXRECEIVERS; i++) { - if (receiver[i] && (CheckAny || receiver[i]->priority >= 0)) // cReceiver with priority < 0 doesn't count + if (receiver[i]) return true; } return false; |