device.c: cDevice::GetDevice

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

let's consider this setup:
- one headless computer, 2 dvb-s cards (1 ff, 1 budget) both
  receiving the exactly the same set of channels
- this server runs 2 vdr instances: first main one with
  streamdev-server handling the dvb cards, the other one with
  streamdev-client
- both of them are running vdr-xineliboutput plugin so that i can have
  2 independant outputs(TV) plugged in.
- main vdr is doing the recording and also being used a http stream
  server for one client (occasionnaly)

The channels i'm using are those:
:BBC
BBC 1 London;BSkyB:10773:hC56:S28.2E:22000:5000:5001=eng,5002=NAR:5003:0:6301:2:2045:0
BBC 2 England;BSkyB:10773:hC56:S28.2E:22000:5100:5101=eng,5102=NAR:5103:0:6302:2:2045:0
BBC THREE;BSkyB:10773:hC56:S28.2E:22000:5200:5201=eng,5202=NAR:5203:0:6319:2:2045:0
BBC FOUR;BSkyB:10773:hC56:S28.2E:22000:5300:5301=eng,5302=NAR:5303:0:6316:2:2045:0
:ITV
ITV1 Granada;BSkyB:10758:vC56:S28.2E:22000:2318:2319=eng:2320:0:10080:2:2044:0
ITV2;BSkyB:10758:vC56:S28.2E:22000:2314:2315=eng,2363=NAR:2317:0:10070:2:2044:0
ITV3;BSkyB:10906:vC56:S28.2E:22000:2363:2364=eng,2314=NAR:2365:0:10260:2:2054:0
ITV4;BSkyB:10758:vC56:S28.2E:22000:2305:2306=eng:2309:0:10072:2:2044:0

I have added
esyslog("GetDevice(1) device #%d imp=%x ndr=%d isreceiving=%d isactual=%d isprimary=%d hasdecoder=%d devprio=%d Priority=%d providesca=%d\n",i,imp,ndr,device[i]->Receiving(),device[i]==ActualDevice(),device[i]->IsPrimaryDevice(),device[i]->HasDecoder(),device[i]->Priority(),Priority,device[i]->ProvidesCa(Channel));
before if (imp < Impact) {
and added
esyslog("GetDevice(2) device #%d SELECTED imp=%x\n",i,imp);
before if (NeedsDetachReceivers)

first (main) vdr tunes to bbc 1: it uses the budget card:
Jul  4 00:33:24 dvb vdr: [22230] switching to channel 1
Jul  4 00:33:24 dvb vdr: [22230] GetDevice(1) device #0 imp=116202 ndr=0 isreceiving=0 isactual=0 isprimary=0 hasdecoder=1 devprio=-1 Priority=0 providesca=2 
Jul  4 00:33:24 dvb vdr: [22230] GetDevice(2) device #0 SELECTED imp=116202 
Jul  4 00:33:24 dvb vdr: [22230] INFO: Using software decryption on card 1
Jul  4 00:33:24 dvb vdr: [22230] GetDevice(1) device #1 imp=106202 ndr=0 isreceiving=0 isactual=0 isprimary=0 hasdecoder=0 devprio=-1 Priority=0 providesca=2 
Jul  4 00:33:24 dvb vdr: [22230] GetDevice(2) device #1 SELECTED imp=106202 


then second vdr is launched and tuned to bbc 2: it uses the ff card:
Jul  4 00:37:05 dvb vdr: [22246] GetDevice(1) device #0 imp=116202 ndr=0 isreceiving=0 isactual=0 isprimary=0 hasdecoder=1 devprio=-1 Priority=0 providesca=2 
Jul  4 00:37:05 dvb vdr: [22246] GetDevice(2) device #0 SELECTED imp=116202 
Jul  4 00:37:05 dvb vdr: [22246] GetDevice(1) device #1 imp=146202 ndr=0 isreceiving=0 isactual=1 isprimary=0 hasdecoder=0 devprio=-1 Priority=0 providesca=2 
Jul  4 00:37:06 dvb vdr: [22246] GetDevice(1) device #0 imp=116202 ndr=0 isreceiving=0 isactual=0 isprimary=0 hasdecoder=1 devprio=-1 Priority=0 providesca=2
Jul  4 00:37:06 dvb vdr: [22246] GetDevice(2) device #0 SELECTED imp=116202 
Jul  4 00:37:06 dvb vdr: [22246] GetDevice(1) device #1 imp=146202 ndr=0 isreceiving=0 isactual=1 isprimary=0 hasdecoder=0 devprio=-1 Priority=0 providesca=2 
Jul  4 00:37:06 dvb vdr: [22246] Streamdev: Setting data connection to 10.0.2.10:48025

How could I adapt GetDevice so that the second vdr would use the same
card ? (bbc1 and bbc2 are on the same transponder)

Because if i start a recording or the http client on itv1, one transfer
mode is interrupted. It's obviously not what i want. I would have
expected bbc1 and bbc2 to be handled by only one card letting the
other one free for something else.



in cDevice::GetDevice (device.c):
         imp <<= 1; imp |= !device[i]->Receiving() || ndr;
could this be replaced by:
         imp |= ndr;

are there cases where ndr is True and device[i]->Receiving() is false ?
if device[i]->Receiving() and ndr is false i guess that would mean
this device should be selected. (and maybe imp shouldn't be increased
in that case)

or/and what could i change in:
         imp <<= 1; imp |= device[i] == ActualDevice();
so that it doesn't increase imp if ActualDevice also provides the
desired channel ?
(or maybe this test could be skipped in that case ?)


another ex:
for a reason or another, 1st vdr tunes to bbc1 and uses first dvd card
(the ff one)
then second vdr wants to tune to bbc1 as well: unfortunatly the
selected device is not the first one but the second one because it
doesn't have a decoder. (and imp is unconditionnaly increased when the
card has a decoder)


I understand selecting the appropriate device is not that quite
simple.
Is there a way to make this selection more modular and add a new
setting to select between different GetDevice behabiors ?

-- 


[Index of Archives]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Util Linux NG]     [Xfree86]     [Big List of Linux Books]     [Fedora Users]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux