From patchwork Wed Nov 28 20:38:01 2007 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Reinhard Nissl X-Patchwork-Id: 12552 Received: from mail.gmx.net ([213.165.64.20]) by www.linuxtv.org with smtp (Exim 4.63) (envelope-from ) id 1IxTg1-00024T-GT for vdr@linuxtv.org; Wed, 28 Nov 2007 21:38:33 +0100 Received: (qmail invoked by alias); 28 Nov 2007 20:38:02 -0000 Received: from p5493257C.dip0.t-ipconnect.de (EHLO [192.168.101.15]) [84.147.37.124] by mail.gmx.net (mp054) with SMTP; 28 Nov 2007 21:38:02 +0100 X-Authenticated: #527675 X-Provags-ID: V01U2FsdGVkX18E7wFYET0ElyXJH9DCz2G+AEuFc3CsOvrou8YTb0 fxgYLsj3hmfvaZ Message-ID: <474DD1A9.8090805@gmx.de> Date: Wed, 28 Nov 2007 21:38:01 +0100 From: Reinhard Nissl User-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.6) Gecko/20070801 SUSE/2.0.0.6-22 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: VDR Mailing List References: <000001c831ca$fcade9f0$c820a8c0@daddy> In-Reply-To: <000001c831ca$fcade9f0$c820a8c0@daddy> X-Y-GMX-Trusted: 0 Subject: Re: [vdr] Genpix patch X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.9 Precedence: list Reply-To: VDR Mailing List List-Id: VDR Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Nov 2007 20:38:33 -0000 Status: O X-Status: X-Keywords: X-UID: 14754 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. 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++) {