aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/advanced.mux14
-rw-r--r--src/ConfigParser.cpp6
-rw-r--r--src/MuxElements.h3
-rw-r--r--src/fig/FIG0_13.cpp15
4 files changed, 33 insertions, 5 deletions
diff --git a/doc/advanced.mux b/doc/advanced.mux
index 16c9bd2..fd7a06c 100644
--- a/doc/advanced.mux
+++ b/doc/advanced.mux
@@ -297,18 +297,26 @@ components {
service srv-fu
subchannel sub-fu
- ; FIG 0/13 user application was previously configured using the figtype setting.
- ; Now more than one user application can be defined per component, using the
- ; 'user-applications' entry. Do not use both figtype and user-applications.
+ ; FIG 0/13 user application was previously configured using the figtype setting, which
+ ; allowed only a single user application.
+ ; Using the 'user-applications' section, several can be defined per component.
+ ; Do not use both figtype and user-applications.
; If both slideshow (TS 101 499) and SPI (TS 102 818) are carried in PAD, the following
; needs to be set for FIG 0/13 to be transmitted correctly.
+ ; The same section is also applicable to packet services.
user-applications {
; Add uaType 0x2 with X-PAD App Type = 12 and empty user application data
userapp "slideshow"
; Add uaType 0x7 with X-PAD App Type = 16 and user application data = "Basic profile"
userapp "spi"
+
+ ; Broadcast website, add uaType 0x3 and user application data
+ ; 0x01 "basic integrated receiver profile" and
+ ; 0xFF "unrestricted profile"
+ ; Only for packet-mode, not X-PAD.
+ userapp "website"
}
; Deprecated figtype setting:
diff --git a/src/ConfigParser.cpp b/src/ConfigParser.cpp
index eb30e3a..fd367ec 100644
--- a/src/ConfigParser.cpp
+++ b/src/ConfigParser.cpp
@@ -824,10 +824,15 @@ void parse_ptree(
// This was previously hardcoded in FIG0/13 and means "MOT, start of X-PAD data group"
ua.xpadAppType = 12;
+ ua.xpadAppType_valid = true;
}
else if (ua_value == "spi") {
ua.uaType = FIG0_13_APPTYPE_SPI;
ua.xpadAppType = 16;
+ ua.xpadAppType_valid = true;
+ }
+ else if (ua_value == "website") {
+ ua.uaType = FIG0_13_APPTYPE_WEBSITE;
}
if (component->isPacketComponent(ensemble->subchannels)) {
@@ -858,6 +863,7 @@ void parse_ptree(
// This was previously hardcoded in FIG0/13 and means "MOT, start of X-PAD data group"
ua.xpadAppType = 12;
+ ua.xpadAppType_valid = true;
if (component->isPacketComponent(ensemble->subchannels)) {
component->packet.uaTypes.push_back(ua);
diff --git a/src/MuxElements.h b/src/MuxElements.h
index 020093d..a709191 100644
--- a/src/MuxElements.h
+++ b/src/MuxElements.h
@@ -433,7 +433,8 @@ struct userApplication {
/* X-PAD Application Type: this 5-bit field shall specify the lowest numbered application type used to transport
* this user application (see clause 7.4.3).
* Also See EN 300 401 Table 11 "X-PAD Application types" */
- uint8_t xpadAppType;
+ bool xpadAppType_valid = false;
+ uint8_t xpadAppType = 0;
};
struct dabAudioComponent {
diff --git a/src/fig/FIG0_13.cpp b/src/fig/FIG0_13.cpp
index da21cbf..aa0be1e 100644
--- a/src/fig/FIG0_13.cpp
+++ b/src/fig/FIG0_13.cpp
@@ -168,12 +168,18 @@ FillStatus FIG0_13::fill(uint8_t *buf, size_t max_size)
if (ua.uaType == FIG0_13_APPTYPE_SPI) {
app->length += 1;
}
+ else if (ua.uaType == FIG0_13_APPTYPE_WEBSITE) {
+ app->length += 2;
+ }
buf += sizeof(FIG0_13_app);
remaining -= sizeof(FIG0_13_app);
fig0->Length += sizeof(FIG0_13_app);
- if (m_transmit_programme) {
+ if (m_transmit_programme and !ua.xpadAppType_valid) {
+ throw MuxInitException("FIG0/13 combination unsupported");
+ }
+ else if (m_transmit_programme and ua.xpadAppType_valid) {
const uint8_t dscty = 60; // TS 101 756 Table 2b (MOT)
const uint16_t xpadapp = htons((ua.xpadAppType << 8) | dscty);
/* xpad meaning
@@ -198,6 +204,13 @@ FillStatus FIG0_13::fill(uint8_t *buf, size_t max_size)
remaining -= 1;
fig0->Length += 1;
}
+ else if (ua.uaType == FIG0_13_APPTYPE_WEBSITE) {
+ buf[0] = 0x01; // = basic integrated receiver profile
+ buf[1] = 0xFF; // = unrestricted (PC) profile
+ buf += 2;
+ remaining -= 2;
+ fig0->Length += 2;
+ }
}
}
}