Use quirk to TEARDOWN before PLAY to avoid possible glitches

This commit is contained in:
Rolf Ahrenberg 2021-02-28 20:33:40 +02:00
parent 43b60b1566
commit 0115ba1725
3 changed files with 20 additions and 14 deletions

View File

@ -139,16 +139,16 @@ cSatipServer::cSatipServer(const char *srcAddressP, const char *addressP, const
strstr(*descriptionM, "Schwaiger Sat>IP Server") // Schwaiger MS41IP strstr(*descriptionM, "Schwaiger Sat>IP Server") // Schwaiger MS41IP
) )
quirkM |= eSatipQuirkForceLock; 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 if (strstr(*descriptionM, "OctopusNet") || // Digital Devices OctopusNet
strstr(*descriptionM, "minisatip") // minisatip server strstr(*descriptionM, "minisatip") // minisatip server
) )
quirkM |= eSatipQuirkCiXpmt; quirkM |= eSatipQuirkCiXpmt;
// These devices support the TNR protocol extension // These devices support the TNR protocol extension:
if (strstr(*descriptionM, "DVBViewer") // DVBViewer Media Server if (strstr(*descriptionM, "DVBViewer") // DVBViewer Media Server
) )
quirkM |= eSatipQuirkCiTnr; 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 if (strstr(*descriptionM, "GSSBOX") || // Grundig Sat Systems GSS.box DSI 400
strstr(*descriptionM, "DIGIBIT") || // Telestar Digibit R1 strstr(*descriptionM, "DIGIBIT") || // Telestar Digibit R1
strstr(*descriptionM, "Multibox-") || // Inverto IDL-400s: Multibox-<MMAACC>:SAT>IP strstr(*descriptionM, "Multibox-") || // Inverto IDL-400s: Multibox-<MMAACC>:SAT>IP
@ -156,6 +156,11 @@ cSatipServer::cSatipServer(const char *srcAddressP, const char *addressP, const
strstr(*descriptionM, "KATHREIN SatIP Server") // Kathrein ExIP 414/E strstr(*descriptionM, "KATHREIN SatIP Server") // Kathrein ExIP 414/E
) )
quirkM |= eSatipQuirkForcePilot; 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) if ((quirkM & eSatipQuirkMask) & eSatipQuirkSessionId)
quirksM = cString::sprintf("%s%sSessionId", *quirksM, isempty(*quirksM) ? "" : ","); quirksM = cString::sprintf("%s%sSessionId", *quirksM, isempty(*quirksM) ? "" : ",");

View File

@ -76,15 +76,16 @@ private:
public: public:
enum eSatipQuirk { enum eSatipQuirk {
eSatipQuirkNone = 0x00, eSatipQuirkNone = 0x00,
eSatipQuirkSessionId = 0x01, eSatipQuirkSessionId = 0x01,
eSatipQuirkPlayPids = 0x02, eSatipQuirkPlayPids = 0x02,
eSatipQuirkForceLock = 0x04, eSatipQuirkForceLock = 0x04,
eSatipQuirkRtpOverTcp = 0x08, eSatipQuirkRtpOverTcp = 0x08,
eSatipQuirkCiXpmt = 0x10, eSatipQuirkCiXpmt = 0x10,
eSatipQuirkCiTnr = 0x20, eSatipQuirkCiTnr = 0x20,
eSatipQuirkForcePilot = 0x40, eSatipQuirkForcePilot = 0x40,
eSatipQuirkMask = 0xFF 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); cSatipServer(const char *srcAddressP, const char *addressP, const int portP, const char *modelP, const char *filtersP, const char *descriptionP, const int quirkP);
virtual ~cSatipServer(); virtual ~cSatipServer();

View File

@ -120,8 +120,8 @@ void cSatipTuner::Action(void)
break; break;
case tsSet: case tsSet:
debug4("%s: tsSet [device %d]", __PRETTY_FUNCTION__, deviceIdM); debug4("%s: tsSet [device %d]", __PRETTY_FUNCTION__, deviceIdM);
// some devices require TEARDOWN before new PLAY command if (currentServerM.IsQuirk(cSatipServer::eSatipQuirkTearAndPlay))
Disconnect(); Disconnect();
if (Connect()) { if (Connect()) {
tuning.Set(eTuningTimeoutMs); tuning.Set(eTuningTimeoutMs);
RequestState(tsTuned, smInternal); RequestState(tsTuned, smInternal);