Hi, ShorTie schrieb: > I tried to add the ‘{‘ in after the S2 and leave the removed 1 in but it > wouldn’t compile, (figured that be too easy). Seems like my instructions were not clear enough. The attached patch contains the mentioned modifications. Compiles here with some cheats. No further tests run. Bye. -- Dipl.-Inform. (FH) Reinhard Nissl mailto:rnissl@xxxxxx
diff -Nurp ../vdr-1.5.12-orig/channels.c ./channels.c --- ../vdr-1.5.12-orig/channels.c 2007-10-12 16:40:53.000000000 +0200 +++ ./channels.c 2007-11-28 21:08:49.000000000 +0100 @@ -50,12 +50,21 @@ const tChannelParameterMap CoderateValue }; const tChannelParameterMap ModulationValues[] = { + { 0, MOD_QPSK }, { 0, QPSK }, + { 8, MOD_8PSK }, + { 16, MOD_QAM_16 }, { 16, QAM_16 }, + { 32, MOD_QAM_32 }, { 32, QAM_32 }, + { 64, MOD_QAM_64 }, { 64, QAM_64 }, + { 128, MOD_QAM_128 }, { 128, QAM_128 }, + { 256, MOD_QAM_256 }, { 256, QAM_256 }, + { 512, MOD_BPSK }, + { 999, MOD_QAM_AUTO }, { 999, QAM_AUTO }, { -1 } }; @@ -171,7 +180,7 @@ cChannel::cChannel(void) bandwidth = BANDWIDTH_AUTO; coderateH = FEC_AUTO; coderateL = FEC_AUTO; - modulation = QAM_AUTO; + modulation = QPSK; transmission = TRANSMISSION_MODE_AUTO; guard = GUARD_INTERVAL_AUTO; hierarchy = HIERARCHY_AUTO; @@ -283,7 +292,7 @@ void cChannel::CopyTransponderData(const } } -bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH) +bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation) { // Workarounds for broadcaster stupidity: // Some providers broadcast the transponder frequency of their channels with two different @@ -297,7 +306,7 @@ bool cChannel::SetSatTransponderData(int if (abs(srate - Srate) <= 1) Srate = srate; - if (source != Source || frequency != Frequency || polarization != Polarization || srate != Srate || coderateH != CoderateH) { + if (source != Source || frequency != Frequency || polarization != Polarization || srate != Srate || coderateH != CoderateH || modulation != Modulation) { if (Number()) { dsyslog("changing transponder data of channel %d from %s:%d:%c:%d:%d to %s:%d:%c:%d:%d", Number(), *cSource::ToString(source), frequency, polarization, srate, coderateH, *cSource::ToString(Source), Frequency, Polarization, Srate, CoderateH); modification |= CHANNELMOD_TRANSP; @@ -308,7 +317,7 @@ bool cChannel::SetSatTransponderData(int polarization = Polarization; srate = Srate; coderateH = CoderateH; - modulation = QPSK; + modulation = Modulation; schedule = NULL; } return true; @@ -600,7 +609,7 @@ cString cChannel::ParametersToString(voi ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues)); ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues)); ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues)); - ST("C T") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues)); + ST("CST") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues)); ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues)); ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues)); ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues)); diff -Nurp ../vdr-1.5.12-orig/channels.h ./channels.h --- ../vdr-1.5.12-orig/channels.h 2007-09-02 12:23:11.000000000 +0200 +++ ./channels.h 2007-11-28 21:06:25.000000000 +0100 @@ -206,7 +206,7 @@ public: bool HasTimer(void) const; int Modification(int Mask = CHANNELMOD_ALL); void CopyTransponderData(const cChannel *Channel); - bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH); + bool SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation); bool SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH); bool SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CodeRateH, int CodeRateL, int Guard, int Transmission); void SetId(int Nid, int Tid, int Sid, int Rid = 0); diff -Nurp ../vdr-1.5.12-orig/dvbdevice.c ./dvbdevice.c --- ../vdr-1.5.12-orig/dvbdevice.c 2007-10-14 14:56:03.000000000 +0200 +++ ./dvbdevice.c 2007-11-28 21:27:22.000000000 +0100 @@ -104,7 +104,7 @@ cDvbTuner::cDvbTuner(int Fd_Frontend, in lastTimeoutReport = 0; diseqcCommands = NULL; tunerStatus = tsIdle; - if (frontendType == FE_QPSK) + if (frontendType == FE_QPSK || frontendType == FE_DVB_S || frontendType == FE_DVB_S2) CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // must explicitly turn on LNB power SetDescription("tuner on device %d", cardIndex + 1); Start(); @@ -173,13 +173,14 @@ static unsigned int FrequencyToHz(unsign bool cDvbTuner::SetFrontend(void) { - dvb_frontend_parameters Frontend; + dvb_frontend_parameters_new Frontend; memset(&Frontend, 0, sizeof(Frontend)); switch (frontendType) { - case FE_QPSK: { // DVB-S - + case FE_QPSK: // DVB-S + case FE_DVB_S: // DVB-S + case FE_DVB_S2: { // DVB-S unsigned int frequency = channel.Frequency(); if (Setup.DiSEqC) { @@ -237,8 +238,14 @@ bool cDvbTuner::SetFrontend(void) frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF Frontend.frequency = frequency * 1000UL; Frontend.inversion = fe_spectral_inversion_t(channel.Inversion()); - Frontend.u.qpsk.symbol_rate = channel.Srate() * 1000UL; - Frontend.u.qpsk.fec_inner = fe_code_rate_t(channel.CoderateH()); + if (frontendType == FE_DVB_S2) { + Frontend.u.qpsk2.symbol_rate = channel.Srate() * 1000UL; + Frontend.u.qpsk2.fec_inner = fe_code_rate_t(channel.CoderateH()); + Frontend.u.qpsk2.modulation = fe_modulation_t(channel.Modulation()); + } else { + Frontend.u.qpsk.symbol_rate = channel.Srate() * 1000UL; + Frontend.u.qpsk.fec_inner = fe_code_rate_t(channel.CoderateH()); + } tuneTimeout = DVBS_TUNE_TIMEOUT; lockTimeout = DVBS_LOCK_TIMEOUT; @@ -280,10 +287,17 @@ bool cDvbTuner::SetFrontend(void) esyslog("ERROR: attempt to set channel with unknown DVB frontend type"); return false; } - if (ioctl(fd_frontend, FE_SET_FRONTEND, &Frontend) < 0) { - esyslog("ERROR: frontend %d: %m", cardIndex); - return false; + if (frontendType == FE_DVB_S2) { + if (ioctl(fd_frontend, FE_SET_FRONTEND2, &Frontend) == -1) { + esyslog("ERROR: frontend %d: %m", cardIndex); + return false; + } + } else { + if (ioctl(fd_frontend, FE_SET_FRONTEND, &Frontend) == -1) { + esyslog("ERROR: frontend %d: %m", cardIndex); + return false; } + } return true; } @@ -419,7 +433,16 @@ cDvbDevice::cDvbDevice(int n) if (fd_frontend >= 0) { dvb_frontend_info feinfo; if (ioctl(fd_frontend, FE_GET_INFO, &feinfo) >= 0) { - frontendType = feinfo.type; + frontendType = feinfo.type; + if ( ((feinfo.type == FE_QPSK) || (feinfo.type == FE_DVB_S2)) && (feinfo.caps & FE_HAS_EXTENDED_INFO) ) { + dvb_fe_caps_extended feextinfo; + if (ioctl(fd_frontend, FE_GET_EXTENDED_INFO, &feextinfo) >= 0) { + if (feextinfo.standards & FE_DVB_S2) { + CHECK(ioctl(fd_frontend, FE_SET_STANDARD, FE_DVB_S2)); + frontendType = FE_DVB_S2; + } + } + } dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType); } else @@ -745,6 +768,8 @@ bool cDvbDevice::ProvidesSource(int Sour return type == cSource::stNone || type == cSource::stCable && frontendType == FE_QAM || type == cSource::stSat && frontendType == FE_QPSK + || type == cSource::stSat && frontendType == FE_DVB_S + || type == cSource::stSat && frontendType == FE_DVB_S2 || type == cSource::stTerr && frontendType == FE_OFDM; } diff -Nurp ../vdr-1.5.12-orig/nit.c ./nit.c --- ../vdr-1.5.12-orig/nit.c 2007-08-17 16:02:45.000000000 +0200 +++ ./nit.c 2007-11-28 21:24:11.000000000 +0100 @@ -129,6 +129,8 @@ void cNitFilter::Process(u_short Pid, u_ char Polarization = Polarizations[sd->getPolarization()]; static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE }; int CodeRate = CodeRates[sd->getFecInner()]; + static int Modulations[] = { MOD_QPSK, QPSK, MOD_QAM_16, QAM_16, MOD_QAM_32, QAM_32, MOD_QAM_64, QAM_64, MOD_QAM_128, QAM_128, MOD_QAM_256, QAM_256, MOD_QAM_AUTO, QAM_AUTO, MOD_BPSK, MOD_8PSK }; + int Modulation = Modulations[min(sd->getModulationType(), 15)]; int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10; if (ThisNIT >= 0) { for (int n = 0; n < NumFrequencies; n++) { @@ -154,7 +156,7 @@ void cNitFilter::Process(u_short Pid, u_ } } if (ISTRANSPONDER(cChannel::Transponder(Frequency, Polarization), Transponder())) // only modify channels if we're actually receiving this transponder - Channel->SetSatTransponderData(Source, Frequency, Polarization, SymbolRate, CodeRate); + Channel->SetSatTransponderData(Source, Frequency, Polarization, SymbolRate, CodeRate, Modulation); } found = true; } @@ -162,7 +164,7 @@ void cNitFilter::Process(u_short Pid, u_ for (int n = 0; n < NumFrequencies; n++) { cChannel *Channel = new cChannel; Channel->SetId(ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0); - if (Channel->SetSatTransponderData(Source, Frequencies[n], Polarization, SymbolRate, CodeRate)) + if (Channel->SetSatTransponderData(Source, Frequencies[n], Polarization, SymbolRate, CodeRate, Modulation)) EITScanner.AddTransponder(Channel); else delete Channel; @@ -178,8 +180,8 @@ void cNitFilter::Process(u_short Pid, u_ //XXX FEC_outer??? static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE }; int CodeRate = CodeRates[sd->getFecInner()]; - static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO }; - int Modulation = Modulations[min(sd->getModulation(), 6)]; + static int Modulations[] = { MOD_QPSK, MOD_8PSK, MOD_QAM_16, MOD_QAM_32, MOD_QAM_64, MOD_QAM_128, MOD_QAM_256, MOD_QAM_AUTO }; + int Modulation = Modulations[min(sd->getModulation(), 7)]; int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10; if (ThisNIT >= 0) { for (int n = 0; n < NumFrequencies; n++) {
_______________________________________________ vdr mailing list vdr@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr