diff options
| -rw-r--r-- | doc/advanced.mux | 4 | ||||
| -rw-r--r-- | src/fig/FIG0_13.cpp | 23 | 
2 files changed, 22 insertions, 5 deletions
diff --git a/doc/advanced.mux b/doc/advanced.mux index 9a8c594..33d29b5 100644 --- a/doc/advanced.mux +++ b/doc/advanced.mux @@ -304,10 +304,10 @@ components {          ; 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.          user-applications { -            ; Add uaType 0x2 and specify X-PAD App Type = 12 +            ; Add uaType 0x2 with X-PAD App Type = 12 and empty user application data              userapp "slideshow" -            ; Add uaType 0x7 and specify X-PAD App Type = 16 +            ; Add uaType 0x7 with X-PAD App Type = 16 and user application data = "Basic profile"              userapp "spi"          } diff --git a/src/fig/FIG0_13.cpp b/src/fig/FIG0_13.cpp index 582e28e..84e426f 100644 --- a/src/fig/FIG0_13.cpp +++ b/src/fig/FIG0_13.cpp @@ -96,10 +96,16 @@ FillStatus FIG0_13::fill(uint8_t *buf, size_t max_size)              const size_t num_apps = (*componentFIG0_13)->audio.uaTypes.size(); -            const size_t app_length = 2; +            const size_t xpadapp_length = 2;              static_assert(sizeof(FIG0_13_shortAppInfo) == 3);              static_assert(sizeof(FIG0_13_app) == 4); -            const int required_size = sizeof(FIG0_13_shortAppInfo) + num_apps * (sizeof(FIG0_13_app) + app_length); +            int required_size = sizeof(FIG0_13_shortAppInfo); +            for (const auto& ua : (*componentFIG0_13)->audio.uaTypes) { +                required_size += sizeof(FIG0_13_app) + xpadapp_length; +                if (ua.uaType == FIG0_13_APPTYPE_SPI) { +                    required_size += 2; // For the "basic profile" user application data +                } +            }              if (fig0 == NULL) {                  if (remaining < 2 + required_size) { @@ -130,7 +136,10 @@ FillStatus FIG0_13::fill(uint8_t *buf, size_t max_size)              for (const auto& ua : (*componentFIG0_13)->audio.uaTypes) {                  FIG0_13_app* app = (FIG0_13_app*)buf;                  app->setType(ua.uaType); -                app->length = app_length; +                app->length = xpadapp_length; +                if (ua.uaType == FIG0_13_APPTYPE_SPI) { +                    app->length += 2; +                }                  const uint8_t dscty = 60; // TS 101 756 Table 2b (MOT)                  app->xpad = htons((ua.xpadAppType << 8) | dscty); @@ -147,6 +156,14 @@ FillStatus FIG0_13::fill(uint8_t *buf, size_t max_size)                  buf += sizeof(FIG0_13_app);                  remaining -= sizeof(FIG0_13_app);                  fig0->Length += sizeof(FIG0_13_app); + +                if (ua.uaType == FIG0_13_APPTYPE_SPI) { +                    buf[0] = 0x01; // = basic profile +                    buf[1] = 0x00; // = list terminator +                    buf += 2; +                    remaining -= 2; +                    fig0->Length += 2; +                }              }          }          else if (not m_transmit_programme and  | 
