diff options
-rw-r--r-- | doc/servicelinking.mux | 2 | ||||
-rw-r--r-- | src/ConfigParser.cpp | 6 | ||||
-rw-r--r-- | src/fig/FIG0_21.cpp | 22 |
3 files changed, 21 insertions, 9 deletions
diff --git a/doc/servicelinking.mux b/doc/servicelinking.mux index 438cb4e..e210c75 100644 --- a/doc/servicelinking.mux +++ b/doc/servicelinking.mux @@ -111,6 +111,7 @@ frequency_information { continuity true eid 0x4fff frequencies { + ; In DAB, max 2 frequency entries entry_a { signal_mode_1 true adjacent true @@ -127,6 +128,7 @@ frequency_information { range_modulation fm continuity true pi_code 0x1234 + ; in FM, max 7 entries frequencies "87.6 105.2" } } diff --git a/src/ConfigParser.cpp b/src/ConfigParser.cpp index b48df8c..efcafbd 100644 --- a/src/ConfigParser.cpp +++ b/src/ConfigParser.cpp @@ -244,7 +244,7 @@ static void parse_freq_info(ptree& pt, } fle.fi_dab.frequencies.push_back(el); } - if (fle.fi_dab.frequencies.size() > 7) { + if (fle.fi_dab.frequencies.size() > 2) { throw runtime_error("Too many frequency entries in FI " + fle.uid); } } break; @@ -270,7 +270,7 @@ static void parse_freq_info(ptree& pt, for (std::string freq; std::getline(frequencies_ss, freq, ' '); ) { fle.fi_drm.frequencies.push_back(std::stof(freq)); } - if (fle.fi_drm.frequencies.size() > 7) { + if (fle.fi_drm.frequencies.size() > 3) { throw runtime_error("Too many frequency entries in FI " + fle.uid); } } break; @@ -283,7 +283,7 @@ static void parse_freq_info(ptree& pt, for (std::string freq; std::getline(frequencies_ss, freq, ' '); ) { fle.fi_amss.frequencies.push_back(std::stof(freq)); } - if (fle.fi_amss.frequencies.size() > 7) { + if (fle.fi_amss.frequencies.size() > 3) { throw runtime_error("Too many frequency entries in FI " + fle.uid); } } break; diff --git a/src/fig/FIG0_21.cpp b/src/fig/FIG0_21.cpp index 1972a19..c9d5fab 100644 --- a/src/fig/FIG0_21.cpp +++ b/src/fig/FIG0_21.cpp @@ -27,6 +27,8 @@ #include "fig/FIG0_21.h" #include "utils.h" +using namespace std; + namespace FIC { struct FIGtype0_21_header { @@ -50,6 +52,14 @@ struct FIGtype0_21_fi_list_header { idHigh = id >> 8; idLow = id & 0xFF; } + + void addToLength(uint8_t increment) { + const uint32_t newlen = length_freq_list + increment; + if (newlen > 0x7) { + throw logic_error("FI freq list too long: " + to_string(newlen)); + } + length_freq_list = newlen; + } } PACKED; struct FIGtype0_21_fi_dab_entry { @@ -209,7 +219,7 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) field->setFreq(static_cast<uint32_t>( freq.frequency * 1000.0f / 16.0f)); - fi_list_header->length_freq_list += 3; + fi_list_header->addToLength(3); fig0->Length += 3; buf += 3; remaining -= 3; @@ -226,7 +236,7 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) // Do the whole calculation in kHz: *buf = (freq * 1000.0f - 87500.0f) / 100.0f; - fi_list_header->length_freq_list += 1; + fi_list_header->addToLength(1); fig0->Length += 1; buf += 1; remaining -= 1; @@ -240,7 +250,7 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) // Id field 2 *buf = (fle.fi_drm.drm_service_id >> 16) & 0xFF; - fi_list_header->length_freq_list += 1; + fi_list_header->addToLength(1); fig0->Length += 1; buf += 1; remaining -= 1; @@ -250,7 +260,7 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) buf[0] = freq_field >> 8; buf[1] = freq_field & 0xFF; - fi_list_header->length_freq_list += 2; + fi_list_header->addToLength(2); fig0->Length += 2; buf += 2; remaining -= 2; @@ -264,7 +274,7 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) // Id field 2 *buf = (fle.fi_amss.amss_service_id >> 16) & 0xFF; - fi_list_header->length_freq_list += 1; + fi_list_header->addToLength(1); fig0->Length += 1; buf += 1; remaining -= 1; @@ -274,7 +284,7 @@ FillStatus FIG0_21::fill(uint8_t *buf, size_t max_size) buf[0] = freq_field >> 8; buf[1] = freq_field & 0xFF; - fi_list_header->length_freq_list += 2; + fi_list_header->addToLength(2); fig0->Length += 2; buf += 2; remaining -= 2; |