[vdr] Device bonding

Juergen Lock vdr-l at jelal.kn-bremen.de
Sat Feb 16 16:46:36 CET 2013


Hi!

 Now that I have a spare DVB-S2 tuner (TechniSat SkyStar USB HD
(adapter2); the others on this box are atm Hauppauge Nova-TD model
1172 (adapter 0+1) and TechnoTrend S2-3600 (adapter3) - all USB) I
decided to play with vdr device bonding.  I discovered three things:
(still using vdr 1.7.29, I know I should upgrade... :)

1. The LNB setup OSD menu causes bonding to fail (it's trying to
   bond a DVB-T tuner) if I set the two DVB-S2 tuners as "connected
   to sat cable 1"; it works with "sat cable 2".  Maybe it somehow
   thinks of (one of?) the DVB-T tuner(s) as cable 1 too?

2. The infosatepg plugin doesn't check MaySwitchTransponder() and thus
   grabs a bonded device when it shouldn't, I just patched that in the
   FreeBSD port: (plugin maintainer Cc'd)

	http://svnweb.freebsd.org/ports/head/multimedia/vdr-plugin-infosatepg/files/patch-infosatepg.cpp?r1=300896&r2=312357

3. Running with these four tuners (dual DVB-T and the bonded two DVB-S2)
   I get two different deadlocks waiting for cDvbTuner::bondMutex
   after live viewing a DVB-T(!) channel for longer (OSD doesn't
   react anymore and attaching gdb reveals two threads waiting for
   bondMutex) - the following two changes make it work but there
   probably is a better fix:  (patch may apply with offsets; one
   of the problems I think is a lock order reversal with cDvbTuner::mutex
   and bondMutex when cDvbTuner::SetChannel calls back into itself
   with bondMutex held.)

--- dvbdevice.c.orig
+++ dvbdevice.c
@@ -476,8 +476,10 @@ void cDvbTuner::SetChannel(const cChanne
                   t->SetChannel(NULL);
               }
            }
-        else if (strcmp(GetBondingParams(Channel), BondedMaster->GetBondingParams()) != 0)
+        else if (strcmp(GetBondingParams(Channel), BondedMaster->GetBondingParams()) != 0) {
+           bondMutex.Unlock();
            BondedMaster->SetChannel(Channel);
+           }
         }
      cMutexLock MutexLock(&mutex);
      if (!IsTunedTo(Channel))
@@ -761,7 +773,12 @@ bool cDvbTuner::SetFrontend(void)
            tone = SEC_TONE_ON;
            }
         int volt = (dtp.Polarization() == 'V' || dtp.Polarization() == 'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
-        if (GetBondedMaster() != this) {
+#if 1
+        if (bondedTuner && !bondedMaster)
+#else
+        if (GetBondedMaster() != this)
+#endif
+           {
            tone = SEC_TONE_OFF;
            volt = SEC_VOLTAGE_13;
            }

 Thanx,
	Juergen



More information about the vdr mailing list