diff --git a/include/modules/cava/cava_backend.hpp b/include/modules/cava/cava_backend.hpp index d8a2ce06..c88182b3 100644 --- a/include/modules/cava/cava_backend.hpp +++ b/include/modules/cava/cava_backend.hpp @@ -43,13 +43,13 @@ class CavaBackend final { util::SleeperThread thread_; util::SleeperThread read_thread_; // Cava API to read audio source - ::cava::ptr input_source_; + ::cava::ptr input_source_{NULL}; struct ::cava::error_s error_{}; // cava errors struct ::cava::config_params prm_{}; // cava parameters struct ::cava::audio_raw audio_raw_{}; // cava handled raw audio data(is based on audio_data) struct ::cava::audio_data audio_data_{}; // cava audio data - struct ::cava::cava_plan* plan_; //{new cava_plan{}}; + struct ::cava::cava_plan* plan_{NULL}; //{new cava_plan{}}; std::chrono::seconds fetch_input_delay_{4}; // Delay to handle audio source diff --git a/meson.build b/meson.build index 822c566b..0675a963 100644 --- a/meson.build +++ b/meson.build @@ -498,7 +498,7 @@ else endif cava = dependency('cava', - version : '>=0.10.4', + version : '>=0.10.6', required: get_option('cava'), fallback : ['cava', 'cava_dep'], not_found_message: 'cava is not found. Building waybar without cava') diff --git a/src/modules/cava/cava_backend.cpp b/src/modules/cava/cava_backend.cpp index ec32261c..c9dba67f 100644 --- a/src/modules/cava/cava_backend.cpp +++ b/src/modules/cava/cava_backend.cpp @@ -18,7 +18,7 @@ waybar::modules::cava::CavaBackend::CavaBackend(const Json::Value& config) { // Load cava config error_.length = 0; - if (!load_config(cfgPath, &prm_, false, &error_)) { + if (!load_config(cfgPath, &prm_, false, &error_, 0)) { spdlog::error("cava backend. Error loading config. {0}", error_.message); exit(EXIT_FAILURE); } @@ -26,8 +26,10 @@ waybar::modules::cava::CavaBackend::CavaBackend(const Json::Value& config) { // Override cava parameters by the user config prm_.inAtty = 0; prm_.output = ::cava::output_method::OUTPUT_RAW; - strcpy(prm_.data_format, "ascii"); - strcpy(prm_.raw_target, "/dev/stdout"); + if (prm_.data_format) free(prm_.data_format); + prm_.data_format = strdup("ascii"); + if (prm_.raw_target) free(prm_.raw_target); + prm_.raw_target = strdup("/dev/stdout"); prm_.ascii_range = config["format-icons"].size() - 1; prm_.bar_width = 2; @@ -54,7 +56,10 @@ waybar::modules::cava::CavaBackend::CavaBackend(const Json::Value& config) { if (config["sleep_timer"].isInt()) prm_.sleep_timer = config["sleep_timer"].asInt(); if (config["method"].isString()) prm_.input = ::cava::input_method_by_name(config["method"].asString().c_str()); - if (config["source"].isString()) prm_.audio_source = config["source"].asString().data(); + if (config["source"].isString()) { + if (prm_.audio_source) free(prm_.audio_source); + prm_.audio_source = config["source"].asString().data(); + } if (config["sample_rate"].isNumeric()) prm_.samplerate = config["sample_rate"].asLargestInt(); if (config["sample_bits"].isInt()) prm_.samplebits = config["sample_bits"].asInt(); if (config["stereo"].isBool()) prm_.stereo = config["stereo"].asBool(); @@ -67,25 +72,14 @@ waybar::modules::cava::CavaBackend::CavaBackend(const Json::Value& config) { if (config["input_delay"].isInt()) fetch_input_delay_ = std::chrono::seconds(config["input_delay"].asInt()); - // Make cava parameters configuration - plan_ = new ::cava::cava_plan{}; - audio_raw_.height = prm_.ascii_range; audio_data_.format = -1; - audio_data_.source = new char[1 + strlen(prm_.audio_source)]; - audio_data_.source[0] = '\0'; - strcpy(audio_data_.source, prm_.audio_source); - audio_data_.rate = 0; audio_data_.samples_counter = 0; audio_data_.channels = 2; audio_data_.IEEE_FLOAT = 0; - audio_data_.input_buffer_size = BUFFER_SIZE * audio_data_.channels; audio_data_.cava_buffer_size = audio_data_.input_buffer_size * 8; - - audio_data_.cava_in = new double[audio_data_.cava_buffer_size]{0.0}; - audio_data_.terminate = 0; audio_data_.suspendFlag = false; input_source_ = get_input(&audio_data_, &prm_); @@ -95,8 +89,9 @@ waybar::modules::cava::CavaBackend::CavaBackend(const Json::Value& config) { exit(EXIT_FAILURE); } + // Make cava parameters configuration // Init cava plan, audio_raw structure - audio_raw_init(&audio_data_, &audio_raw_, &prm_, plan_); + audio_raw_init(&audio_data_, &audio_raw_, &prm_, &plan_); if (!plan_) spdlog::error("cava backend plan is not provided"); audio_raw_.previous_frame[0] = -1; // For first Update() call need to rePaint text message // Read audio source trough cava API. Cava orginizes this process via infinity loop @@ -118,8 +113,16 @@ waybar::modules::cava::CavaBackend::CavaBackend(const Json::Value& config) { waybar::modules::cava::CavaBackend::~CavaBackend() { thread_.stop(); read_thread_.stop(); + cava_destroy(plan_); delete plan_; plan_ = nullptr; + audio_raw_clean(&audio_raw_); + pthread_mutex_lock(&audio_data_.lock); + audio_data_.terminate = 1; + pthread_mutex_unlock(&audio_data_.lock); + config_clean(&prm_); + free(audio_data_.source); + free(audio_data_.cava_in); } static void upThreadDelay(std::chrono::milliseconds& delay, std::chrono::seconds& delta) { diff --git a/subprojects/cava.wrap b/subprojects/cava.wrap index f220207c..e32bb0da 100644 --- a/subprojects/cava.wrap +++ b/subprojects/cava.wrap @@ -1,7 +1,11 @@ -[wrap-file] -directory = cava-0.10.4 -source_url = https://github.com/LukashonakV/cava/archive/0.10.4.tar.gz -source_filename = cava-0.10.4.tar.gz -source_hash =7bc1c1f9535f2bcc5cd2ae8a2434a2e3a05f5670b1c96316df304137ffc65756 +[wrap-git] +url = https://github.com/LukashonakV/cava.git +revision = 23efcced43b5a395747b18a2e5f2171fc0925d18 +depth = 1 + +#directory = cava-0.10.6 +#source_url = https://github.com/LukashonakV/cava/archive/0.10.6.tar.gz +#source_filename = cava-0.10.6.tar.gz +#source_hash = e715c4c6a625b8dc063e57e8e81c80e4d1015ec1b98db69a283b2c6770f839f4 [provide] cava = cava_dep