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 grabbed a vanilla vdr.1.3.12 to make sure this did not come from any patches and as far as I can see the method ProvidesTransponder(const cChannel *Channel) does exist twice. One is in dvbdevice.c and the other is in device.c.

The method you are referring to is
"cDvbDevice::ProvidesTransponder(Channel)" but the one called in vdr.c just before retuning is
"cDevice::ActualDevice()->ProvidesTransponder(Channel)"

My C++ knowledge is less than existent, so please correct me if I'm wrong. From what I see those are two different methods and the one in device.c is always returning false.

André.





Home | Main Index | Thread Index