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:
parent
916fc0762b
commit
01bff47d1c
@ -59,6 +59,7 @@ Deti Fliegl <deti@fliegl.de>
|
||||
Dave Chapman <dave@dchapman.com>
|
||||
for implementing support for the teletext PID
|
||||
for his great support in switching to the NAPI
|
||||
for implementing DVB-T support
|
||||
|
||||
Hans-Peter Raschke <Hans-Peter.Raschke@Wintermann-DatenService.de>
|
||||
for his support in adapting VDR to DVB-C
|
||||
|
10
FORMATS
10
FORMATS
@ -20,10 +20,10 @@ Video Disk Recorder File Formats
|
||||
|
||||
- Name: the channel's name (if the name originally contains a ':' character
|
||||
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') **
|
||||
- Diseqc number **
|
||||
- Symbol rate
|
||||
- Symbol rate ***
|
||||
- Video PID
|
||||
- Audio PID (either one number, or two, separated by a comma)
|
||||
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)
|
||||
- Program Number
|
||||
|
||||
Fields marked with ** are only meaningful for DVB-S (satellite) receivers.
|
||||
DVB-C receivers simply ignore these.
|
||||
Fields marked with ** are only meaningful for DVB-S receivers.
|
||||
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
|
||||
|
||||
|
5
HISTORY
5
HISTORY
@ -866,9 +866,12 @@ Video Disk Recorder Revision History
|
||||
- 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.
|
||||
|
||||
2001-11-10: Version 0.9.9
|
||||
2001-11-24: Version 0.9.9
|
||||
|
||||
- Changed version numbering scheme.
|
||||
- Fixed several channel definitions in 'channels.conf' (thanks to Thilo
|
||||
Wunderlich).
|
||||
- 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
25
INSTALL
@ -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
|
||||
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.
|
||||
The only things that needs to be different when using digital cable
|
||||
is the 'channels.conf' file. The distribution archive contains a default
|
||||
'channels.conf.cable', which cable users can rename or copy to 'channels.conf'
|
||||
in order to receive cable channels. The format of this file is exactly the
|
||||
same as for satellite channels (the fields containing "Polarization" and
|
||||
"Diseqc" data are ignored in case of DVB-C).
|
||||
VDR automatically recognizes if the DVB card in use is a cable or a
|
||||
terrestrial card. The only thing that needs to be different when using digital
|
||||
cable or terrestrial reception is the 'channels.conf' file. The distribution
|
||||
archive contains a default 'channels.conf.cable' and 'channels.conf.terr',
|
||||
respectively, which users of such cards can rename or copy to 'channels.conf'
|
||||
in order to receive digital cable or terrestrial channels. The format of these
|
||||
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:
|
||||
---------------------------------
|
||||
|
11
channels.conf.terr
Normal file
11
channels.conf.terr
Normal 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
|
89
dvbapi.c
89
dvbapi.c
@ -7,7 +7,7 @@
|
||||
* DVD support initially written by Andreas Schultz <aschultz@warp10.net>
|
||||
* 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
|
||||
@ -3068,7 +3068,7 @@ bool cDvbApi::SetPids(bool ForRecording)
|
||||
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
|
||||
cThreadLock ThreadLock(siProcessor);
|
||||
@ -3110,14 +3110,14 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
|
||||
SetDpid2(0x1FFF, DMX_OUT_DECODER);
|
||||
SetTpid( 0x1FFF, DMX_OUT_DECODER);
|
||||
|
||||
bool ChannelSynced = false;
|
||||
FrontendParameters Frontend;
|
||||
|
||||
switch (frontendType) {
|
||||
case FE_QPSK: { // DVB-S
|
||||
|
||||
// Frequency offsets:
|
||||
|
||||
unsigned int freq = FrequencyMHz;
|
||||
unsigned int freq = Frequency;
|
||||
int tone = SEC_TONE_OFF;
|
||||
|
||||
if (freq < (unsigned int)Setup.LnbSLOF) {
|
||||
@ -3129,7 +3129,6 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
|
||||
tone = SEC_TONE_ON;
|
||||
}
|
||||
|
||||
FrontendParameters Frontend;
|
||||
Frontend.Frequency = freq * 1000UL;
|
||||
Frontend.Inversion = INVERSION_AUTO;
|
||||
Frontend.u.qpsk.SymbolRate = Srate * 1000UL;
|
||||
@ -3154,58 +3153,32 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
|
||||
scmds.commands = &scmd;
|
||||
|
||||
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;
|
||||
case FE_QAM: { // DVB-C
|
||||
|
||||
// Frequency and symbol rate:
|
||||
|
||||
FrontendParameters Frontend;
|
||||
Frontend.Frequency = FrequencyMHz * 1000000UL;
|
||||
Frontend.Frequency = Frequency * 1000000UL;
|
||||
Frontend.Inversion = INVERSION_AUTO;
|
||||
Frontend.u.qam.SymbolRate = Srate * 1000UL;
|
||||
Frontend.u.qam.FEC_inner = FEC_AUTO;
|
||||
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;
|
||||
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");
|
||||
return scrFailed;
|
||||
|
||||
// Frequency and OFDM paramaters:
|
||||
|
||||
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;
|
||||
default:
|
||||
@ -3213,12 +3186,28 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
|
||||
return scrFailed;
|
||||
}
|
||||
|
||||
if (!ChannelSynced) {
|
||||
esyslog(LOG_ERR, "ERROR: channel %d not sync'ed on DVB card %d!", ChannelNumber, CardIndex() + 1);
|
||||
if (this == PrimaryDvbApi)
|
||||
cThread::RaisePanic();
|
||||
return scrFailed;
|
||||
// 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) {
|
||||
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:
|
||||
|
||||
@ -3242,7 +3231,7 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char
|
||||
if (NeedsTransferMode) {
|
||||
cDvbApi *CaDvbApi = GetDvbApi(Ca, 0);
|
||||
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();
|
||||
transferringFromDvbApi = CaDvbApi->StartTransfer(fd_video);
|
||||
}
|
||||
|
4
dvbapi.h
4
dvbapi.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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
|
||||
@ -187,7 +187,7 @@ public:
|
||||
private:
|
||||
int currentChannel;
|
||||
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; }
|
||||
int Channel(void) { return currentChannel; }
|
||||
|
||||
|
6
menu.c
6
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -546,10 +546,10 @@ cMenuEditChannel::cMenuEditChannel(int Index)
|
||||
if (channel) {
|
||||
data = *channel;
|
||||
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 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("Apid1"), &data.apid1, 0, 0xFFFE));
|
||||
Add(new cMenuEditIntItem( tr("Apid2"), &data.apid2, 0, 0xFFFE));
|
||||
|
Loading…
Reference in New Issue
Block a user