summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2010-03-06 12:01:17 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2010-03-06 12:01:17 +0100
commitab9af4cea16b6d3875e60b7809c02f3b6794e6b4 (patch)
treec7f2d476e2d010372b1bb8bd94b36cd5d6f026dd
parent3e09f8565dde0e362549a1896352753483f6615c (diff)
downloadvdr-ab9af4cea16b6d3875e60b7809c02f3b6794e6b4.tar.gz
vdr-ab9af4cea16b6d3875e60b7809c02f3b6794e6b4.tar.bz2
Added support for ATSC devices
-rw-r--r--CONTRIBUTORS3
-rw-r--r--HISTORY4
-rw-r--r--channels.h3
-rw-r--r--dvbdevice.c62
-rw-r--r--pat.c25
-rw-r--r--sourceparams.c4
-rw-r--r--sources.conf4
-rw-r--r--sources.h4
-rw-r--r--vdr.55
9 files changed, 82 insertions, 32 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 4be78651..f4a44f91 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -2572,3 +2572,6 @@ Stephan Austermühle <au@hcsd.de>
Lars Hanisch <dvb@flensrocker.de>
for suggesting to assign the source character 'V' to "Analog Video"
+
+Alex Lasnier <alex@fepg.org>
+ for adding tuning support for ATSC devices
diff --git a/HISTORY b/HISTORY
index e43d1bde..48c3828c 100644
--- a/HISTORY
+++ b/HISTORY
@@ -6384,8 +6384,10 @@ Video Disk Recorder Revision History
tracks appear in the "Audio" menu. Dolby Digital is always recorded.
This obsoletes the DOLBYINREC patch.
-2010-03-05: Version 1.7.14
+2010-03-06: Version 1.7.14
- Fixed handling empty strings in cSource::FromString().
- Assigned the source character 'I' to "IPTV" (suggested by Rolf Ahrenberg).
- Assigned the source character 'V' to "Analog Video" (suggested by Lars Hanisch).
+- Added support for ATSC devices (thanks to Alex Lasnier).
+ This obsoletes the ATSC patch.
diff --git a/channels.h b/channels.h
index 4ed13582..98c71dfe 100644
--- a/channels.h
+++ b/channels.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: channels.h 2.8 2010/02/21 14:05:49 kls Exp $
+ * $Id: channels.h 2.9 2010/03/06 11:54:17 kls Exp $
*/
#ifndef __CHANNELS_H
@@ -172,6 +172,7 @@ public:
const char *Parameters(void) const { return parameters; }
const cLinkChannels* LinkChannels(void) const { return linkChannels; }
const cChannel *RefChannel(void) const { return refChannel; }
+ bool IsAtsc(void) const { return cSource::IsAtsc(source); }
bool IsCable(void) const { return cSource::IsCable(source); }
bool IsSat(void) const { return cSource::IsSat(source); }
bool IsTerr(void) const { return cSource::IsTerr(source); }
diff --git a/dvbdevice.c b/dvbdevice.c
index 73f5261c..be9407ac 100644
--- a/dvbdevice.c
+++ b/dvbdevice.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: dvbdevice.c 2.29 2010/02/21 17:10:35 kls Exp $
+ * $Id: dvbdevice.c 2.30 2010/03/06 11:07:05 kls Exp $
*/
#include "dvbdevice.h"
@@ -27,6 +27,8 @@
#define DVBC_LOCK_TIMEOUT 2000 //ms
#define DVBT_TUNE_TIMEOUT 9000 //ms
#define DVBT_LOCK_TIMEOUT 2000 //ms
+#define ATSC_TUNE_TIMEOUT 9000 //ms
+#define ATSC_LOCK_TIMEOUT 2000 //ms
// --- DVB Parameter Maps ----------------------------------------------------
@@ -184,17 +186,17 @@ cString cDvbTransponderParameters::ToString(char Type) const
char buffer[64];
char *q = buffer;
*q = 0;
- ST(" S ") q += sprintf(q, "%c", polarization);
- ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
- ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
- ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
- ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
- ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
- ST("CST") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
- ST(" S ") q += PrintParameter(q, 'O', MapToUser(rollOff, RollOffValues));
- ST(" S ") q += PrintParameter(q, 'S', MapToUser(system, SystemValues));
- ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
- ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
+ ST(" S ") q += sprintf(q, "%c", polarization);
+ ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
+ ST(" CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
+ ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
+ ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
+ ST("ACST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
+ ST("ACST") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
+ ST(" S ") q += PrintParameter(q, 'O', MapToUser(rollOff, RollOffValues));
+ ST(" S ") q += PrintParameter(q, 'S', MapToUser(system, SystemValues));
+ ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
+ ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
return buffer;
}
@@ -486,6 +488,16 @@ bool cDvbTuner::SetFrontend(void)
tuneTimeout = DVBT_TUNE_TIMEOUT;
lockTimeout = DVBT_LOCK_TIMEOUT;
}
+ else if (frontendType == SYS_ATSC) {
+ // ATSC
+ SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
+ SETCMD(DTV_FREQUENCY, FrequencyToHz(channel.Frequency()));
+ SETCMD(DTV_INVERSION, dtp.Inversion());
+ SETCMD(DTV_MODULATION, dtp.Modulation());
+
+ tuneTimeout = ATSC_TUNE_TIMEOUT;
+ lockTimeout = ATSC_LOCK_TIMEOUT;
+ }
else {
esyslog("ERROR: attempt to set channel with unknown DVB frontend type");
return false;
@@ -598,18 +610,18 @@ cOsdItem *cDvbSourceParam::GetOsdItem(void)
#undef ST
#define ST(s) if (strchr(s, type))
switch (param++) {
- case 0: ST(" S ") return new cMenuEditChrItem( tr("Polarization"), &dtp.polarization, "hvlr"); else return GetOsdItem();
- case 1: ST(" S ") return new cMenuEditMapItem( tr("System"), &dtp.system, SystemValues); else return GetOsdItem();
- case 2: ST("CS ") return new cMenuEditIntItem( tr("Srate"), &data.srate); else return GetOsdItem();
- case 3: ST("CST") return new cMenuEditMapItem( tr("Inversion"), &dtp.inversion, InversionValues); else return GetOsdItem();
- case 4: ST("CST") return new cMenuEditMapItem( tr("CoderateH"), &dtp.coderateH, CoderateValues); else return GetOsdItem();
- case 5: ST(" T") return new cMenuEditMapItem( tr("CoderateL"), &dtp.coderateL, CoderateValues); else return GetOsdItem();
- case 6: ST("CST") return new cMenuEditMapItem( tr("Modulation"), &dtp.modulation, ModulationValues); else return GetOsdItem();
- case 7: ST(" T") return new cMenuEditMapItem( tr("Bandwidth"), &dtp.bandwidth, BandwidthValues); else return GetOsdItem();
- case 8: ST(" T") return new cMenuEditMapItem( tr("Transmission"), &dtp.transmission, TransmissionValues); else return GetOsdItem();
- case 9: ST(" T") return new cMenuEditMapItem( tr("Guard"), &dtp.guard, GuardValues); else return GetOsdItem();
- case 10: ST(" T") return new cMenuEditMapItem( tr("Hierarchy"), &dtp.hierarchy, HierarchyValues); else return GetOsdItem();
- case 11: ST(" S ") return new cMenuEditMapItem( tr("Rolloff"), &dtp.rollOff, RollOffValues); else return GetOsdItem();
+ case 0: ST(" S ") return new cMenuEditChrItem( tr("Polarization"), &dtp.polarization, "hvlr"); else return GetOsdItem();
+ case 1: ST(" S ") return new cMenuEditMapItem( tr("System"), &dtp.system, SystemValues); else return GetOsdItem();
+ case 2: ST(" CS ") return new cMenuEditIntItem( tr("Srate"), &data.srate); else return GetOsdItem();
+ case 3: ST("ACST") return new cMenuEditMapItem( tr("Inversion"), &dtp.inversion, InversionValues); else return GetOsdItem();
+ case 4: ST(" CST") return new cMenuEditMapItem( tr("CoderateH"), &dtp.coderateH, CoderateValues); else return GetOsdItem();
+ case 5: ST(" T") return new cMenuEditMapItem( tr("CoderateL"), &dtp.coderateL, CoderateValues); else return GetOsdItem();
+ case 6: ST("ACST") return new cMenuEditMapItem( tr("Modulation"), &dtp.modulation, ModulationValues); else return GetOsdItem();
+ case 7: ST(" T") return new cMenuEditMapItem( tr("Bandwidth"), &dtp.bandwidth, BandwidthValues); else return GetOsdItem();
+ case 8: ST(" T") return new cMenuEditMapItem( tr("Transmission"), &dtp.transmission, TransmissionValues); else return GetOsdItem();
+ case 9: ST(" T") return new cMenuEditMapItem( tr("Guard"), &dtp.guard, GuardValues); else return GetOsdItem();
+ case 10: ST(" T") return new cMenuEditMapItem( tr("Hierarchy"), &dtp.hierarchy, HierarchyValues); else return GetOsdItem();
+ case 11: ST(" S ") return new cMenuEditMapItem( tr("Rolloff"), &dtp.rollOff, RollOffValues); else return GetOsdItem();
default: return NULL;
}
return NULL;
@@ -745,6 +757,7 @@ bool cDvbDevice::Probe(int Adapter, int Frontend)
bool cDvbDevice::Initialize(void)
{
+ new cDvbSourceParam('A', "ATSC");
new cDvbSourceParam('C', "DVB-C");
new cDvbSourceParam('S', "DVB-S");
new cDvbSourceParam('T', "DVB-T");
@@ -863,6 +876,7 @@ bool cDvbDevice::ProvidesSource(int Source) const
{
int type = Source & cSource::st_Mask;
return type == cSource::stNone
+ || type == cSource::stAtsc && (frontendType == SYS_ATSC)
|| type == cSource::stCable && (frontendType == SYS_DVBC_ANNEX_AC || frontendType == SYS_DVBC_ANNEX_B)
|| type == cSource::stSat && (frontendType == SYS_DVBS || frontendType == SYS_DVBS2)
|| type == cSource::stTerr && (frontendType == SYS_DVBT);
diff --git a/pat.c b/pat.c
index 9b3ded61..0d084e5e 100644
--- a/pat.c
+++ b/pat.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: pat.c 2.7 2010/01/01 15:40:05 kls Exp $
+ * $Id: pat.c 2.8 2010/03/06 12:00:30 kls Exp $
*/
#include "pat.h"
@@ -447,6 +447,29 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
}
break;
+ case 0x81: // STREAMTYPE_USER_PRIVATE
+ if (Channel->IsAtsc()) { // ATSC AC-3
+ char lang[MAXLANGCODE1] = { 0 };
+ SI::Descriptor *d;
+ for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) {
+ switch (d->getDescriptorTag()) {
+ case SI::ISO639LanguageDescriptorTag: {
+ SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
+ strn0cpy(lang, I18nNormalizeLanguageCode(ld->languageCode), MAXLANGCODE1);
+ }
+ break;
+ default: ;
+ }
+ delete d;
+ }
+ if (NumDpids < MAXDPIDS) {
+ Dpids[NumDpids] = esPid;
+ strn0cpy(DLangs[NumDpids], lang, MAXLANGCODE1);
+ NumDpids++;
+ }
+ ProcessCaDescriptors = true;
+ }
+ break;
default: ;//printf("PID: %5d %5d %2d %3d %3d\n", pmt.getServiceId(), stream.getPid(), stream.getStreamType(), pmt.getVersionNumber(), Channel->Number());
}
if (ProcessCaDescriptors) {
diff --git a/sourceparams.c b/sourceparams.c
index 9a55540b..04317895 100644
--- a/sourceparams.c
+++ b/sourceparams.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: sourceparams.c 1.1 2010/02/28 12:15:49 kls Exp $
+ * $Id: sourceparams.c 1.2 2010/03/06 11:13:39 kls Exp $
*/
#include "sourceparams.h"
@@ -21,7 +21,7 @@ cSourceParam::cSourceParam(char Source, const char *Description)
return;
}
SourceParams.Add(this);
- if (Source != 'C' && Source != 'S' && Source != 'T')
+ if (!strchr("ACST", Source)) // no, it's not "ATSC" ;-)
Sources.Add(new cSource(Source, Description));
dsyslog("registered source parameters for '%c - %s'", source, Description);
}
diff --git a/sources.conf b/sources.conf
index c0d238c3..751d919c 100644
--- a/sources.conf
+++ b/sources.conf
@@ -196,6 +196,10 @@ C DVB-C
T DVB-T
+# ATSC
+
+A ATSC
+
# Plugins
I IPTV
diff --git a/sources.h b/sources.h
index 3d00d2cf..116bd2bb 100644
--- a/sources.h
+++ b/sources.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: sources.h 2.1 2010/02/21 16:11:19 kls Exp $
+ * $Id: sources.h 2.2 2010/03/06 11:53:54 kls Exp $
*/
#ifndef __SOURCES_H
@@ -16,6 +16,7 @@ class cSource : public cListObject {
public:
enum eSourceType {
stNone = 0x00000000,
+ stAtsc = ('A' << 24),
stCable = ('C' << 24),
stSat = ('S' << 24),
stTerr = ('T' << 24),
@@ -35,6 +36,7 @@ public:
static cString ToString(int Code);
static int FromString(const char *s);
static int FromData(eSourceType SourceType, int Position = 0, bool East = false);
+ static bool IsAtsc(int Code) { return (Code & st_Mask) == stAtsc; }
static bool IsCable(int Code) { return (Code & st_Mask) == stCable; }
static bool IsSat(int Code) { return (Code & st_Mask) == stSat; }
static bool IsTerr(int Code) { return (Code & st_Mask) == stTerr; }
diff --git a/vdr.5 b/vdr.5
index 7f5cce2e..8a60193f 100644
--- a/vdr.5
+++ b/vdr.5
@@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the
.\" vdr distribution.
.\"
-.\" $Id: vdr.5 2.15 2010/02/21 14:29:06 kls Exp $
+.\" $Id: vdr.5 2.16 2010/03/06 12:01:00 kls Exp $
.\"
.TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
.SH NAME
@@ -402,8 +402,9 @@ The first character of the \fBcode\fR must be one of
.TS
tab (@);
l l.
-\fBS\fR@Satellite
+\fBA\fR@ATSC
\fBC\fR@Cable
+\fBS\fR@Satellite
\fBT\fR@Terrestrial
.TE