fix(cava): throw instead of exit() on a bad config
loadConfig() called exit(EXIT_FAILURE) when the cava config failed to load or no input source was available, killing the whole bar. Throw std::runtime_error instead: the factory/bar catch it at construction and disable only the cava module. The read_thread_ also calls loadConfig() at runtime, so contain the throw there too, logging instead of terminating. Fixes #4456
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
std::shared_ptr<waybar::modules::cava::CavaBackend> waybar::modules::cava::CavaBackend::inst(
|
||||
const Json::Value& config) {
|
||||
static auto* backend = new CavaBackend(config);
|
||||
@@ -20,7 +22,13 @@ waybar::modules::cava::CavaBackend::CavaBackend(const Json::Value& config) : con
|
||||
spdlog::warn("Cava backend. Read source error: {0}", e.what());
|
||||
}
|
||||
read_thread_.sleep_for(fetch_input_delay_);
|
||||
// loadConfig() now throws on failure; contain it so a runtime config error
|
||||
// logs instead of terminating the process (#4456).
|
||||
try {
|
||||
loadConfig();
|
||||
} catch (const std::exception& e) {
|
||||
spdlog::error("{}", e.what());
|
||||
}
|
||||
};
|
||||
// Write outcoming data. Emit signals
|
||||
out_thread_ = [this] {
|
||||
@@ -175,8 +183,9 @@ void waybar::modules::cava::CavaBackend::loadConfig() {
|
||||
error_.length = 0;
|
||||
|
||||
if (!load_config(cfgPath, &prm_, &error_)) {
|
||||
spdlog::error("cava backend. Error loading config. {0}", error_.message);
|
||||
exit(EXIT_FAILURE);
|
||||
// Throw, don't exit(): a bad config must disable only the cava module, not
|
||||
// kill the whole bar (#4456). Caught by the factory (ctor) / read_thread_.
|
||||
throw std::runtime_error(std::string{"cava backend: error loading config: "} + error_.message);
|
||||
}
|
||||
|
||||
// Override cava parameters by the user config
|
||||
@@ -252,8 +261,7 @@ void waybar::modules::cava::CavaBackend::loadConfig() {
|
||||
input_source_ = get_input(&audio_data_, &prm_);
|
||||
|
||||
if (!input_source_) {
|
||||
spdlog::error("cava backend API didn't provide input audio source method");
|
||||
exit(EXIT_FAILURE);
|
||||
throw std::runtime_error("cava backend: API didn't provide an input audio source");
|
||||
}
|
||||
|
||||
prm_.output = ::cava::output_method::OUTPUT_RAW;
|
||||
|
||||
Reference in New Issue
Block a user