1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Implemented DVB-T support; Removed the range limits for the Frequency and Srate parameters of channel definitions

This commit is contained in:
Klaus Schmidinger 2001-11-24 11:42:43 +01:00
parent 916fc0762b
commit 01bff47d1c
8 changed files with 82 additions and 69 deletions

View File

@ -59,6 +59,7 @@ Deti Fliegl <deti@fliegl.de>
Dave Chapman <dave@dchapman.com> Dave Chapman <dave@dchapman.com>
for implementing support for the teletext PID for implementing support for the teletext PID
for his great support in switching to the NAPI for his great support in switching to the NAPI
for implementing DVB-T support
Hans-Peter Raschke <Hans-Peter.Raschke@Wintermann-DatenService.de> Hans-Peter Raschke <Hans-Peter.Raschke@Wintermann-DatenService.de>
for his support in adapting VDR to DVB-C for his support in adapting VDR to DVB-C

10
FORMATS
View File

@ -20,10 +20,10 @@ Video Disk Recorder File Formats
- Name: the channel's name (if the name originally contains a ':' character - Name: the channel's name (if the name originally contains a ':' character
it has to be replaced by '|') it has to be replaced by '|')
- Frequency in MHz (as an integer) - Frequency in MHz for DVB-S and DVB-C, kHz for DVB-T (as an integer)
- Polarization (one of 'h', 'H', 'v', 'V') ** - Polarization (one of 'h', 'H', 'v', 'V') **
- Diseqc number ** - Diseqc number **
- Symbol rate - Symbol rate ***
- Video PID - Video PID
- Audio PID (either one number, or two, separated by a comma) - Audio PID (either one number, or two, separated by a comma)
If this channel also carries Dolby Digital sound, the Dolby PIDs follow If this channel also carries Dolby Digital sound, the Dolby PIDs follow
@ -33,8 +33,10 @@ Video Disk Recorder File Formats
DVB card, 2 = can be decrypted by the second DVB card) DVB card, 2 = can be decrypted by the second DVB card)
- Program Number - Program Number
Fields marked with ** are only meaningful for DVB-S (satellite) receivers. Fields marked with ** are only meaningful for DVB-S receivers.
DVB-C receivers simply ignore these. DVB-C and DVB-T receivers simply ignore these.
Fields marked with *** are only meaningful for DVB-S and DVB-C receivers.
DVB-T receivers simply ignore these.
* timers.conf * timers.conf

View File

@ -866,9 +866,12 @@ Video Disk Recorder Revision History
- The device /dev/video is now opened only if necessary (to GRAB an image), - The device /dev/video is now opened only if necessary (to GRAB an image),
allowing other programs (like 'kvdr', for instance) to use that device. allowing other programs (like 'kvdr', for instance) to use that device.
2001-11-10: Version 0.9.9 2001-11-24: Version 0.9.9
- Changed version numbering scheme. - Changed version numbering scheme.
- Fixed several channel definitions in 'channels.conf' (thanks to Thilo - Fixed several channel definitions in 'channels.conf' (thanks to Thilo
Wunderlich). Wunderlich).
- Added MPEG audio support for DVD (thanks to Andreas Schultz). - Added MPEG audio support for DVD (thanks to Andreas Schultz).
- Implemented DVB-T support (thanks to Dave Chapman).
- Removed the range limits for the Frequency and Srate parameters of channel
definitions.

25
INSTALL
View File

@ -334,16 +334,23 @@ accessed using DiSEqC, you have to go to the "Setup" menu and set the "DiSEqC"
parameter to "on". Also check the "DiSEqC" parameters for the various channels parameter to "on". Also check the "DiSEqC" parameters for the various channels
and set them to the necessary values. and set them to the necessary values.
Running VDR with DVB-C (cable): Running VDR with DVB-C (cable) or DVB-T (terrestrial):
------------------------------- ------------------------------------------------------
VDR automatically recognizes if the DVB card in use is a cable card. VDR automatically recognizes if the DVB card in use is a cable or a
The only things that needs to be different when using digital cable terrestrial card. The only thing that needs to be different when using digital
is the 'channels.conf' file. The distribution archive contains a default cable or terrestrial reception is the 'channels.conf' file. The distribution
'channels.conf.cable', which cable users can rename or copy to 'channels.conf' archive contains a default 'channels.conf.cable' and 'channels.conf.terr',
in order to receive cable channels. The format of this file is exactly the respectively, which users of such cards can rename or copy to 'channels.conf'
same as for satellite channels (the fields containing "Polarization" and in order to receive digital cable or terrestrial channels. The format of these
"Diseqc" data are ignored in case of DVB-C). files is exactly the same as for satellite channels (the fields containing
"Polarization" and "Diseqc" data are ignored in case of DVB-C and DVB-T, and
the "Frequency" is in kHz in case of DVB-T).
You can even use a mixture of DVB-S, DVB-C and DVB-T cards in the same system.
All you need to do is to put all the channel definitions into one big
'channels.conf' file and set the 'Ca' parameter of each channel to the number
of the card that can receive it.
Learning the remote control keys: Learning the remote control keys:
--------------------------------- ---------------------------------

11
channels.conf.terr Normal file
View File

@ -0,0 +1,11 @@
: UK channels
BBC ONE:505833:0:0:0:600:601:0:0:4164
BBC TWO:505833:0:0:0:610:611:0:0:4228
ITV 1:481833:0:0:0:512:650:0:0:8261
Channel 4:481833:0:0:0:2827:2828:0:0:8384
Channel 5:561833:0:0:0:6017:6018:0:0:12866
ITV 2:481833:0:0:0:2818:2819:0:0:8325
BBC CHOICE:505833:0:0:0:620:621:0:0:4351
BBC NEWS 24:505833:0:0:0:640:641:0:0:4415
BBC Knowledge:505833:0:0:0:630:631:0:0:4607
Shop!:561833:0:0:0:6049:6050:0:0:13120

View File

@ -7,7 +7,7 @@
* DVD support initially written by Andreas Schultz <aschultz@warp10.net> * DVD support initially written by Andreas Schultz <aschultz@warp10.net>
* based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si> * based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si>
* *
* $Id: dvbapi.c 1.138 2001/11/10 13:35:22 kls Exp $ * $Id: dvbapi.c 1.139 2001/11/24 11:03:01 kls Exp $
*/ */
//#define DVDDEBUG 1 //#define DVDDEBUG 1
@ -3068,7 +3068,7 @@ bool cDvbApi::SetPids(bool ForRecording)
SetDpid2(ForRecording ? dPid2 : 0, DMX_OUT_TS_TAP); SetDpid2(ForRecording ? dPid2 : 0, DMX_OUT_TS_TAP);
} }
eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid1, int Apid2, int Dpid1, int Dpid2, int Tpid, int Ca, int Pnr) eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int Frequency, char Polarization, int Diseqc, int Srate, int Vpid, int Apid1, int Apid2, int Dpid1, int Dpid2, int Tpid, int Ca, int Pnr)
{ {
// Make sure the siProcessor won't access the device while switching // Make sure the siProcessor won't access the device while switching
cThreadLock ThreadLock(siProcessor); cThreadLock ThreadLock(siProcessor);
@ -3110,14 +3110,14 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
SetDpid2(0x1FFF, DMX_OUT_DECODER); SetDpid2(0x1FFF, DMX_OUT_DECODER);
SetTpid( 0x1FFF, DMX_OUT_DECODER); SetTpid( 0x1FFF, DMX_OUT_DECODER);
bool ChannelSynced = false; FrontendParameters Frontend;
switch (frontendType) { switch (frontendType) {
case FE_QPSK: { // DVB-S case FE_QPSK: { // DVB-S
// Frequency offsets: // Frequency offsets:
unsigned int freq = FrequencyMHz; unsigned int freq = Frequency;
int tone = SEC_TONE_OFF; int tone = SEC_TONE_OFF;
if (freq < (unsigned int)Setup.LnbSLOF) { if (freq < (unsigned int)Setup.LnbSLOF) {
@ -3129,7 +3129,6 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
tone = SEC_TONE_ON; tone = SEC_TONE_ON;
} }
FrontendParameters Frontend;
Frontend.Frequency = freq * 1000UL; Frontend.Frequency = freq * 1000UL;
Frontend.Inversion = INVERSION_AUTO; Frontend.Inversion = INVERSION_AUTO;
Frontend.u.qpsk.SymbolRate = Srate * 1000UL; Frontend.u.qpsk.SymbolRate = Srate * 1000UL;
@ -3154,58 +3153,32 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
scmds.commands = &scmd; scmds.commands = &scmd;
CHECK(ioctl(fd_sec, SEC_SEND_SEQUENCE, &scmds)); CHECK(ioctl(fd_sec, SEC_SEND_SEQUENCE, &scmds));
// Tuning:
CHECK(ioctl(fd_frontend, FE_SET_FRONTEND, &Frontend));
// Wait for channel sync:
if (cFile::FileReady(fd_frontend, 5000)) {
FrontendEvent event;
int res = ioctl(fd_frontend, FE_GET_EVENT, &event);
if (res >= 0)
ChannelSynced = event.type == FE_COMPLETION_EV;
else
esyslog(LOG_ERR, "ERROR %d in frontend get event", res);
}
else
esyslog(LOG_ERR, "ERROR: timeout while tuning");
} }
break; break;
case FE_QAM: { // DVB-C case FE_QAM: { // DVB-C
// Frequency and symbol rate: // Frequency and symbol rate:
FrontendParameters Frontend; Frontend.Frequency = Frequency * 1000000UL;
Frontend.Frequency = FrequencyMHz * 1000000UL;
Frontend.Inversion = INVERSION_AUTO; Frontend.Inversion = INVERSION_AUTO;
Frontend.u.qam.SymbolRate = Srate * 1000UL; Frontend.u.qam.SymbolRate = Srate * 1000UL;
Frontend.u.qam.FEC_inner = FEC_AUTO; Frontend.u.qam.FEC_inner = FEC_AUTO;
Frontend.u.qam.QAM = QAM_64; Frontend.u.qam.QAM = QAM_64;
// Tuning:
CHECK(ioctl(fd_frontend, FE_SET_FRONTEND, &Frontend));
// Wait for channel sync:
if (cFile::FileReady(fd_frontend, 5000)) {
FrontendEvent event;
int res = ioctl(fd_frontend, FE_GET_EVENT, &event);
if (res >= 0)
ChannelSynced = event.type == FE_COMPLETION_EV;
else
esyslog(LOG_ERR, "ERROR %d in frontend get event", res);
}
else
esyslog(LOG_ERR, "ERROR: timeout while tuning");
} }
break; break;
case FE_OFDM: { // DVB-T case FE_OFDM: { // DVB-T
//XXX TODO: implement DVB-T tuning (anybody with a DVB-T card out there?)
esyslog(LOG_ERR, "ERROR: DVB-T tuning support not yet implemented"); // Frequency and OFDM paramaters:
return scrFailed;
Frontend.Frequency = Frequency * 1000UL;
Frontend.Inversion = INVERSION_AUTO;
Frontend.u.ofdm.bandWidth=BANDWIDTH_8_MHZ;
Frontend.u.ofdm.HP_CodeRate=FEC_2_3;
Frontend.u.ofdm.LP_CodeRate=FEC_1_2;
Frontend.u.ofdm.Constellation=QAM_64;
Frontend.u.ofdm.TransmissionMode=TRANSMISSION_MODE_2K;
Frontend.u.ofdm.guardInterval=GUARD_INTERVAL_1_32;
Frontend.u.ofdm.HierarchyInformation=HIERARCHY_NONE;
} }
break; break;
default: default:
@ -3213,12 +3186,28 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
return scrFailed; return scrFailed;
} }
if (!ChannelSynced) { // Tuning:
esyslog(LOG_ERR, "ERROR: channel %d not sync'ed on DVB card %d!", ChannelNumber, CardIndex() + 1);
if (this == PrimaryDvbApi) CHECK(ioctl(fd_frontend, FE_SET_FRONTEND, &Frontend));
cThread::RaisePanic();
return scrFailed; // Wait for channel sync:
if (cFile::FileReady(fd_frontend, 5000)) {
FrontendEvent event;
int res = ioctl(fd_frontend, FE_GET_EVENT, &event);
if (res >= 0) {
if (event.type != FE_COMPLETION_EV) {
esyslog(LOG_ERR, "ERROR: channel %d not sync'ed on DVB card %d!", ChannelNumber, CardIndex() + 1);
if (this == PrimaryDvbApi)
cThread::RaisePanic();
return scrFailed;
}
}
else
esyslog(LOG_ERR, "ERROR %d in frontend get event", res);
} }
else
esyslog(LOG_ERR, "ERROR: timeout while tuning");
// PID settings: // PID settings:
@ -3242,7 +3231,7 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
if (NeedsTransferMode) { if (NeedsTransferMode) {
cDvbApi *CaDvbApi = GetDvbApi(Ca, 0); cDvbApi *CaDvbApi = GetDvbApi(Ca, 0);
if (CaDvbApi && !CaDvbApi->Recording()) { if (CaDvbApi && !CaDvbApi->Recording()) {
if ((Result = CaDvbApi->SetChannel(ChannelNumber, FrequencyMHz, Polarization, Diseqc, Srate, Vpid, Apid1, Apid2, Dpid1, Dpid2, Tpid, Ca, Pnr)) == scrOk) { if ((Result = CaDvbApi->SetChannel(ChannelNumber, Frequency, Polarization, Diseqc, Srate, Vpid, Apid1, Apid2, Dpid1, Dpid2, Tpid, Ca, Pnr)) == scrOk) {
SetModeReplay(); SetModeReplay();
transferringFromDvbApi = CaDvbApi->StartTransfer(fd_video); transferringFromDvbApi = CaDvbApi->StartTransfer(fd_video);
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbapi.h 1.58 2001/11/04 11:39:42 kls Exp $ * $Id: dvbapi.h 1.59 2001/11/24 11:03:16 kls Exp $
*/ */
#ifndef __DVBAPI_H #ifndef __DVBAPI_H
@ -187,7 +187,7 @@ public:
private: private:
int currentChannel; int currentChannel;
public: public:
eSetChannelResult SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid1, int Apid2, int Dpid1, int Dpid2, int Tpid, int Ca, int Pnr); eSetChannelResult SetChannel(int ChannelNumber, int Frequency, char Polarization, int Diseqc, int Srate, int Vpid, int Apid1, int Apid2, int Dpid1, int Dpid2, int Tpid, int Ca, int Pnr);
static int CurrentChannel(void) { return PrimaryDvbApi ? PrimaryDvbApi->currentChannel : 0; } static int CurrentChannel(void) { return PrimaryDvbApi ? PrimaryDvbApi->currentChannel : 0; }
int Channel(void) { return currentChannel; } int Channel(void) { return currentChannel; }

6
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menu.c 1.139 2001/11/04 10:37:18 kls Exp $ * $Id: menu.c 1.140 2001/11/24 11:16:31 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -546,10 +546,10 @@ cMenuEditChannel::cMenuEditChannel(int Index)
if (channel) { if (channel) {
data = *channel; data = *channel;
Add(new cMenuEditStrItem( tr("Name"), data.name, sizeof(data.name), FileNameChars)); Add(new cMenuEditStrItem( tr("Name"), data.name, sizeof(data.name), FileNameChars));
Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency, 10000, 13000)); //TODO exact limits??? Add(new cMenuEditIntItem( tr("Frequency"), &data.frequency));
Add(new cMenuEditChrItem( tr("Polarization"), &data.polarization, "hv")); Add(new cMenuEditChrItem( tr("Polarization"), &data.polarization, "hv"));
Add(new cMenuEditIntItem( tr("DiSEqC"), &data.diseqc, 0, 10)); //TODO exact limits??? Add(new cMenuEditIntItem( tr("DiSEqC"), &data.diseqc, 0, 10)); //TODO exact limits???
Add(new cMenuEditIntItem( tr("Srate"), &data.srate, 22000, 30000)); //TODO exact limits - toggle??? Add(new cMenuEditIntItem( tr("Srate"), &data.srate));
Add(new cMenuEditIntItem( tr("Vpid"), &data.vpid, 0, 0xFFFE)); Add(new cMenuEditIntItem( tr("Vpid"), &data.vpid, 0, 0xFFFE));
Add(new cMenuEditIntItem( tr("Apid1"), &data.apid1, 0, 0xFFFE)); Add(new cMenuEditIntItem( tr("Apid1"), &data.apid1, 0, 0xFFFE));
Add(new cMenuEditIntItem( tr("Apid2"), &data.apid2, 0, 0xFFFE)); Add(new cMenuEditIntItem( tr("Apid2"), &data.apid2, 0, 0xFFFE));