diff --git a/server.c b/server.c index b6ace5a..5cdba44 100644 --- a/server.c +++ b/server.c @@ -139,16 +139,16 @@ cSatipServer::cSatipServer(const char *srcAddressP, const char *addressP, const strstr(*descriptionM, "Schwaiger Sat>IP Server") // Schwaiger MS41IP ) quirkM |= eSatipQuirkForceLock; - // These devices support the X_PMT protocol extension + // These devices support the X_PMT protocol extension: if (strstr(*descriptionM, "OctopusNet") || // Digital Devices OctopusNet strstr(*descriptionM, "minisatip") // minisatip server ) quirkM |= eSatipQuirkCiXpmt; - // These devices support the TNR protocol extension + // These devices support the TNR protocol extension: if (strstr(*descriptionM, "DVBViewer") // DVBViewer Media Server ) quirkM |= eSatipQuirkCiTnr; - // These devices don't support auto-detection of pilot tones + // These devices don't support auto-detection of pilot tones: if (strstr(*descriptionM, "GSSBOX") || // Grundig Sat Systems GSS.box DSI 400 strstr(*descriptionM, "DIGIBIT") || // Telestar Digibit R1 strstr(*descriptionM, "Multibox-") || // Inverto IDL-400s: Multibox-:SAT>IP @@ -156,6 +156,11 @@ cSatipServer::cSatipServer(const char *srcAddressP, const char *addressP, const strstr(*descriptionM, "KATHREIN SatIP Server") // Kathrein ExIP 414/E ) quirkM |= eSatipQuirkForcePilot; + // These devices require TEARDOWN before new PLAY command: + if (strstr(*descriptionM, "FRITZ!WLAN Repeater DVB-C") || // FRITZ!WLAN Repeater DVB-C + strstr(*descriptionM, "fritzdvbc") // FRITZ!WLAN Repeater DVB-C (old firmware) + ) + quirkM |= eSatipQuirkTearAndPlay; } if ((quirkM & eSatipQuirkMask) & eSatipQuirkSessionId) quirksM = cString::sprintf("%s%sSessionId", *quirksM, isempty(*quirksM) ? "" : ","); diff --git a/server.h b/server.h index ea97e66..8ec4724 100644 --- a/server.h +++ b/server.h @@ -76,15 +76,16 @@ private: public: enum eSatipQuirk { - eSatipQuirkNone = 0x00, - eSatipQuirkSessionId = 0x01, - eSatipQuirkPlayPids = 0x02, - eSatipQuirkForceLock = 0x04, - eSatipQuirkRtpOverTcp = 0x08, - eSatipQuirkCiXpmt = 0x10, - eSatipQuirkCiTnr = 0x20, - eSatipQuirkForcePilot = 0x40, - eSatipQuirkMask = 0xFF + eSatipQuirkNone = 0x00, + eSatipQuirkSessionId = 0x01, + eSatipQuirkPlayPids = 0x02, + eSatipQuirkForceLock = 0x04, + eSatipQuirkRtpOverTcp = 0x08, + eSatipQuirkCiXpmt = 0x10, + eSatipQuirkCiTnr = 0x20, + eSatipQuirkForcePilot = 0x40, + eSatipQuirkTearAndPlay = 0x80, + eSatipQuirkMask = 0xFF }; cSatipServer(const char *srcAddressP, const char *addressP, const int portP, const char *modelP, const char *filtersP, const char *descriptionP, const int quirkP); virtual ~cSatipServer(); diff --git a/tuner.c b/tuner.c index 219a556..0382f14 100644 --- a/tuner.c +++ b/tuner.c @@ -120,8 +120,8 @@ void cSatipTuner::Action(void) break; case tsSet: debug4("%s: tsSet [device %d]", __PRETTY_FUNCTION__, deviceIdM); - // some devices require TEARDOWN before new PLAY command - Disconnect(); + if (currentServerM.IsQuirk(cSatipServer::eSatipQuirkTearAndPlay)) + Disconnect(); if (Connect()) { tuning.Set(eTuningTimeoutMs); RequestState(tsTuned, smInternal);