From ef041c82b173a30a77910e70ac7f78659d3ef295 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 28 Apr 2026 11:07:19 -0400 Subject: [PATCH 1/5] RDKEMW-17620 : ctrlm rfc value groups not updating --- src/config/ctrlm_config.cpp | 12 +++++- src/config/ctrlm_config.h | 10 ++++- src/ctrlm_main.cpp | 5 ++- src/rfc/ctrlm_rfc_attr.cpp | 10 +++-- src/voice/ctrlm_voice_obj.cpp | 74 +++++++++++++++++++++-------------- 5 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/config/ctrlm_config.cpp b/src/config/ctrlm_config.cpp index eb0ed60e..1e0544a1 100644 --- a/src/config/ctrlm_config.cpp +++ b/src/config/ctrlm_config.cpp @@ -45,6 +45,7 @@ void ctrlm_config_t::destroy_instance() { ctrlm_config_t::ctrlm_config_t() { this->root = NULL; + this->local_config = false; } ctrlm_config_t::~ctrlm_config_t() { @@ -52,9 +53,10 @@ ctrlm_config_t::~ctrlm_config_t() { json_decref(this->root); this->root = NULL; } + this->local_config = false; } -bool ctrlm_config_t::load_config(const std::string &file_path, bool verbose) { +bool ctrlm_config_t::load_config(const std::string &file_path, bool local_config, bool verbose) { bool ret = false; std::string contents = file_to_string(file_path); if(this->root) { @@ -73,6 +75,7 @@ bool ctrlm_config_t::load_config(const std::string &file_path, bool verbose) { if(verbose) { XLOGD_INFO("config loaded successfully as JSON for <%s>", file_path.c_str()); } + this->local_config |= local_config; ret = true; } else { XLOGD_ERROR("JSON ERROR: Line <%u> Column <%u> Text <%s> Contents <%s>", json_error.line, json_error.column, json_error.text, contents.c_str()); @@ -83,7 +86,7 @@ bool ctrlm_config_t::load_config(const std::string &file_path, bool verbose) { return(ret); } -bool ctrlm_config_t::append_config(const std::string &file_path, bool verbose) { +bool ctrlm_config_t::append_config(const std::string &file_path, bool local_config, bool verbose) { if(this->root == NULL) { XLOGD_ERROR("no config file loaded"); return(false); @@ -109,6 +112,7 @@ bool ctrlm_config_t::append_config(const std::string &file_path, bool verbose) { if(verbose) { XLOGD_INFO("config appended successfully as JSON for <%s>", file_path.c_str()); } + this->local_config |= local_config; ret = true; } json_decref(append_root); @@ -121,6 +125,10 @@ bool ctrlm_config_t::path_exists(const std::string &path) { return(ctrlm_utils_json_from_path(this->root, path, false) != NULL ? true : false); } +bool ctrlm_config_t::has_local_config(void) { + return(this->local_config); +} + json_t *ctrlm_config_t::json_from_path(const std::string &path, bool add_ref) { return(ctrlm_utils_json_from_path(this->root, path, add_ref)); } diff --git a/src/config/ctrlm_config.h b/src/config/ctrlm_config.h index 755e5b4b..5b216978 100644 --- a/src/config/ctrlm_config.h +++ b/src/config/ctrlm_config.h @@ -49,13 +49,18 @@ class ctrlm_config_t { * @param file_path The path to the configuration file * @return True on success, otherwise False */ - bool load_config(const std::string &file_path, bool verbose = false); + bool load_config(const std::string &file_path, bool local_config = false, bool verbose = false); /** * Function which appends a configuration file into the configuration object. * @param file_path The path to the configuration file * @return True on success, otherwise False */ - bool append_config(const std::string &file_path, bool verbose = false); + bool append_config(const std::string &file_path, bool local_config = false, bool verbose = false); + /** + * Function to check if local config exists + * @return True if the local config exists, else False + */ + bool has_local_config(void); /** * Function to check if object exists from a path * @param path A period seperated string used to navigate a JSON object i.e. "network_rf4ce.polling.enabled" @@ -83,6 +88,7 @@ class ctrlm_config_t { private: json_t *root; + bool local_config; }; #endif diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index c3da8d6d..1eeb4bcb 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -1586,16 +1586,17 @@ gboolean ctrlm_load_config(json_t **json_obj_root, json_t **json_obj_net_rf4ce, // Check for OPT config file override if(opt_append) { + bool local_config = true; if(!oem_append) { XLOGD_INFO("Loading OPT configuration from <%s>", config_fn_opt.c_str()); - if(!ctrlm_config->load_config(config_fn_opt)) { + if(!ctrlm_config->load_config(config_fn_opt, local_config)) { XLOGD_ERROR("Failed to load OPT configuration from <%s>", config_fn_opt.c_str()); return(false); } } else { XLOGD_INFO("Appending OPT configuration from <%s>", config_fn_opt.c_str()); - if(!ctrlm_config->append_config(config_fn_opt)) { + if(!ctrlm_config->append_config(config_fn_opt, local_config)) { XLOGD_ERROR("Failed to append OPT configuration from <%s>", config_fn_opt.c_str()); return(false); } diff --git a/src/rfc/ctrlm_rfc_attr.cpp b/src/rfc/ctrlm_rfc_attr.cpp index 263d9d6c..66943de3 100644 --- a/src/rfc/ctrlm_rfc_attr.cpp +++ b/src/rfc/ctrlm_rfc_attr.cpp @@ -99,9 +99,13 @@ bool ctrlm_rfc_attr_t::check_config_file(const std::string &path) const { bool ret = false; ctrlm_config_t *config = ctrlm_config_t::get_instance(); if(config) { - ret = config->path_exists(this->config_key + std::string(JSON_PATH_SEPERATOR) + path); - if(ret) { - XLOGD_DEBUG("%s exists in the config file", path.c_str()); + if(!config->has_local_config()) { + XLOGD_DEBUG("local config file not in use"); + } else { + ret = config->path_exists(this->config_key + std::string(JSON_PATH_SEPERATOR) + path); + if(ret) { + XLOGD_WARN("%s exists in the config file", path.c_str()); + } } } else { XLOGD_ERROR("config object is NULL"); diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index a6787b1e..536e5d9e 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -3959,7 +3959,8 @@ xrsr_power_mode_t voice_xrsr_power_map(ctrlm_power_state_t ctrlm_power_state) { void ctrlm_voice_t::voice_rfc_retrieved_handler(const ctrlm_rfc_attr_t& attr) { bool enabled = true; - bool reroute = false; + + XLOGD_INFO("processing RFC values"); attr.get_rfc_value(JSON_INT_NAME_VOICE_VREX_REQUEST_TIMEOUT, this->prefs.timeout_vrex_connect,0); attr.get_rfc_value(JSON_INT_NAME_VOICE_VREX_RESPONSE_TIMEOUT, this->prefs.timeout_vrex_session,0); @@ -4007,22 +4008,35 @@ void ctrlm_voice_t::voice_rfc_retrieved_handler(const ctrlm_rfc_attr_t& attr) { } attr.get_rfc_value(JSON_INT_NAME_VOICE_PACKET_LOSS_THRESHOLD, this->packet_loss_threshold, 0); - if(attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_MODE, this->audio_mode) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_TIMING, this->audio_timing) | - attr.get_rfc_value(JSON_FLOAT_NAME_VOICE_AUDIO_CONFIDENCE_THRESHOLD, this->audio_confidence_threshold, 0.0, 1.0) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_DUCKING_TYPE, this->audio_ducking_type, CTRLM_VOICE_AUDIO_DUCKING_TYPE_ABSOLUTE, CTRLM_VOICE_AUDIO_DUCKING_TYPE_RELATIVE) | - attr.get_rfc_value(JSON_FLOAT_NAME_VOICE_AUDIO_DUCKING_LEVEL, this->audio_ducking_level, 0.0, 1.0) | - attr.get_rfc_value(JSON_BOOL_NAME_VOICE_AUDIO_DUCKING_BEEP, this->audio_ducking_beep_enabled)) { + + bool audio_mode_updated = false; + audio_mode_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_MODE, this->audio_mode); + audio_mode_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_TIMING, this->audio_timing); + audio_mode_updated |= attr.get_rfc_value(JSON_FLOAT_NAME_VOICE_AUDIO_CONFIDENCE_THRESHOLD, this->audio_confidence_threshold, 0.0, 1.0); + audio_mode_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_DUCKING_TYPE, this->audio_ducking_type, CTRLM_VOICE_AUDIO_DUCKING_TYPE_ABSOLUTE, CTRLM_VOICE_AUDIO_DUCKING_TYPE_RELATIVE); + audio_mode_updated |= attr.get_rfc_value(JSON_FLOAT_NAME_VOICE_AUDIO_DUCKING_LEVEL, this->audio_ducking_level, 0.0, 1.0); + + // audio ducking beep is updated via Voice Control plugin so it cannot be overriden via RFC + //audio_mode_updated |= attr.get_rfc_value(JSON_BOOL_NAME_VOICE_AUDIO_DUCKING_BEEP, this->audio_ducking_beep_enabled); + + XLOGD_INFO("audio mode updated <%s>", audio_mode_updated ? "YES" : "NO"); + + if(audio_mode_updated) { ctrlm_voice_audio_settings_t audio_settings = {this->audio_mode, this->audio_timing, this->audio_confidence_threshold, this->audio_ducking_type, this->audio_ducking_level, this->audio_ducking_beep_enabled}; this->set_audio_mode(&audio_settings); } // All attributes that need capture configuration to be set - if(attr.get_rfc_value(JSON_ARRAY_NAME_VOICE_SAVE_LAST_UTTERANCE, this->prefs.utterance_save, ctrlm_is_production_build() ? CTRLM_JSON_ARRAY_INDEX_PRD : CTRLM_JSON_ARRAY_INDEX_DEV) | - attr.get_rfc_value(JSON_BOOL_NAME_VOICE_UTTERANCE_USE_CURTAIL, this->prefs.utterance_use_curtail) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_UTTERANCE_FILE_QTY_MAX, this->prefs.utterance_file_qty_max, 1, 100000) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_UTTERANCE_FILE_SIZE_MAX, this->prefs.utterance_file_size_max, 4 * 1024) | - attr.get_rfc_value(JSON_STR_NAME_VOICE_UTTERANCE_PATH, this->prefs.utterance_path)) { + bool capture_config_updated = false; + capture_config_updated |= attr.get_rfc_value(JSON_ARRAY_NAME_VOICE_SAVE_LAST_UTTERANCE, this->prefs.utterance_save, ctrlm_is_production_build() ? CTRLM_JSON_ARRAY_INDEX_PRD : CTRLM_JSON_ARRAY_INDEX_DEV); + capture_config_updated |= attr.get_rfc_value(JSON_BOOL_NAME_VOICE_UTTERANCE_USE_CURTAIL, this->prefs.utterance_use_curtail); + capture_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_UTTERANCE_FILE_QTY_MAX, this->prefs.utterance_file_qty_max, 1, 100000); + capture_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_UTTERANCE_FILE_SIZE_MAX, this->prefs.utterance_file_size_max, 4 * 1024); + capture_config_updated |= attr.get_rfc_value(JSON_STR_NAME_VOICE_UTTERANCE_PATH, this->prefs.utterance_path); + + XLOGD_INFO("capture config updated <%s>", capture_config_updated ? "YES" : "NO"); + + if(capture_config_updated) { xrsr_capture_config_t capture_config = { .delete_files = !this->prefs.utterance_save, .enable = this->prefs.utterance_save, @@ -4045,22 +4059,21 @@ void ctrlm_voice_t::voice_rfc_retrieved_handler(const ctrlm_rfc_attr_t& attr) { } // All attributes that need a re-route to apply - if(attr.get_rfc_value(JSON_INT_NAME_VOICE_MINIMUM_DURATION, this->prefs.utterance_duration_min) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_CONNECT_CHECK_INTERVAL, this->prefs.dst_params_standby.connect_check_interval) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_TIMEOUT_CONNECT, this->prefs.dst_params_standby.timeout_connect) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_TIMEOUT_INACTIVITY, this->prefs.dst_params_standby.timeout_inactivity) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_TIMEOUT_SESSION, this->prefs.dst_params_standby.timeout_session) | - attr.get_rfc_value(JSON_BOOL_NAME_VOICE_DST_PARAMS_STANDBY_IPV4_FALLBACK, this->prefs.dst_params_standby.ipv4_fallback) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_BACKOFF_DELAY, this->prefs.dst_params_standby.backoff_delay) | + bool routing_config_updated = false; + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_MINIMUM_DURATION, this->prefs.utterance_duration_min); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_CONNECT_CHECK_INTERVAL, this->prefs.dst_params_standby.connect_check_interval); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_TIMEOUT_CONNECT, this->prefs.dst_params_standby.timeout_connect); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_TIMEOUT_INACTIVITY, this->prefs.dst_params_standby.timeout_inactivity); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_TIMEOUT_SESSION, this->prefs.dst_params_standby.timeout_session); + routing_config_updated |= attr.get_rfc_value(JSON_BOOL_NAME_VOICE_DST_PARAMS_STANDBY_IPV4_FALLBACK, this->prefs.dst_params_standby.ipv4_fallback); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_STANDBY_BACKOFF_DELAY, this->prefs.dst_params_standby.backoff_delay); - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_CONNECT_CHECK_INTERVAL, this->prefs.dst_params_low_latency.connect_check_interval) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_TIMEOUT_CONNECT, this->prefs.dst_params_low_latency.timeout_connect) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_TIMEOUT_INACTIVITY, this->prefs.dst_params_low_latency.timeout_inactivity) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_TIMEOUT_SESSION, this->prefs.dst_params_low_latency.timeout_session) | - attr.get_rfc_value(JSON_BOOL_NAME_VOICE_DST_PARAMS_LOW_LATENCY_IPV4_FALLBACK, this->prefs.dst_params_low_latency.ipv4_fallback) | - attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_BACKOFF_DELAY, this->prefs.dst_params_low_latency.backoff_delay)) { - reroute = true; - } + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_CONNECT_CHECK_INTERVAL, this->prefs.dst_params_low_latency.connect_check_interval); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_TIMEOUT_CONNECT, this->prefs.dst_params_low_latency.timeout_connect); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_TIMEOUT_INACTIVITY, this->prefs.dst_params_low_latency.timeout_inactivity); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_TIMEOUT_SESSION, this->prefs.dst_params_low_latency.timeout_session); + routing_config_updated |= attr.get_rfc_value(JSON_BOOL_NAME_VOICE_DST_PARAMS_LOW_LATENCY_IPV4_FALLBACK, this->prefs.dst_params_low_latency.ipv4_fallback); + routing_config_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_DST_PARAMS_LOW_LATENCY_BACKOFF_DELAY, this->prefs.dst_params_low_latency.backoff_delay); std::vector obj_server_hosts; if(attr.get_rfc_value(JSON_ARRAY_NAME_VOICE_SERVER_HOSTS, obj_server_hosts)) { @@ -4078,9 +4091,12 @@ void ctrlm_voice_t::voice_rfc_retrieved_handler(const ctrlm_rfc_attr_t& attr) { this->voice_device_disable((ctrlm_voice_device_t)i, true, NULL); } } - reroute = true; + routing_config_updated = true; } - if(reroute) { + + XLOGD_INFO("routing config updated <%s>", routing_config_updated ? "YES" : "NO"); + + if(routing_config_updated) { this->voice_sdk_update_routes(); } } From b014bef7d85e5d04b73262d67be123de56ce9f9d Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 28 Apr 2026 13:28:06 -0400 Subject: [PATCH 2/5] fix copilot comments --- src/config/ctrlm_config.cpp | 2 +- src/voice/ctrlm_voice_obj.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/ctrlm_config.cpp b/src/config/ctrlm_config.cpp index 1e0544a1..d9a875d9 100644 --- a/src/config/ctrlm_config.cpp +++ b/src/config/ctrlm_config.cpp @@ -75,7 +75,7 @@ bool ctrlm_config_t::load_config(const std::string &file_path, bool local_config if(verbose) { XLOGD_INFO("config loaded successfully as JSON for <%s>", file_path.c_str()); } - this->local_config |= local_config; + this->local_config = local_config; ret = true; } else { XLOGD_ERROR("JSON ERROR: Line <%u> Column <%u> Text <%s> Contents <%s>", json_error.line, json_error.column, json_error.text, contents.c_str()); diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index 536e5d9e..35b5eaae 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -4016,7 +4016,7 @@ void ctrlm_voice_t::voice_rfc_retrieved_handler(const ctrlm_rfc_attr_t& attr) { audio_mode_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_DUCKING_TYPE, this->audio_ducking_type, CTRLM_VOICE_AUDIO_DUCKING_TYPE_ABSOLUTE, CTRLM_VOICE_AUDIO_DUCKING_TYPE_RELATIVE); audio_mode_updated |= attr.get_rfc_value(JSON_FLOAT_NAME_VOICE_AUDIO_DUCKING_LEVEL, this->audio_ducking_level, 0.0, 1.0); - // audio ducking beep is updated via Voice Control plugin so it cannot be overriden via RFC + // audio ducking beep is updated via Voice Control plugin so it cannot be overridden via RFC //audio_mode_updated |= attr.get_rfc_value(JSON_BOOL_NAME_VOICE_AUDIO_DUCKING_BEEP, this->audio_ducking_beep_enabled); XLOGD_INFO("audio mode updated <%s>", audio_mode_updated ? "YES" : "NO"); From 7c847c5e358192891c4982fd3ff9cdf80a8ac509 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 28 Apr 2026 13:42:01 -0400 Subject: [PATCH 3/5] add const to api --- src/config/ctrlm_config.cpp | 2 +- src/config/ctrlm_config.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/ctrlm_config.cpp b/src/config/ctrlm_config.cpp index d9a875d9..4d8f5404 100644 --- a/src/config/ctrlm_config.cpp +++ b/src/config/ctrlm_config.cpp @@ -125,7 +125,7 @@ bool ctrlm_config_t::path_exists(const std::string &path) { return(ctrlm_utils_json_from_path(this->root, path, false) != NULL ? true : false); } -bool ctrlm_config_t::has_local_config(void) { +bool ctrlm_config_t::has_local_config() const { return(this->local_config); } diff --git a/src/config/ctrlm_config.h b/src/config/ctrlm_config.h index 5b216978..765d07f0 100644 --- a/src/config/ctrlm_config.h +++ b/src/config/ctrlm_config.h @@ -60,7 +60,7 @@ class ctrlm_config_t { * Function to check if local config exists * @return True if the local config exists, else False */ - bool has_local_config(void); + bool has_local_config() const; /** * Function to check if object exists from a path * @param path A period seperated string used to navigate a JSON object i.e. "network_rf4ce.polling.enabled" From d6b20919825386de02df1dbaf8bfdb4569888403 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 28 Apr 2026 13:59:14 -0400 Subject: [PATCH 4/5] remove debug log --- src/rfc/ctrlm_rfc_attr.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/rfc/ctrlm_rfc_attr.cpp b/src/rfc/ctrlm_rfc_attr.cpp index 66943de3..f9e996bb 100644 --- a/src/rfc/ctrlm_rfc_attr.cpp +++ b/src/rfc/ctrlm_rfc_attr.cpp @@ -99,9 +99,7 @@ bool ctrlm_rfc_attr_t::check_config_file(const std::string &path) const { bool ret = false; ctrlm_config_t *config = ctrlm_config_t::get_instance(); if(config) { - if(!config->has_local_config()) { - XLOGD_DEBUG("local config file not in use"); - } else { + if(config->has_local_config()) { ret = config->path_exists(this->config_key + std::string(JSON_PATH_SEPERATOR) + path); if(ret) { XLOGD_WARN("%s exists in the config file", path.c_str()); From 8778863872900378c0d393eb1655951dc8a6d0fa Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 28 Apr 2026 14:12:10 -0400 Subject: [PATCH 5/5] ok, copilot you win. --- src/config/ctrlm_config.h | 4 ++++ src/voice/ctrlm_voice_obj.cpp | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/config/ctrlm_config.h b/src/config/ctrlm_config.h index 765d07f0..52951db9 100644 --- a/src/config/ctrlm_config.h +++ b/src/config/ctrlm_config.h @@ -47,12 +47,16 @@ class ctrlm_config_t { /** * Function which loads a configuration file into the configuration object. * @param file_path The path to the configuration file + * @param local_config True if the configuration file is a local config, else False + * @param verbose True to enable verbose logging, else False * @return True on success, otherwise False */ bool load_config(const std::string &file_path, bool local_config = false, bool verbose = false); /** * Function which appends a configuration file into the configuration object. * @param file_path The path to the configuration file + * @param local_config True if the configuration file is a local config, else False + * @param verbose True to enable verbose logging, else False * @return True on success, otherwise False */ bool append_config(const std::string &file_path, bool local_config = false, bool verbose = false); diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index 35b5eaae..d8d87159 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -4016,8 +4016,7 @@ void ctrlm_voice_t::voice_rfc_retrieved_handler(const ctrlm_rfc_attr_t& attr) { audio_mode_updated |= attr.get_rfc_value(JSON_INT_NAME_VOICE_AUDIO_DUCKING_TYPE, this->audio_ducking_type, CTRLM_VOICE_AUDIO_DUCKING_TYPE_ABSOLUTE, CTRLM_VOICE_AUDIO_DUCKING_TYPE_RELATIVE); audio_mode_updated |= attr.get_rfc_value(JSON_FLOAT_NAME_VOICE_AUDIO_DUCKING_LEVEL, this->audio_ducking_level, 0.0, 1.0); - // audio ducking beep is updated via Voice Control plugin so it cannot be overridden via RFC - //audio_mode_updated |= attr.get_rfc_value(JSON_BOOL_NAME_VOICE_AUDIO_DUCKING_BEEP, this->audio_ducking_beep_enabled); + // JSON_BOOL_NAME_VOICE_AUDIO_DUCKING_BEEP is updated via Voice Control plugin so it cannot be overridden via RFC XLOGD_INFO("audio mode updated <%s>", audio_mode_updated ? "YES" : "NO");