diff options
Diffstat (limited to 'src/DabMod.cpp')
| -rw-r--r-- | src/DabMod.cpp | 42 | 
1 files changed, 27 insertions, 15 deletions
| diff --git a/src/DabMod.cpp b/src/DabMod.cpp index f250850..57ff79b 100644 --- a/src/DabMod.cpp +++ b/src/DabMod.cpp @@ -105,13 +105,14 @@ struct modulator_data      RemoteControllers* rcs;  }; -enum run_modulator_state { -    MOD_FAILURE, -    MOD_NORMAL_END, -    MOD_AGAIN +enum class run_modulator_state_t { +    failure,    // Corresponds to all failures +    normal_end, // Number of frames to modulate was reached +    again,      // FCT discontinuity or ZeroMQ overrun +    reconfigure // Some sort of change of configuration we cannot handle happened  }; -run_modulator_state run_modulator(modulator_data& m); +run_modulator_state_t run_modulator(modulator_data& m);  int launch_modulator(int argc, char* argv[])  { @@ -786,15 +787,15 @@ int launch_modulator(int argc, char* argv[])          m.inputReader->PrintInfo(); -        run_modulator_state st = run_modulator(m); +        run_modulator_state_t st = run_modulator(m);          switch (st) { -            case MOD_FAILURE: +            case run_modulator_state_t::failure:                  etiLog.level(error) << "Modulator failure.";                  run_again = false;                  ret = 1;                  break; -            case MOD_AGAIN: +            case run_modulator_state_t::again:                  etiLog.level(warn) << "Restart modulator.";                  run_again = false;                  if (inputTransport == "file") { @@ -816,7 +817,12 @@ int launch_modulator(int argc, char* argv[])  #endif                  }                  break; -            case MOD_NORMAL_END: +            case run_modulator_state_t::reconfigure: +                etiLog.level(warn) << "Detected change in ensemble configuration."; +                /* We can keep the input in this care */ +                run_again = true; +                break; +            case run_modulator_state_t::normal_end:              default:                  etiLog.level(info) << "modulator stopped.";                  ret = 0; @@ -839,9 +845,9 @@ int launch_modulator(int argc, char* argv[])      return ret;  } -run_modulator_state run_modulator(modulator_data& m) +run_modulator_state_t run_modulator(modulator_data& m)  { -    run_modulator_state ret = MOD_FAILURE; +    auto ret = run_modulator_state_t::failure;      try {          while (running) { @@ -879,21 +885,27 @@ run_modulator_state run_modulator(modulator_data& m)                  etiLog.level(error) << "Input read error.";              }              running = 0; -            ret = MOD_NORMAL_END; +            ret = run_modulator_state_t::normal_end;          }  #if defined(HAVE_OUTPUT_UHD)      } catch (fct_discontinuity_error& e) {          // The OutputUHD saw a FCT discontinuity          etiLog.level(warn) << e.what(); -        ret = MOD_AGAIN; +        ret = run_modulator_state_t::again;  #endif      } catch (zmq_input_overflow& e) {          // The ZeroMQ input has overflowed its buffer          etiLog.level(warn) << e.what(); -        ret = MOD_AGAIN; +        ret = run_modulator_state_t::again; +    } catch (std::out_of_range& e) { +        // One of the DSP blocks has detected an invalid change +        // or value in some settings. This can be due to a multiplex +        // reconfiguration. +        etiLog.level(warn) << e.what(); +        ret = run_modulator_state_t::reconfigure;      } catch (std::exception& e) {          etiLog.level(error) << "Exception caught: " << e.what(); -        ret = MOD_FAILURE; +        ret = run_modulator_state_t::failure;      }      return ret; | 
