Added a timeout for releasing idling devices.

This commit is contained in:
Rolf Ahrenberg 2015-05-22 22:42:11 +03:00
parent 6c4c8a10b7
commit 6384b8694e
7 changed files with 25 additions and 1 deletions

View File

@ -137,3 +137,7 @@ VDR Plugin 'satip' Revision History
interface.
- Added new ATTA and DETA SVDRP commands.
- Set the default device count to two.
2015-xx-xx: Version 2.2.3
- Added a timeout for releasing idling devices.

View File

@ -460,6 +460,11 @@ int cSatipDevice::GetCISlot(void)
return slot;
}
bool cSatipDevice::IsIdle(void)
{
return !Receiving();
}
uchar *cSatipDevice::GetData(int *availableP)
{
debug16("%s [device %u]", __PRETTY_FUNCTION__, deviceIndexM);

View File

@ -110,6 +110,7 @@ public:
virtual int GetId(void);
virtual int GetPmtPid(void);
virtual int GetCISlot(void);
virtual bool IsIdle(void);
};
#endif // __SATIP_DEVICE_H

View File

@ -16,6 +16,7 @@ public:
virtual int GetId(void) = 0;
virtual int GetPmtPid(void) = 0;
virtual int GetCISlot(void) = 0;
virtual bool IsIdle(void) = 0;
private:
cSatipDeviceIf(const cSatipDeviceIf&);

View File

@ -27,7 +27,7 @@
#define GITVERSION ""
#endif
const char VERSION[] = "2.2.2" GITVERSION;
const char VERSION[] = "2.2.3" GITVERSION;
static const char DESCRIPTION[] = trNOOP("SAT>IP Devices");
class cPluginSatip : public cPlugin {

11
tuner.c
View File

@ -29,6 +29,7 @@ cSatipTuner::cSatipTuner(cSatipDeviceIf &deviceP, unsigned int packetLenP)
nextServerM(NULL, deviceP.GetId(), 0),
mutexM(),
reConnectM(),
idleReleaseM(),
keepAliveM(),
statusUpdateM(),
pidUpdateCacheM(),
@ -92,6 +93,7 @@ void cSatipTuner::Action(void)
{
debug1("%s Entering [device %d]", __PRETTY_FUNCTION__, deviceIdM);
reConnectM.Set(eConnectTimeoutMs);
idleReleaseM.Set(eIdleTimeoutMs);
// Do the thread loop
while (Running()) {
UpdateCurrentState();
@ -116,6 +118,7 @@ void cSatipTuner::Action(void)
case tsTuned:
debug4("%s: tsTuned [device %d]", __PRETTY_FUNCTION__, deviceIdM);
reConnectM.Set(eConnectTimeoutMs);
idleReleaseM.Set(eIdleTimeoutMs);
// Read reception statistics via DESCRIBE and RTCP
if (hasLockM || ReadReceptionStatus()) {
// Quirk for devices without valid reception data
@ -145,6 +148,14 @@ void cSatipTuner::Action(void)
RequestState(tsSet, smInternal);
break;
}
if (idleReleaseM.TimedOut()) {
idleReleaseM.Set(eIdleTimeoutMs);
if (deviceM->IsIdle()) {
info("Idle timeout - releasing [device %d]", deviceIdM);
RequestState(tsRelease, smInternal);
}
break;
}
break;
default:
error("Unknown tuner status %d [device %d]", currentStateM, deviceIdM);

View File

@ -83,6 +83,7 @@ private:
eStatusUpdateTimeoutMs = 1000, // in milliseconds
ePidUpdateIntervalMs = 250, // in milliseconds
eConnectTimeoutMs = 5000, // in milliseconds
eIdleTimeoutMs = 30000, // in milliseconds
eMinKeepAliveIntervalMs = 30000 // in milliseconds
};
enum eTunerState { tsIdle, tsRelease, tsSet, tsTuned, tsLocked };
@ -100,6 +101,7 @@ private:
cSatipTunerServer nextServerM;
cMutex mutexM;
cTimeMs reConnectM;
cTimeMs idleReleaseM;
cTimeMs keepAliveM;
cTimeMs statusUpdateM;
cTimeMs pidUpdateCacheM;