Mailing List archive

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

[vdr] Re: second language is not recorded



Klaus Schmidinger wrote:
André Weidemann wrote:

Klaus Schmidinger wrote:

André Weidemann wrote:


Klaus Schmidinger wrote:



Check your log file ...

Klaus


Taking a look at the log files I can see the pids being changed:

Aug 24 23:19:59 video vdr[1586]: changing pids of channel 59 from
2047+2047:2048=deu:0 to 2047+2047:2048=deu,2049=deu:0

But I cannot see the recording beeing restarted.

This code in VDR/vdr.c is supposed to do this in the call to
cRecordControls::ChannelDataModified(Channel):

       // Handle channel modifications:
       if (!Channels.BeingEdited() && Channels.Modified()) {
          if (Channels.Lock(false, 100)) {
             Channels.Save(); //XXX only after user changes???
             Timers.Save();
             for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
                 if (Channel->Modification(CHANNELMOD_RETUNE)) {
                    cRecordControls::ChannelDataModified(Channel);
                    if (Channel->Number() == cDevice::CurrentChannel()) {
                       if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) {
                          if (cDevice::ActualDevice()->ProvidesTransponder(Channel)) { // avoids retune on devices that don't really access the transponder
                             isyslog("retuning due to modification of channel %d", Channel->Number());
                             Channels.SwitchTo(Channel->Number());
                             }
                          }
                       }
                    }
                 }
             Channels.Unlock();
             }
          }

You could add some debug output here to see what's going wrong.



PS: I can send you the logs if you like to.

Well, if there is no entry like

 stopping recording due to modification of channel ...

apparently the above code didn't do what it's supposed to.
I don't think I would see anything else in the logs...

Klaus


I dug a little bit more today to figure out the cause of the problem.

And I belive that this method in device.c is causing it:

bool cDevice::ProvidesTransponder(const cChannel *Channel) const
{
  return false;
}

So this line:
"if  (cDevice::ActualDevice()->ProvidesTransponder(Channel)) {"
in vdr.c makes no sense at all.

Is this ment to be so or is the method ProvidesTransponder(const
cChannel *Channel) still to be written?

That function makes a lot of sense, and it _is_ implemented:

bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
{
  return ProvidesSource(Channel->Source()) && ((Channel->Source() & cSource::st_Mask) != cSource::stSat || Diseqcs.Get(Channel->Source(), Channel->Frequency(), Channel->Polarization()));
}

Is your "actual device" a cDvbDevice, or is it some other device you
or somebody else has implemented?

Anyway, the function call in VDR/vdr.c only has a meaning for live
viewing. Take a look at cRecordControls::ChannelDataModified(), where
channel modifications during recordings are handled.

Klaus


I took a look into cRecordControls::ChannelDataModified(cChannel *Channel).

The last if statement "if (RecordControls[i]->Device()->ProvidesTransponder(Channel))" is never true, which made me look into cDvbDevice::ProvidesTransponder(cChannel *Channel).
The return line is pretty long and from what I have seen is always false at the time the language change occurs.

Here are the values at the time of the language change:
Channel->Source(): 35008
Channel->Source() & cSource::st_Mask: 32768
Diseqcs.Get(...)==NULL (since p==NULL inside Diseqcs.Get() )


The return-line inside cDvbDevice::ProvidesTransponder now looks as follows:
return ProvidesSource(35008) && ((32768)!=32768 || NULL);

André.






Home | Main Index | Thread Index