From a13564050f44489597710b4f408f4632c30e0f9b Mon Sep 17 00:00:00 2001 From: jthomp007c Date: Thu, 26 Feb 2026 20:07:07 +0000 Subject: [PATCH 1/9] RDKEMW-14445 : Add session end and protocol return to telemetry Reason for change: ctrlm currently does not know why xrsr might have ended a session. Also it does not know what protocol error may have occurred only that one did. Test Procedure: check telemetry for new fields, parse them, confirm that new data exists and is correct Priority: P0 Signed-off-by: Jason Thomson --- include/ctrlm_ipc_voice.h | 50 +++++++++---------- src/ble/ctrlm_ble_network.cpp | 8 +-- src/ble/ctrlm_ble_network.h | 2 +- src/ctrlm_utils.cpp | 22 ++++---- src/ctrlm_utils.h | 2 +- src/rf4ce/ctrlm_rf4ce_indication.cpp | 10 ++-- src/rf4ce/ctrlm_rf4ce_network.cpp | 4 +- src/voice/ctrlm_voice_obj.cpp | 26 +++++----- src/voice/ctrlm_voice_obj.h | 10 ++-- src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp | 4 +- .../ctrlm_voice_telemetry_events.cpp | 11 ++-- .../telemetry/ctrlm_voice_telemetry_events.h | 5 +- 12 files changed, 79 insertions(+), 75 deletions(-) diff --git a/include/ctrlm_ipc_voice.h b/include/ctrlm_ipc_voice.h index 270b92d9..5e9e13c4 100644 --- a/include/ctrlm_ipc_voice.h +++ b/include/ctrlm_ipc_voice.h @@ -98,17 +98,17 @@ typedef enum { /// @brief Voice Session End Reasons /// @details An enumeration of the reasons that cause a voice session to end. typedef enum { - CTRLM_VOICE_SESSION_END_REASON_DONE = 0, ///< Session completed normally - CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_FIRST_PACKET = 1, ///< Session ended due to timeout on the first audio sample - CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_INTERPACKET = 2, ///< Session ended due to timeout on a subsequent audio sample - CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_MAXIMUM = 3, ///< Session ended due to maximum duration - CTRLM_VOICE_SESSION_END_REASON_ADJACENT_KEY_PRESSED = 4, ///< Session ended due to adjacent key press - CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED = 5, ///< Session ended due to any other key press - CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR = 6, ///< Session ended due to any other reason - CTRLM_VOICE_SESSION_END_REASON_NEW_SESSION = 7, ///< Session ended due to a new voice session request before previous session is ended - CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS = 8, ///< Session ended due to low quality of service - CTRLM_VOICE_SESSION_END_REASON_MAX = 9 ///< Session End Reason maximum value -} ctrlm_voice_session_end_reason_t; + CTRLM_VOICE_SESSION_END_REASON_RCU_DONE = 0, ///< Session completed normally + CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_FIRST_PACKET = 1, ///< Session ended due to timeout on the first audio sample + CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_INTERPACKET = 2, ///< Session ended due to timeout on a subsequent audio sample + CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_MAXIMUM = 3, ///< Session ended due to maximum duration + CTRLM_VOICE_SESSION_END_REASON_RCU_ADJACENT_KEY_PRESSED = 4, ///< Session ended due to adjacent key press + CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED = 5, ///< Session ended due to any other key press + CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR = 6, ///< Session ended due to any other reason + CTRLM_VOICE_SESSION_END_REASON_RCU_NEW_SESSION = 7, ///< Session ended due to a new voice session request before previous session is ended + CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS = 8, ///< Session ended due to low quality of service + CTRLM_VOICE_SESSION_END_REASON_RCU_MAX = 9 ///< Session End Reason maximum value +} ctrlm_voice_session_end_reason_rcu_t; /// @brief Voice Session Abort Reasons /// @details An enumeration of the reasons that cause a voice session to be aborted. @@ -223,13 +223,13 @@ typedef struct { } ctrlm_voice_iarm_event_session_begin_t; typedef struct { - unsigned char api_revision; ///< The revision of this API. - ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound - ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound - ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote - unsigned long session_id; ///< A unique id for the voice session. - ctrlm_voice_session_end_reason_t reason; ///< The reason for ending - unsigned char is_voice_assistant; ///< Boolean indicating if the device is a far-field device (1) as opposed to a hand-held remote (0). + unsigned char api_revision; ///< The revision of this API. + ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound + ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound + ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote + unsigned long session_id; ///< A unique id for the voice session. + ctrlm_voice_session_end_reason_rcu_t reason; ///< The reason for ending session + unsigned char is_voice_assistant; ///< Boolean indicating if the device is a far-field device (1) as opposed to a hand-held remote (0). } ctrlm_voice_iarm_event_session_end_t; typedef struct { @@ -272,13 +272,13 @@ typedef struct { } ctrlm_voice_iarm_event_session_abort_t; typedef struct { - unsigned char api_revision; ///< The revision of this API. - ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound - ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound - ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote - unsigned long session_id; ///< A unique id for the voice session. - ctrlm_voice_session_end_reason_t reason; ///< The reason that the voice streaming ended - long return_code_internal; ///< Internally generated return code + unsigned char api_revision; ///< The revision of this API. + ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound + ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound + ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote + unsigned long session_id; ///< A unique id for the voice session. + ctrlm_voice_session_end_reason_rcu_t reason; ///< The reason that the voice streaming ended + long return_code_internal; ///< Internally generated return code } ctrlm_voice_iarm_event_session_short_t; typedef struct { diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index 03e1322f..ea6a01a1 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -583,7 +583,7 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si if (false == success) { XLOGD_TELEMETRY("Failed to start voice streaming, ending voice session..."); - end_voice_session_for_controller(ieee_address, CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR); + end_voice_session_for_controller(ieee_address, CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR); } else { dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; } @@ -595,7 +595,7 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si } } -bool ctrlm_obj_network_ble_t::end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_t reason, int32_t audioDuration, int32_t startLag, rdkx_timestamp_t *keyDownTime, rdkx_timestamp_t *keyUpTime) { +bool ctrlm_obj_network_ble_t::end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_rcu_t reason, int32_t audioDuration, int32_t startLag, rdkx_timestamp_t *keyDownTime, rdkx_timestamp_t *keyUpTime) { ctrlm_controller_id_t controller_id; if (!getControllerId(ieee_address, &controller_id)) { @@ -643,7 +643,7 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_end(void *data, int size XLOGD_ERROR("Controller doesn't exist!"); dqm->params->result = CTRLM_IARM_CALL_RESULT_ERROR_INVALID_PARAMETER; } else { - if (end_voice_session_for_controller(dqm->params->ieee_address, CTRLM_VOICE_SESSION_END_REASON_DONE)) { + if (end_voice_session_for_controller(dqm->params->ieee_address, CTRLM_VOICE_SESSION_END_REASON_RCU_DONE)) { dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; } } @@ -2306,7 +2306,7 @@ void ctrlm_obj_network_ble_t::ind_process_keypress(void *data, int size) { audioDuration = audioDurationKeys; } - end_voice_session_for_controller(dqm->ieee_address, CTRLM_VOICE_SESSION_END_REASON_DONE, audioDuration, startLag, &voiceStartTimeLocal, &keyUpTimeLocal); + end_voice_session_for_controller(dqm->ieee_address, CTRLM_VOICE_SESSION_END_REASON_RCU_DONE, audioDuration, startLag, &voiceStartTimeLocal, &keyUpTimeLocal); } } } diff --git a/src/ble/ctrlm_ble_network.h b/src/ble/ctrlm_ble_network.h index 1182889a..a78f91ef 100644 --- a/src/ble/ctrlm_ble_network.h +++ b/src/ble/ctrlm_ble_network.h @@ -207,7 +207,7 @@ class ctrlm_obj_network_ble_t : public ctrlm_obj_network_t { ctrlm_controller_id_t controller_add(ctrlm_hal_ble_rcu_data_t &rcu_data); ctrlm_controller_id_t controller_id_assign(void); ctrlm_controller_id_t get_last_used_controller(void); - bool end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_t reason, int32_t audioDuration = -1, int32_t startLag = -1, rdkx_timestamp_t *keyDownTime = NULL, rdkx_timestamp_t *keyUpTime = NULL); + bool end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_rcu_t reason, int32_t audioDuration = -1, int32_t startLag = -1, rdkx_timestamp_t *keyDownTime = NULL, rdkx_timestamp_t *keyUpTime = NULL); ctrlm_controller_id_t find_controller_from_upgrade_session_uuid(const std::string &uuid); json_t * json_config_ = NULL; diff --git a/src/ctrlm_utils.cpp b/src/ctrlm_utils.cpp index b77595ac..d7846f21 100644 --- a/src/ctrlm_utils.cpp +++ b/src/ctrlm_utils.cpp @@ -666,18 +666,18 @@ const char *ctrlm_voice_session_result_str(ctrlm_voice_session_result_t result) return(ctrlm_invalid_return(result)); } -const char *ctrlm_voice_session_end_reason_str(ctrlm_voice_session_end_reason_t reason) { +const char *ctrlm_voice_session_end_reason_rcu_str(ctrlm_voice_session_end_reason_rcu_t reason) { switch(reason) { - case CTRLM_VOICE_SESSION_END_REASON_DONE: return("DONE"); - case CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_FIRST_PACKET: return("TIMEOUT_FIRST_PACKET"); - case CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_INTERPACKET: return("TIMEOUT_INTERPACKET"); - case CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_MAXIMUM: return("TIMEOUT_MAXIMUM"); - case CTRLM_VOICE_SESSION_END_REASON_ADJACENT_KEY_PRESSED: return("ADJACENT_KEY_PRESSED"); - case CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED: return("OTHER_KEY_PRESSED"); - case CTRLM_VOICE_SESSION_END_REASON_NEW_SESSION: return("NEW_SESSION"); - case CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR: return("OTHER_ERROR"); - case CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS: return("MINIMUM_QOS"); - case CTRLM_VOICE_SESSION_END_REASON_MAX: return("MAX"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_DONE: return("DONE"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_FIRST_PACKET: return("TIMEOUT_FIRST_PACKET"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_INTERPACKET: return("TIMEOUT_INTERPACKET"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_MAXIMUM: return("TIMEOUT_MAXIMUM"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_ADJACENT_KEY_PRESSED: return("ADJACENT_KEY_PRESSED"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED: return("OTHER_KEY_PRESSED"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_NEW_SESSION: return("NEW_SESSION"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR: return("OTHER_ERROR"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS: return("MINIMUM_QOS"); + case CTRLM_VOICE_SESSION_END_REASON_RCU_MAX: return("MAX"); } return(ctrlm_invalid_return(reason)); } diff --git a/src/ctrlm_utils.h b/src/ctrlm_utils.h index baed40e7..b0a1f86d 100644 --- a/src/ctrlm_utils.h +++ b/src/ctrlm_utils.h @@ -186,7 +186,7 @@ const char *ctrlm_rcu_reverse_cmd_result_str(ctrlm_rcu_reverse_cmd_result_t resu const char *ctrlm_rcu_ir_remote_types_str(ctrlm_ir_remote_type controller_type); const char *ctrlm_voice_session_result_str(ctrlm_voice_session_result_t result); -const char *ctrlm_voice_session_end_reason_str(ctrlm_voice_session_end_reason_t reason); +const char *ctrlm_voice_session_end_reason_rcu_str(ctrlm_voice_session_end_reason_rcu_t reason); const char *ctrlm_voice_session_abort_reason_str(ctrlm_voice_session_abort_reason_t reason); const char *ctrlm_voice_internal_error_str(ctrlm_voice_internal_error_t error); const char *ctrlm_voice_reset_type_str(ctrlm_voice_reset_type_t reset_type); diff --git a/src/rf4ce/ctrlm_rf4ce_indication.cpp b/src/rf4ce/ctrlm_rf4ce_indication.cpp index 84e4eb20..39084154 100644 --- a/src/rf4ce/ctrlm_rf4ce_indication.cpp +++ b/src/rf4ce/ctrlm_rf4ce_indication.cpp @@ -414,7 +414,7 @@ ctrlm_hal_result_t ctrlm_voice_ind_data_rf4ce(ctrlm_network_id_t network_id, ctr msg.controller_id = controller_id; msg.timestamp = timestamp; - msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; + msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; msg.key_code = 0; ctrlm_main_queue_handler_push(CTRLM_HANDLER_NETWORK, (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::ind_process_voice_session_stop, &msg, sizeof(msg), NULL, network_id); @@ -436,17 +436,17 @@ ctrlm_hal_result_t ctrlm_voice_ind_data_rf4ce(ctrlm_network_id_t network_id, ctr msg.controller_id = controller_id; msg.timestamp = timestamp; - msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED; + msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED; msg.key_code = data[2]; ctrlm_main_queue_handler_push(CTRLM_HANDLER_NETWORK, (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::ind_process_voice_session_stop, &msg, sizeof(msg), NULL, network_id); } else { // CRTLM_VOICE_REMOTE_* - ctrlm_voice_session_end_reason_t session_end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; + ctrlm_voice_session_end_reason_rcu_t session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; if(reason == CRTLM_VOICE_REMOTE_VOICE_END_TIMEOUT_MAXIMUM) { - session_end_reason = CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_MAXIMUM; + session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_MAXIMUM; } else if(reason == CRTLM_VOICE_REMOTE_VOICE_END_MINIMUM_QOS) { - session_end_reason = CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS; + session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS; } ctrlm_main_queue_msg_voice_session_stop_t msg = {0}; diff --git a/src/rf4ce/ctrlm_rf4ce_network.cpp b/src/rf4ce/ctrlm_rf4ce_network.cpp index 5009c592..8901da9f 100644 --- a/src/rf4ce/ctrlm_rf4ce_network.cpp +++ b/src/rf4ce/ctrlm_rf4ce_network.cpp @@ -3890,8 +3890,8 @@ void ctrlm_obj_network_rf4ce_t::ind_process_voice_session_stop(void *data, int s } // Check adjacent key press - if(CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED == dqm->session_end_reason && true == is_key_adjacent(dqm->controller_id, dqm->key_code)) { - dqm->session_end_reason = CTRLM_VOICE_SESSION_END_REASON_ADJACENT_KEY_PRESSED; + if(CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED == dqm->session_end_reason && true == is_key_adjacent(dqm->controller_id, dqm->key_code)) { + dqm->session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_ADJACENT_KEY_PRESSED; XLOGD_INFO("Adjacent key press. Modifying end reason."); } diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index 1af6f059..8ddf30cd 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -95,7 +95,7 @@ ctrlm_voice_t::ctrlm_voice_t() { session->session_active_controller = false; session->state_src = CTRLM_VOICE_STATE_SRC_INVALID; session->state_dst = CTRLM_VOICE_STATE_DST_INVALID; - session->end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; + session->end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; session->audio_pipe[PIPE_READ] = -1; session->audio_pipe[PIPE_WRITE] = -1; @@ -1855,7 +1855,7 @@ bool ctrlm_voice_t::voice_session_data(ctrlm_network_id_t network_id, ctrlm_cont return(true); } -void ctrlm_voice_t::voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { +void ctrlm_voice_t::voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { ctrlm_voice_session_t *session = voice_session_from_controller(network_id, controller_id); if(session == NULL) { @@ -1865,8 +1865,8 @@ void ctrlm_voice_t::voice_session_end(ctrlm_network_id_t network_id, ctrlm_contr this->voice_session_end(session, reason, timestamp, stats); } -void ctrlm_voice_t::voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { - XLOGD_TELEMETRY("voice session end < %s >", ctrlm_voice_session_end_reason_str(reason)); +void ctrlm_voice_t::voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { + XLOGD_TELEMETRY("voice session end < %s >", ctrlm_voice_session_end_reason_rcu_str(reason)); if(session->state_src != CTRLM_VOICE_STATE_SRC_STREAMING) { XLOGD_ERROR("No voice session in progress"); return; @@ -2014,9 +2014,9 @@ void ctrlm_voice_t::voice_session_notify_stats() { void ctrlm_voice_t::voice_session_timeout() { ctrlm_voice_session_t *session = &this->voice_session[VOICE_SESSION_GROUP_DEFAULT]; session->timeout_packet_tag = 0; - ctrlm_voice_session_end_reason_t reason = CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_INTERPACKET; + ctrlm_voice_session_end_reason_rcu_t reason = CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_INTERPACKET; if(session->audio_sent_bytes == 0) { - reason = CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_FIRST_PACKET; + reason = CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_FIRST_PACKET; } else if(controller_supports_qos(session->voice_device)) { // Bitrate = transmitted PCM data size / elapsed time @@ -2026,9 +2026,9 @@ void ctrlm_voice_t::voice_session_timeout() { float rx_rate = (elapsed == 0) ? 0 : (session->audio_sent_samples * 2 * 8) / elapsed; XLOGD_AUTOMATION_INFO("elapsed time <%llu> ms rx samples <%u> rate <%6.1f> kbps", elapsed, session->audio_sent_samples, rx_rate); - reason = CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS; + reason = CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS; } - XLOGD_AUTOMATION_INFO("%s", ctrlm_voice_session_end_reason_str(reason)); + XLOGD_AUTOMATION_INFO("%s", ctrlm_voice_session_end_reason_rcu_str(reason)); this->voice_session_end(session, reason); } @@ -2522,7 +2522,7 @@ void ctrlm_voice_t::voice_session_begin_callback(ctrlm_voice_session_begin_cb_t session->ipc_common_data.voice_assistant = is_voice_assistant(session->voice_device); session->ipc_common_data.device_type = session->voice_device; session->endpoint_current = session_begin->endpoint; - session->end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; + session->end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; errno_t safec_rc = memset_s(&session->status, sizeof(session->status), 0 , sizeof(session->status)); ERR_CHK(safec_rc); @@ -2590,7 +2590,7 @@ void ctrlm_voice_t::voice_session_begin_callback(ctrlm_voice_session_begin_cb_t if (session->is_session_by_text) { XLOGD_WARN("src <%s> Ending voice session immediately because this is a text-only session", ctrlm_voice_device_str(session->voice_device)); - this->voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_DONE); + this->voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_RCU_DONE); } } @@ -2719,7 +2719,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses if(telemetry) { ctrlm_telemetry_event_t vs_marker(MARKER_VOICE_SESSION_TOTAL, 1); ctrlm_telemetry_event_t vs_status_marker(session_end->success ? MARKER_VOICE_SESSION_SUCCESS : MARKER_VOICE_SESSION_FAILURE, 1); - ctrlm_telemetry_event_t vs_end_reason_marker(MARKER_VOICE_END_REASON_PREFIX + std::string(ctrlm_voice_session_end_reason_str(session->end_reason)), 1); + ctrlm_telemetry_event_t vs_end_reason_marker(MARKER_VOICE_END_REASON_PREFIX + std::string(ctrlm_voice_session_end_reason_rcu_str(session->end_reason)), 1); ctrlm_telemetry_event_t vs_xrsr_end_reason_marker(MARKER_VOICE_XRSR_END_REASON_PREFIX + std::string(xrsr_session_end_reason_str(stats->reason)), 1); // Handle all VSRsp error telemetry @@ -2745,7 +2745,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses telemetry->event(ctrlm_telemetry_report_t::VOICE, vs_xrsr_end_reason_marker); if(this->prefs.telemetry_session_stats) { - if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason, stats->reason, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms)) { + if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason, stats->ret_code_protocol, stats->reason, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms)) { XLOGD_ERROR("failed to generate session stats event"); } } @@ -2763,7 +2763,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses session->session_active_server = false; if(session->state_src == CTRLM_VOICE_STATE_SRC_STREAMING) { - voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR); + voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR); } else if(!session->session_active_controller) { session->state_src = CTRLM_VOICE_STATE_SRC_READY; diff --git a/src/voice/ctrlm_voice_obj.h b/src/voice/ctrlm_voice_obj.h index c4395b18..8f419210 100644 --- a/src/voice/ctrlm_voice_obj.h +++ b/src/voice/ctrlm_voice_obj.h @@ -207,13 +207,13 @@ typedef struct { typedef struct { ctrlm_controller_id_t controller_id; ctrlm_timestamp_t timestamp; - ctrlm_voice_session_end_reason_t session_end_reason; + ctrlm_voice_session_end_reason_rcu_t session_end_reason; unsigned char key_code; } ctrlm_main_queue_msg_voice_session_stop_t; typedef struct { ctrlm_controller_id_t controller_id; - ctrlm_voice_session_end_reason_t reason; + ctrlm_voice_session_end_reason_rcu_t reason; unsigned char utterance_too_short; } ctrlm_main_queue_msg_voice_session_end_t; @@ -443,7 +443,7 @@ typedef struct { uint32_t packets_lost; uint32_t lqi_total; - ctrlm_voice_session_end_reason_t end_reason; + ctrlm_voice_session_end_reason_rcu_t end_reason; bool is_press_and_release; bool is_session_by_text; @@ -498,8 +498,8 @@ class ctrlm_voice_t { bool voice_session_data(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, const char *buffer, long unsigned int length, ctrlm_timestamp_t *timestamp=NULL, uint8_t *lqi=NULL); bool voice_session_data(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, int fd, const uuid_t *uuid=NULL); void voice_session_data_post_processing(int bytes_sent, const char *action, ctrlm_timestamp_t *timestamp); - void voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); - void voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); + void voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); + void voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); void voice_session_controller_stats_rxd_timeout(); void voice_session_stats(ctrlm_voice_stats_session_t session); void voice_session_stats(ctrlm_voice_stats_reboot_t reboot); diff --git a/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp b/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp index 6564ef4c..fb37092c 100644 --- a/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp +++ b/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp @@ -87,7 +87,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::stream_end(const ctrlm_voice_ipc_event_strea event.network_type = stream_end.common.network_type; event.controller_id = stream_end.common.controller_id; event.session_id = stream_end.common.session_id_ctrlm; - event.reason = (ctrlm_voice_session_end_reason_t)stream_end.reason; + event.reason = (ctrlm_voice_session_end_reason_rcu_t)stream_end.reason; event.is_voice_assistant = stream_end.common.voice_assistant ? 1 : 0; ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_END, &event, sizeof(event)); } @@ -153,7 +153,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::session_end(const ctrlm_voice_ipc_event_sess event.network_type = session_end.common.network_type; event.controller_id = session_end.common.controller_id; event.session_id = session_end.common.session_id_ctrlm; - event.reason = (ctrlm_voice_session_end_reason_t)session_end.reason; + event.reason = (ctrlm_voice_session_end_reason_rcu_t)session_end.reason; event.return_code_internal = session_end.return_code_internal; ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_SHORT, &event, sizeof(event)); break; diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp index e7ac6e71..027bf5b0 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp @@ -207,7 +207,8 @@ bool ctrlm_voice_telemetry_session_t::event() { ss << m_decoder_failures << ","; ss << m_samples_buffered_max << ","; ss << m_end_reason_stream << ","; - ss << m_end_reason_protocol << ","; + ss << m_end_reason_session << ","; + ss << m_ret_code_protocol << ","; ss << m_end_reason_server << ","; ss << "\"" << m_server_message << "\","; ss << m_result << "]]"; @@ -279,10 +280,11 @@ void ctrlm_voice_telemetry_session_t::update_on_stream_end(uint32_t time_stream_ } } -bool ctrlm_voice_telemetry_session_t::update_on_session_end(bool result, int32_t end_reason_stream, int32_t end_reason_protocol, int32_t end_reason_server, const std::string &server_message, int32_t time_stream_len_exp) { +bool ctrlm_voice_telemetry_session_t::update_on_session_end(bool result, int32_t end_reason_stream, int32_t end_reason_session, int32_t ret_code_protocol, int32_t end_reason_server, const std::string &server_message, int32_t time_stream_len_exp) { m_result = result; m_end_reason_stream = end_reason_stream; - m_end_reason_protocol = end_reason_protocol; + m_end_reason_session = end_reason_session; + m_ret_code_protocol = ret_code_protocol; m_end_reason_server = end_reason_server; m_server_message = server_message; @@ -311,7 +313,8 @@ void ctrlm_voice_telemetry_session_t::reset_stats() { m_samples_buffered_max = 0; m_end_reason_stream = 0; - m_end_reason_protocol = 0; + m_end_reason_session = 0; + m_ret_code_protocol = 0; m_end_reason_server = 0; m_result = false; diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.h b/src/voice/telemetry/ctrlm_voice_telemetry_events.h index d8bf90dd..b1c440df 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.h +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.h @@ -76,7 +76,7 @@ class ctrlm_voice_telemetry_session_t : public ctrlm_telemetry_event_t Date: Fri, 27 Feb 2026 16:50:02 +0000 Subject: [PATCH 2/9] Fixing whitespace --- src/voice/telemetry/ctrlm_voice_telemetry_events.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp index 027bf5b0..51afcc58 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp @@ -314,7 +314,7 @@ void ctrlm_voice_telemetry_session_t::reset_stats() { m_end_reason_stream = 0; m_end_reason_session = 0; - m_ret_code_protocol = 0; + m_ret_code_protocol = 0; m_end_reason_server = 0; m_result = false; From de369ac6c2e5e5b476e79dae178df5cc91de6689 Mon Sep 17 00:00:00 2001 From: jthomp007c Date: Fri, 27 Feb 2026 16:54:29 +0000 Subject: [PATCH 3/9] Order of vars --- src/voice/ctrlm_voice_obj.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index 8ddf30cd..fe4f8def 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -2745,7 +2745,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses telemetry->event(ctrlm_telemetry_report_t::VOICE, vs_xrsr_end_reason_marker); if(this->prefs.telemetry_session_stats) { - if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason, stats->ret_code_protocol, stats->reason, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms)) { + if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason, stats->reason, stats->ret_code_protocol, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms)) { XLOGD_ERROR("failed to generate session stats event"); } } From 185d5c0373127fe78e0a8efa50789f3793ca82a6 Mon Sep 17 00:00:00 2001 From: jthomp007c Date: Fri, 27 Feb 2026 17:08:19 +0000 Subject: [PATCH 4/9] Update telemetry markers version number --- src/telemetry/ctrlm_telemetry_markers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/ctrlm_telemetry_markers.h b/src/telemetry/ctrlm_telemetry_markers.h index 9c0ba3a3..23c0f775 100644 --- a/src/telemetry/ctrlm_telemetry_markers.h +++ b/src/telemetry/ctrlm_telemetry_markers.h @@ -117,7 +117,7 @@ // - server message. // - flag to indicate if session was successful. #define MARKER_VOICE_SESSION_STATS "ctrlm.voice.session.stats" -#define MARKER_VOICE_SESSION_STATS_VERSION "1" +#define MARKER_VOICE_SESSION_STATS_VERSION "2" // End Voice Session Statistics From 3fa6976f51eca7a7a4d72403437a322f1200a5a9 Mon Sep 17 00:00:00 2001 From: jthomp007c Date: Fri, 27 Feb 2026 17:44:07 +0000 Subject: [PATCH 5/9] Reverting enum name change --- include/ctrlm_ipc_voice.h | 26 +++++++++---------- src/ble/ctrlm_ble_network.cpp | 8 +++--- src/ble/ctrlm_ble_network.h | 2 +- src/ctrlm_utils.cpp | 22 ++++++++-------- src/ctrlm_utils.h | 2 +- src/rf4ce/ctrlm_rf4ce_indication.cpp | 10 +++---- src/rf4ce/ctrlm_rf4ce_network.cpp | 4 +-- src/voice/ctrlm_voice_obj.cpp | 24 ++++++++--------- src/voice/ctrlm_voice_obj.h | 10 +++---- src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp | 4 +-- 10 files changed, 56 insertions(+), 56 deletions(-) diff --git a/include/ctrlm_ipc_voice.h b/include/ctrlm_ipc_voice.h index 5e9e13c4..d4891a53 100644 --- a/include/ctrlm_ipc_voice.h +++ b/include/ctrlm_ipc_voice.h @@ -98,17 +98,17 @@ typedef enum { /// @brief Voice Session End Reasons /// @details An enumeration of the reasons that cause a voice session to end. typedef enum { - CTRLM_VOICE_SESSION_END_REASON_RCU_DONE = 0, ///< Session completed normally - CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_FIRST_PACKET = 1, ///< Session ended due to timeout on the first audio sample - CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_INTERPACKET = 2, ///< Session ended due to timeout on a subsequent audio sample - CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_MAXIMUM = 3, ///< Session ended due to maximum duration - CTRLM_VOICE_SESSION_END_REASON_RCU_ADJACENT_KEY_PRESSED = 4, ///< Session ended due to adjacent key press - CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED = 5, ///< Session ended due to any other key press - CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR = 6, ///< Session ended due to any other reason - CTRLM_VOICE_SESSION_END_REASON_RCU_NEW_SESSION = 7, ///< Session ended due to a new voice session request before previous session is ended - CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS = 8, ///< Session ended due to low quality of service - CTRLM_VOICE_SESSION_END_REASON_RCU_MAX = 9 ///< Session End Reason maximum value -} ctrlm_voice_session_end_reason_rcu_t; + CTRLM_VOICE_SESSION_END_REASON_DONE = 0, ///< Session completed normally + CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_FIRST_PACKET = 1, ///< Session ended due to timeout on the first audio sample + CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_INTERPACKET = 2, ///< Session ended due to timeout on a subsequent audio sample + CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_MAXIMUM = 3, ///< Session ended due to maximum duration + CTRLM_VOICE_SESSION_END_REASON_ADJACENT_KEY_PRESSED = 4, ///< Session ended due to adjacent key press + CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED = 5, ///< Session ended due to any other key press + CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR = 6, ///< Session ended due to any other reason + CTRLM_VOICE_SESSION_END_REASON_NEW_SESSION = 7, ///< Session ended due to a new voice session request before previous session is ended + CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS = 8, ///< Session ended due to low quality of service + CTRLM_VOICE_SESSION_END_REASON_MAX = 9 ///< Session End Reason maximum value +} ctrlm_voice_session_end_reason_t; /// @brief Voice Session Abort Reasons /// @details An enumeration of the reasons that cause a voice session to be aborted. @@ -228,7 +228,7 @@ typedef struct { ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote unsigned long session_id; ///< A unique id for the voice session. - ctrlm_voice_session_end_reason_rcu_t reason; ///< The reason for ending session + ctrlm_voice_session_end_reason_t reason; ///< The reason for ending session unsigned char is_voice_assistant; ///< Boolean indicating if the device is a far-field device (1) as opposed to a hand-held remote (0). } ctrlm_voice_iarm_event_session_end_t; @@ -277,7 +277,7 @@ typedef struct { ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote unsigned long session_id; ///< A unique id for the voice session. - ctrlm_voice_session_end_reason_rcu_t reason; ///< The reason that the voice streaming ended + ctrlm_voice_session_end_reason_t reason; ///< The reason that the voice streaming ended long return_code_internal; ///< Internally generated return code } ctrlm_voice_iarm_event_session_short_t; diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index ea6a01a1..03e1322f 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -583,7 +583,7 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si if (false == success) { XLOGD_TELEMETRY("Failed to start voice streaming, ending voice session..."); - end_voice_session_for_controller(ieee_address, CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR); + end_voice_session_for_controller(ieee_address, CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR); } else { dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; } @@ -595,7 +595,7 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si } } -bool ctrlm_obj_network_ble_t::end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_rcu_t reason, int32_t audioDuration, int32_t startLag, rdkx_timestamp_t *keyDownTime, rdkx_timestamp_t *keyUpTime) { +bool ctrlm_obj_network_ble_t::end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_t reason, int32_t audioDuration, int32_t startLag, rdkx_timestamp_t *keyDownTime, rdkx_timestamp_t *keyUpTime) { ctrlm_controller_id_t controller_id; if (!getControllerId(ieee_address, &controller_id)) { @@ -643,7 +643,7 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_end(void *data, int size XLOGD_ERROR("Controller doesn't exist!"); dqm->params->result = CTRLM_IARM_CALL_RESULT_ERROR_INVALID_PARAMETER; } else { - if (end_voice_session_for_controller(dqm->params->ieee_address, CTRLM_VOICE_SESSION_END_REASON_RCU_DONE)) { + if (end_voice_session_for_controller(dqm->params->ieee_address, CTRLM_VOICE_SESSION_END_REASON_DONE)) { dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; } } @@ -2306,7 +2306,7 @@ void ctrlm_obj_network_ble_t::ind_process_keypress(void *data, int size) { audioDuration = audioDurationKeys; } - end_voice_session_for_controller(dqm->ieee_address, CTRLM_VOICE_SESSION_END_REASON_RCU_DONE, audioDuration, startLag, &voiceStartTimeLocal, &keyUpTimeLocal); + end_voice_session_for_controller(dqm->ieee_address, CTRLM_VOICE_SESSION_END_REASON_DONE, audioDuration, startLag, &voiceStartTimeLocal, &keyUpTimeLocal); } } } diff --git a/src/ble/ctrlm_ble_network.h b/src/ble/ctrlm_ble_network.h index a78f91ef..1182889a 100644 --- a/src/ble/ctrlm_ble_network.h +++ b/src/ble/ctrlm_ble_network.h @@ -207,7 +207,7 @@ class ctrlm_obj_network_ble_t : public ctrlm_obj_network_t { ctrlm_controller_id_t controller_add(ctrlm_hal_ble_rcu_data_t &rcu_data); ctrlm_controller_id_t controller_id_assign(void); ctrlm_controller_id_t get_last_used_controller(void); - bool end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_rcu_t reason, int32_t audioDuration = -1, int32_t startLag = -1, rdkx_timestamp_t *keyDownTime = NULL, rdkx_timestamp_t *keyUpTime = NULL); + bool end_voice_session_for_controller(uint64_t ieee_address, ctrlm_voice_session_end_reason_t reason, int32_t audioDuration = -1, int32_t startLag = -1, rdkx_timestamp_t *keyDownTime = NULL, rdkx_timestamp_t *keyUpTime = NULL); ctrlm_controller_id_t find_controller_from_upgrade_session_uuid(const std::string &uuid); json_t * json_config_ = NULL; diff --git a/src/ctrlm_utils.cpp b/src/ctrlm_utils.cpp index d7846f21..b77595ac 100644 --- a/src/ctrlm_utils.cpp +++ b/src/ctrlm_utils.cpp @@ -666,18 +666,18 @@ const char *ctrlm_voice_session_result_str(ctrlm_voice_session_result_t result) return(ctrlm_invalid_return(result)); } -const char *ctrlm_voice_session_end_reason_rcu_str(ctrlm_voice_session_end_reason_rcu_t reason) { +const char *ctrlm_voice_session_end_reason_str(ctrlm_voice_session_end_reason_t reason) { switch(reason) { - case CTRLM_VOICE_SESSION_END_REASON_RCU_DONE: return("DONE"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_FIRST_PACKET: return("TIMEOUT_FIRST_PACKET"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_INTERPACKET: return("TIMEOUT_INTERPACKET"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_MAXIMUM: return("TIMEOUT_MAXIMUM"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_ADJACENT_KEY_PRESSED: return("ADJACENT_KEY_PRESSED"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED: return("OTHER_KEY_PRESSED"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_NEW_SESSION: return("NEW_SESSION"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR: return("OTHER_ERROR"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS: return("MINIMUM_QOS"); - case CTRLM_VOICE_SESSION_END_REASON_RCU_MAX: return("MAX"); + case CTRLM_VOICE_SESSION_END_REASON_DONE: return("DONE"); + case CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_FIRST_PACKET: return("TIMEOUT_FIRST_PACKET"); + case CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_INTERPACKET: return("TIMEOUT_INTERPACKET"); + case CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_MAXIMUM: return("TIMEOUT_MAXIMUM"); + case CTRLM_VOICE_SESSION_END_REASON_ADJACENT_KEY_PRESSED: return("ADJACENT_KEY_PRESSED"); + case CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED: return("OTHER_KEY_PRESSED"); + case CTRLM_VOICE_SESSION_END_REASON_NEW_SESSION: return("NEW_SESSION"); + case CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR: return("OTHER_ERROR"); + case CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS: return("MINIMUM_QOS"); + case CTRLM_VOICE_SESSION_END_REASON_MAX: return("MAX"); } return(ctrlm_invalid_return(reason)); } diff --git a/src/ctrlm_utils.h b/src/ctrlm_utils.h index b0a1f86d..baed40e7 100644 --- a/src/ctrlm_utils.h +++ b/src/ctrlm_utils.h @@ -186,7 +186,7 @@ const char *ctrlm_rcu_reverse_cmd_result_str(ctrlm_rcu_reverse_cmd_result_t resu const char *ctrlm_rcu_ir_remote_types_str(ctrlm_ir_remote_type controller_type); const char *ctrlm_voice_session_result_str(ctrlm_voice_session_result_t result); -const char *ctrlm_voice_session_end_reason_rcu_str(ctrlm_voice_session_end_reason_rcu_t reason); +const char *ctrlm_voice_session_end_reason_str(ctrlm_voice_session_end_reason_t reason); const char *ctrlm_voice_session_abort_reason_str(ctrlm_voice_session_abort_reason_t reason); const char *ctrlm_voice_internal_error_str(ctrlm_voice_internal_error_t error); const char *ctrlm_voice_reset_type_str(ctrlm_voice_reset_type_t reset_type); diff --git a/src/rf4ce/ctrlm_rf4ce_indication.cpp b/src/rf4ce/ctrlm_rf4ce_indication.cpp index 39084154..84e4eb20 100644 --- a/src/rf4ce/ctrlm_rf4ce_indication.cpp +++ b/src/rf4ce/ctrlm_rf4ce_indication.cpp @@ -414,7 +414,7 @@ ctrlm_hal_result_t ctrlm_voice_ind_data_rf4ce(ctrlm_network_id_t network_id, ctr msg.controller_id = controller_id; msg.timestamp = timestamp; - msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; + msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; msg.key_code = 0; ctrlm_main_queue_handler_push(CTRLM_HANDLER_NETWORK, (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::ind_process_voice_session_stop, &msg, sizeof(msg), NULL, network_id); @@ -436,17 +436,17 @@ ctrlm_hal_result_t ctrlm_voice_ind_data_rf4ce(ctrlm_network_id_t network_id, ctr msg.controller_id = controller_id; msg.timestamp = timestamp; - msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED; + msg.session_end_reason = CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED; msg.key_code = data[2]; ctrlm_main_queue_handler_push(CTRLM_HANDLER_NETWORK, (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::ind_process_voice_session_stop, &msg, sizeof(msg), NULL, network_id); } else { // CRTLM_VOICE_REMOTE_* - ctrlm_voice_session_end_reason_rcu_t session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; + ctrlm_voice_session_end_reason_t session_end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; if(reason == CRTLM_VOICE_REMOTE_VOICE_END_TIMEOUT_MAXIMUM) { - session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_MAXIMUM; + session_end_reason = CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_MAXIMUM; } else if(reason == CRTLM_VOICE_REMOTE_VOICE_END_MINIMUM_QOS) { - session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS; + session_end_reason = CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS; } ctrlm_main_queue_msg_voice_session_stop_t msg = {0}; diff --git a/src/rf4ce/ctrlm_rf4ce_network.cpp b/src/rf4ce/ctrlm_rf4ce_network.cpp index 8901da9f..5009c592 100644 --- a/src/rf4ce/ctrlm_rf4ce_network.cpp +++ b/src/rf4ce/ctrlm_rf4ce_network.cpp @@ -3890,8 +3890,8 @@ void ctrlm_obj_network_rf4ce_t::ind_process_voice_session_stop(void *data, int s } // Check adjacent key press - if(CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_KEY_PRESSED == dqm->session_end_reason && true == is_key_adjacent(dqm->controller_id, dqm->key_code)) { - dqm->session_end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_ADJACENT_KEY_PRESSED; + if(CTRLM_VOICE_SESSION_END_REASON_OTHER_KEY_PRESSED == dqm->session_end_reason && true == is_key_adjacent(dqm->controller_id, dqm->key_code)) { + dqm->session_end_reason = CTRLM_VOICE_SESSION_END_REASON_ADJACENT_KEY_PRESSED; XLOGD_INFO("Adjacent key press. Modifying end reason."); } diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index fe4f8def..06ba45bb 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -95,7 +95,7 @@ ctrlm_voice_t::ctrlm_voice_t() { session->session_active_controller = false; session->state_src = CTRLM_VOICE_STATE_SRC_INVALID; session->state_dst = CTRLM_VOICE_STATE_DST_INVALID; - session->end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; + session->end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; session->audio_pipe[PIPE_READ] = -1; session->audio_pipe[PIPE_WRITE] = -1; @@ -1855,7 +1855,7 @@ bool ctrlm_voice_t::voice_session_data(ctrlm_network_id_t network_id, ctrlm_cont return(true); } -void ctrlm_voice_t::voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { +void ctrlm_voice_t::voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { ctrlm_voice_session_t *session = voice_session_from_controller(network_id, controller_id); if(session == NULL) { @@ -1865,8 +1865,8 @@ void ctrlm_voice_t::voice_session_end(ctrlm_network_id_t network_id, ctrlm_contr this->voice_session_end(session, reason, timestamp, stats); } -void ctrlm_voice_t::voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { - XLOGD_TELEMETRY("voice session end < %s >", ctrlm_voice_session_end_reason_rcu_str(reason)); +void ctrlm_voice_t::voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp, ctrlm_voice_session_end_stats_t *stats) { + XLOGD_TELEMETRY("voice session end < %s >", ctrlm_voice_session_end_reason_str(reason)); if(session->state_src != CTRLM_VOICE_STATE_SRC_STREAMING) { XLOGD_ERROR("No voice session in progress"); return; @@ -2014,9 +2014,9 @@ void ctrlm_voice_t::voice_session_notify_stats() { void ctrlm_voice_t::voice_session_timeout() { ctrlm_voice_session_t *session = &this->voice_session[VOICE_SESSION_GROUP_DEFAULT]; session->timeout_packet_tag = 0; - ctrlm_voice_session_end_reason_rcu_t reason = CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_INTERPACKET; + ctrlm_voice_session_end_reason_t reason = CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_INTERPACKET; if(session->audio_sent_bytes == 0) { - reason = CTRLM_VOICE_SESSION_END_REASON_RCU_TIMEOUT_FIRST_PACKET; + reason = CTRLM_VOICE_SESSION_END_REASON_TIMEOUT_FIRST_PACKET; } else if(controller_supports_qos(session->voice_device)) { // Bitrate = transmitted PCM data size / elapsed time @@ -2026,9 +2026,9 @@ void ctrlm_voice_t::voice_session_timeout() { float rx_rate = (elapsed == 0) ? 0 : (session->audio_sent_samples * 2 * 8) / elapsed; XLOGD_AUTOMATION_INFO("elapsed time <%llu> ms rx samples <%u> rate <%6.1f> kbps", elapsed, session->audio_sent_samples, rx_rate); - reason = CTRLM_VOICE_SESSION_END_REASON_RCU_MINIMUM_QOS; + reason = CTRLM_VOICE_SESSION_END_REASON_MINIMUM_QOS; } - XLOGD_AUTOMATION_INFO("%s", ctrlm_voice_session_end_reason_rcu_str(reason)); + XLOGD_AUTOMATION_INFO("%s", ctrlm_voice_session_end_reason_str(reason)); this->voice_session_end(session, reason); } @@ -2522,7 +2522,7 @@ void ctrlm_voice_t::voice_session_begin_callback(ctrlm_voice_session_begin_cb_t session->ipc_common_data.voice_assistant = is_voice_assistant(session->voice_device); session->ipc_common_data.device_type = session->voice_device; session->endpoint_current = session_begin->endpoint; - session->end_reason = CTRLM_VOICE_SESSION_END_REASON_RCU_DONE; + session->end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; errno_t safec_rc = memset_s(&session->status, sizeof(session->status), 0 , sizeof(session->status)); ERR_CHK(safec_rc); @@ -2590,7 +2590,7 @@ void ctrlm_voice_t::voice_session_begin_callback(ctrlm_voice_session_begin_cb_t if (session->is_session_by_text) { XLOGD_WARN("src <%s> Ending voice session immediately because this is a text-only session", ctrlm_voice_device_str(session->voice_device)); - this->voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_RCU_DONE); + this->voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_DONE); } } @@ -2719,7 +2719,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses if(telemetry) { ctrlm_telemetry_event_t vs_marker(MARKER_VOICE_SESSION_TOTAL, 1); ctrlm_telemetry_event_t vs_status_marker(session_end->success ? MARKER_VOICE_SESSION_SUCCESS : MARKER_VOICE_SESSION_FAILURE, 1); - ctrlm_telemetry_event_t vs_end_reason_marker(MARKER_VOICE_END_REASON_PREFIX + std::string(ctrlm_voice_session_end_reason_rcu_str(session->end_reason)), 1); + ctrlm_telemetry_event_t vs_end_reason_marker(MARKER_VOICE_END_REASON_PREFIX + std::string(ctrlm_voice_session_end_reason_str(session->end_reason)), 1); ctrlm_telemetry_event_t vs_xrsr_end_reason_marker(MARKER_VOICE_XRSR_END_REASON_PREFIX + std::string(xrsr_session_end_reason_str(stats->reason)), 1); // Handle all VSRsp error telemetry @@ -2763,7 +2763,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses session->session_active_server = false; if(session->state_src == CTRLM_VOICE_STATE_SRC_STREAMING) { - voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_RCU_OTHER_ERROR); + voice_session_end(session, CTRLM_VOICE_SESSION_END_REASON_OTHER_ERROR); } else if(!session->session_active_controller) { session->state_src = CTRLM_VOICE_STATE_SRC_READY; diff --git a/src/voice/ctrlm_voice_obj.h b/src/voice/ctrlm_voice_obj.h index 8f419210..c4395b18 100644 --- a/src/voice/ctrlm_voice_obj.h +++ b/src/voice/ctrlm_voice_obj.h @@ -207,13 +207,13 @@ typedef struct { typedef struct { ctrlm_controller_id_t controller_id; ctrlm_timestamp_t timestamp; - ctrlm_voice_session_end_reason_rcu_t session_end_reason; + ctrlm_voice_session_end_reason_t session_end_reason; unsigned char key_code; } ctrlm_main_queue_msg_voice_session_stop_t; typedef struct { ctrlm_controller_id_t controller_id; - ctrlm_voice_session_end_reason_rcu_t reason; + ctrlm_voice_session_end_reason_t reason; unsigned char utterance_too_short; } ctrlm_main_queue_msg_voice_session_end_t; @@ -443,7 +443,7 @@ typedef struct { uint32_t packets_lost; uint32_t lqi_total; - ctrlm_voice_session_end_reason_rcu_t end_reason; + ctrlm_voice_session_end_reason_t end_reason; bool is_press_and_release; bool is_session_by_text; @@ -498,8 +498,8 @@ class ctrlm_voice_t { bool voice_session_data(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, const char *buffer, long unsigned int length, ctrlm_timestamp_t *timestamp=NULL, uint8_t *lqi=NULL); bool voice_session_data(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, int fd, const uuid_t *uuid=NULL); void voice_session_data_post_processing(int bytes_sent, const char *action, ctrlm_timestamp_t *timestamp); - void voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); - void voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_rcu_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); + void voice_session_end(ctrlm_network_id_t network_id, ctrlm_controller_id_t controller_id, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); + void voice_session_end(ctrlm_voice_session_t *session, ctrlm_voice_session_end_reason_t reason, ctrlm_timestamp_t *timestamp=NULL, ctrlm_voice_session_end_stats_t *stats=NULL); void voice_session_controller_stats_rxd_timeout(); void voice_session_stats(ctrlm_voice_stats_session_t session); void voice_session_stats(ctrlm_voice_stats_reboot_t reboot); diff --git a/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp b/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp index fb37092c..6564ef4c 100644 --- a/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp +++ b/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp @@ -87,7 +87,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::stream_end(const ctrlm_voice_ipc_event_strea event.network_type = stream_end.common.network_type; event.controller_id = stream_end.common.controller_id; event.session_id = stream_end.common.session_id_ctrlm; - event.reason = (ctrlm_voice_session_end_reason_rcu_t)stream_end.reason; + event.reason = (ctrlm_voice_session_end_reason_t)stream_end.reason; event.is_voice_assistant = stream_end.common.voice_assistant ? 1 : 0; ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_END, &event, sizeof(event)); } @@ -153,7 +153,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::session_end(const ctrlm_voice_ipc_event_sess event.network_type = session_end.common.network_type; event.controller_id = session_end.common.controller_id; event.session_id = session_end.common.session_id_ctrlm; - event.reason = (ctrlm_voice_session_end_reason_rcu_t)session_end.reason; + event.reason = (ctrlm_voice_session_end_reason_t)session_end.reason; event.return_code_internal = session_end.return_code_internal; ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_SHORT, &event, sizeof(event)); break; From 7d7d37703daec8d154558a0a60ec781b95328f49 Mon Sep 17 00:00:00 2001 From: jthomp007c Date: Fri, 27 Feb 2026 18:42:22 +0000 Subject: [PATCH 6/9] Renaming vars for clarity, reordering vars for consistency --- src/voice/ctrlm_voice_obj.cpp | 14 +++++++------- src/voice/ctrlm_voice_obj.h | 2 +- .../telemetry/ctrlm_voice_telemetry_events.cpp | 17 +++++++++-------- .../telemetry/ctrlm_voice_telemetry_events.h | 6 +++--- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index 06ba45bb..050f4226 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -95,7 +95,7 @@ ctrlm_voice_t::ctrlm_voice_t() { session->session_active_controller = false; session->state_src = CTRLM_VOICE_STATE_SRC_INVALID; session->state_dst = CTRLM_VOICE_STATE_DST_INVALID; - session->end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; + session->end_reason_rcu = CTRLM_VOICE_SESSION_END_REASON_DONE; session->audio_pipe[PIPE_READ] = -1; session->audio_pipe[PIPE_WRITE] = -1; @@ -1872,7 +1872,7 @@ void ctrlm_voice_t::voice_session_end(ctrlm_voice_session_t *session, ctrlm_voic return; } - session->end_reason = reason; + session->end_reason_rcu = reason; if(timestamp != NULL) { session->session_timing.ctrl_stop = *timestamp; @@ -2522,7 +2522,7 @@ void ctrlm_voice_t::voice_session_begin_callback(ctrlm_voice_session_begin_cb_t session->ipc_common_data.voice_assistant = is_voice_assistant(session->voice_device); session->ipc_common_data.device_type = session->voice_device; session->endpoint_current = session_begin->endpoint; - session->end_reason = CTRLM_VOICE_SESSION_END_REASON_DONE; + session->end_reason_rcu = CTRLM_VOICE_SESSION_END_REASON_DONE; errno_t safec_rc = memset_s(&session->status, sizeof(session->status), 0 , sizeof(session->status)); ERR_CHK(safec_rc); @@ -2661,7 +2661,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses ctrlm_voice_ipc_event_session_end_t end; end.common = session->ipc_common_data; end.result = SESSION_END_SHORT_UTTERANCE; - end.reason = (int)session->end_reason; + end.reason = (int)session->end_reason_rcu; this->voice_ipc->session_end(end); } else { ctrlm_voice_ipc_event_session_end_server_stats_t server_stats; @@ -2719,7 +2719,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses if(telemetry) { ctrlm_telemetry_event_t vs_marker(MARKER_VOICE_SESSION_TOTAL, 1); ctrlm_telemetry_event_t vs_status_marker(session_end->success ? MARKER_VOICE_SESSION_SUCCESS : MARKER_VOICE_SESSION_FAILURE, 1); - ctrlm_telemetry_event_t vs_end_reason_marker(MARKER_VOICE_END_REASON_PREFIX + std::string(ctrlm_voice_session_end_reason_str(session->end_reason)), 1); + ctrlm_telemetry_event_t vs_end_reason_marker(MARKER_VOICE_END_REASON_PREFIX + std::string(ctrlm_voice_session_end_reason_str(session->end_reason_rcu)), 1); ctrlm_telemetry_event_t vs_xrsr_end_reason_marker(MARKER_VOICE_XRSR_END_REASON_PREFIX + std::string(xrsr_session_end_reason_str(stats->reason)), 1); // Handle all VSRsp error telemetry @@ -2745,7 +2745,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses telemetry->event(ctrlm_telemetry_report_t::VOICE, vs_xrsr_end_reason_marker); if(this->prefs.telemetry_session_stats) { - if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason, stats->reason, stats->ret_code_protocol, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms)) { + if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason_rcu, stats->reason, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms, stats->ret_code_protocol)) { XLOGD_ERROR("failed to generate session stats event"); } } @@ -2980,7 +2980,7 @@ void ctrlm_voice_t::voice_stream_end_callback(ctrlm_voice_stream_end_cb_t *strea // This is a STREAM end.. ctrlm_voice_ipc_event_stream_end_t end; end.common = session->ipc_common_data; - end.reason = (int)session->end_reason; + end.reason = (int)session->end_reason_rcu; this->voice_ipc->stream_end(end); } diff --git a/src/voice/ctrlm_voice_obj.h b/src/voice/ctrlm_voice_obj.h index c4395b18..38699a6b 100644 --- a/src/voice/ctrlm_voice_obj.h +++ b/src/voice/ctrlm_voice_obj.h @@ -443,7 +443,7 @@ typedef struct { uint32_t packets_lost; uint32_t lqi_total; - ctrlm_voice_session_end_reason_t end_reason; + ctrlm_voice_session_end_reason_t end_reason_rcu; bool is_press_and_release; bool is_session_by_text; diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp index 51afcc58..b85c6a34 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp @@ -206,12 +206,13 @@ bool ctrlm_voice_telemetry_session_t::event() { ss << m_samples_lost << ","; ss << m_decoder_failures << ","; ss << m_samples_buffered_max << ","; - ss << m_end_reason_stream << ","; + ss << m_end_reason_rcu << ","; ss << m_end_reason_session << ","; - ss << m_ret_code_protocol << ","; ss << m_end_reason_server << ","; ss << "\"" << m_server_message << "\","; - ss << m_result << "]]"; + ss << m_result << ","; + ss << m_ret_code_protocol << "]]"; + if(m_event_list.length() + ss.str().length() > m_event_list_max_size) { // Maximum data size exceeded XLOGD_WARN("telemetry event exceeds max size <%s,%s>", val_marker.c_str(), ss.str().c_str()); @@ -280,13 +281,13 @@ void ctrlm_voice_telemetry_session_t::update_on_stream_end(uint32_t time_stream_ } } -bool ctrlm_voice_telemetry_session_t::update_on_session_end(bool result, int32_t end_reason_stream, int32_t end_reason_session, int32_t ret_code_protocol, int32_t end_reason_server, const std::string &server_message, int32_t time_stream_len_exp) { +bool ctrlm_voice_telemetry_session_t::update_on_session_end(bool result, int32_t end_reason_rcu, int32_t end_reason_session, int32_t end_reason_server, const std::string &server_message, int32_t time_stream_len_exp, int32_t ret_code_protocol) { m_result = result; - m_end_reason_stream = end_reason_stream; + m_end_reason_rcu = end_reason_rcu; m_end_reason_session = end_reason_session; - m_ret_code_protocol = ret_code_protocol; m_end_reason_server = end_reason_server; m_server_message = server_message; + m_ret_code_protocol = ret_code_protocol; if(!m_has_key_release) { // if there is no key release, the start time and end time are not known rdkx_timestamp_get(&m_time_prev_session_end); @@ -312,11 +313,11 @@ void ctrlm_voice_telemetry_session_t::reset_stats() { m_decoder_failures = 0; m_samples_buffered_max = 0; - m_end_reason_stream = 0; + m_end_reason_rcu = 0; m_end_reason_session = 0; - m_ret_code_protocol = 0; m_end_reason_server = 0; m_result = false; + m_ret_code_protocol = 0; m_server_message.clear(); m_device_type.clear(); diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.h b/src/voice/telemetry/ctrlm_voice_telemetry_events.h index b1c440df..1a349ecd 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.h +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.h @@ -76,7 +76,7 @@ class ctrlm_voice_telemetry_session_t : public ctrlm_telemetry_event_t Date: Fri, 27 Feb 2026 18:50:15 +0000 Subject: [PATCH 7/9] Fix whitespace --- include/ctrlm_ipc_voice.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/include/ctrlm_ipc_voice.h b/include/ctrlm_ipc_voice.h index d4891a53..665ffaa5 100644 --- a/include/ctrlm_ipc_voice.h +++ b/include/ctrlm_ipc_voice.h @@ -223,13 +223,13 @@ typedef struct { } ctrlm_voice_iarm_event_session_begin_t; typedef struct { - unsigned char api_revision; ///< The revision of this API. - ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound - ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound - ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote - unsigned long session_id; ///< A unique id for the voice session. + unsigned char api_revision; ///< The revision of this API. + ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound + ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound + ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote + unsigned long session_id; ///< A unique id for the voice session. ctrlm_voice_session_end_reason_t reason; ///< The reason for ending session - unsigned char is_voice_assistant; ///< Boolean indicating if the device is a far-field device (1) as opposed to a hand-held remote (0). + unsigned char is_voice_assistant; ///< Boolean indicating if the device is a far-field device (1) as opposed to a hand-held remote (0). } ctrlm_voice_iarm_event_session_end_t; typedef struct { @@ -272,13 +272,13 @@ typedef struct { } ctrlm_voice_iarm_event_session_abort_t; typedef struct { - unsigned char api_revision; ///< The revision of this API. - ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound - ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound - ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote - unsigned long session_id; ///< A unique id for the voice session. + unsigned char api_revision; ///< The revision of this API. + ctrlm_network_id_t network_id; ///< Identifier of network on which the controller is bound + ctrlm_network_type_t network_type; ///< Type of network on which the controller is bound + ctrlm_controller_id_t controller_id; ///< A unique identifier of the remote + unsigned long session_id; ///< A unique id for the voice session. ctrlm_voice_session_end_reason_t reason; ///< The reason that the voice streaming ended - long return_code_internal; ///< Internally generated return code + long return_code_internal; ///< Internally generated return code } ctrlm_voice_iarm_event_session_short_t; typedef struct { From d34efb831221b16dba46361649eb8c8c3183afbc Mon Sep 17 00:00:00 2001 From: jthomp007c Date: Sat, 28 Feb 2026 15:56:16 +0000 Subject: [PATCH 8/9] Adding stream end reason to telemetry log --- src/voice/ctrlm_voice_obj.cpp | 16 ++++++++-------- .../endpoints/ctrlm_voice_endpoint_http.cpp | 2 +- .../ctrlm_voice_endpoint_ws_nextgen.cpp | 2 +- .../endpoints/ctrlm_voice_endpoint_ws_nsp.cpp | 2 +- .../telemetry/ctrlm_voice_telemetry_events.cpp | 2 +- .../telemetry/ctrlm_voice_telemetry_events.h | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index 050f4226..6e4b354f 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -2625,7 +2625,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses if(command_status == VOICE_COMMAND_STATUS_PENDING) { switch(session->voice_device) { case CTRLM_VOICE_DEVICE_FF: { - session->status.status = (stats->reason == XRSR_SESSION_END_REASON_EOS) ? VOICE_COMMAND_STATUS_SUCCESS : VOICE_COMMAND_STATUS_FAILURE; + session->status.status = (stats->session_end_reason == XRSR_SESSION_END_REASON_EOS) ? VOICE_COMMAND_STATUS_SUCCESS : VOICE_COMMAND_STATUS_FAILURE; command_status = session->status.status; this->voice_status_set(session); break; @@ -2642,9 +2642,9 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses } if(session->voice_device == CTRLM_VOICE_DEVICE_MICROPHONE || session->voice_device == CTRLM_VOICE_DEVICE_MICROPHONE_TAP) { - XLOGD_INFO("src <%s> reason <%s> voice command status <%s>", ctrlm_voice_device_str(session->voice_device), xrsr_session_end_reason_str(stats->reason), ctrlm_voice_command_status_str(command_status)); + XLOGD_INFO("src <%s> reason <%s> voice command status <%s>", ctrlm_voice_device_str(session->voice_device), xrsr_session_end_reason_str(stats->session_end_reason), ctrlm_voice_command_status_str(command_status)); } else { - XLOGD_INFO("src <%s> audio sent bytes <%u> samples <%u> reason <%s> voice command status <%s>", ctrlm_voice_device_str(session->voice_device), session->audio_sent_bytes, session->audio_sent_samples, xrsr_session_end_reason_str(stats->reason), ctrlm_voice_command_status_str(command_status)); + XLOGD_INFO("src <%s> audio sent bytes <%u> samples <%u> reason <%s> voice command status <%s>", ctrlm_voice_device_str(session->voice_device), session->audio_sent_bytes, session->audio_sent_samples, xrsr_session_end_reason_str(stats->session_end_reason), ctrlm_voice_command_status_str(command_status)); } // Update device status @@ -2657,7 +2657,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses // Send Results IARM Event if(this->voice_ipc) { - if(stats->reason == XRSR_SESSION_END_REASON_ERROR_AUDIO_DURATION) { + if(stats->session_end_reason == XRSR_SESSION_END_REASON_ERROR_AUDIO_DURATION) { ctrlm_voice_ipc_event_session_end_t end; end.common = session->ipc_common_data; end.result = SESSION_END_SHORT_UTTERANCE; @@ -2668,7 +2668,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses ctrlm_voice_ipc_event_session_end_t end; end.common = session->ipc_common_data; end.result = (session_end->success ? SESSION_END_SUCCESS : SESSION_END_FAILURE); - end.reason = stats->reason; + end.reason = stats->session_end_reason; end.return_code_protocol = stats->ret_code_protocol; end.return_code_protocol_library = stats->ret_code_library; end.return_code_server = session->server_ret_code; @@ -2690,7 +2690,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses // Update controller metrics ctrlm_main_queue_msg_controller_voice_metrics_t metrics = {0}; metrics.controller_id = session->controller_id; - metrics.short_utterance = (stats->reason == XRSR_SESSION_END_REASON_ERROR_AUDIO_DURATION ? 1 : 0); + metrics.short_utterance = (stats->session_end_reason == XRSR_SESSION_END_REASON_ERROR_AUDIO_DURATION ? 1 : 0); metrics.packets_total = session->packets_processed + session->packets_lost; metrics.packets_lost = session->packets_lost; @@ -2720,7 +2720,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses ctrlm_telemetry_event_t vs_marker(MARKER_VOICE_SESSION_TOTAL, 1); ctrlm_telemetry_event_t vs_status_marker(session_end->success ? MARKER_VOICE_SESSION_SUCCESS : MARKER_VOICE_SESSION_FAILURE, 1); ctrlm_telemetry_event_t vs_end_reason_marker(MARKER_VOICE_END_REASON_PREFIX + std::string(ctrlm_voice_session_end_reason_str(session->end_reason_rcu)), 1); - ctrlm_telemetry_event_t vs_xrsr_end_reason_marker(MARKER_VOICE_XRSR_END_REASON_PREFIX + std::string(xrsr_session_end_reason_str(stats->reason)), 1); + ctrlm_telemetry_event_t vs_xrsr_end_reason_marker(MARKER_VOICE_XRSR_END_REASON_PREFIX + std::string(xrsr_session_end_reason_str(stats->session_end_reason)), 1); // Handle all VSRsp error telemetry if(session->current_vsr_err_string != "") { @@ -2745,7 +2745,7 @@ void ctrlm_voice_t::voice_session_end_callback(ctrlm_voice_session_end_cb_t *ses telemetry->event(ctrlm_telemetry_report_t::VOICE, vs_xrsr_end_reason_marker); if(this->prefs.telemetry_session_stats) { - if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason_rcu, stats->reason, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms, stats->ret_code_protocol)) { + if(!session->telemetry_session_stats.update_on_session_end(session_end->success, session->end_reason_rcu, stats->session_end_reason, session->server_ret_code, session->server_message, session->stats_session.voice_key_held_ms, stats->ret_code_protocol, stats->stream_end_reason)) { XLOGD_ERROR("failed to generate session stats event"); } } diff --git a/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp b/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp index 93396a4b..1ec3e647 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp +++ b/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp @@ -286,7 +286,7 @@ void ctrlm_voice_endpoint_http_t::voice_session_end_callback_http(void *data, in } // Check if HTTP was successful - if((stats->reason != XRSR_SESSION_END_REASON_EOS && stats->reason != XRSR_SESSION_END_REASON_TERMINATE && stats->reason != XRSR_SESSION_END_REASON_EOT) + if((stats->session_end_reason != XRSR_SESSION_END_REASON_EOS && stats->session_end_reason != XRSR_SESSION_END_REASON_TERMINATE && stats->session_end_reason != XRSR_SESSION_END_REASON_EOT) || (stats->ret_code_library != 0) || (stats->ret_code_protocol != 200) || (this->server_ret_code != 0)) { success = false; } diff --git a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp index fcf9b12a..e5165cd7 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp +++ b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp @@ -460,7 +460,7 @@ void ctrlm_voice_endpoint_ws_nextgen_t::voice_session_end_callback_ws_nextgen(vo } // Check if WS was successful - if((stats->reason != XRSR_SESSION_END_REASON_EOS && stats->reason != XRSR_SESSION_END_REASON_EOT) || (this->server_ret_code != 0 && this->server_ret_code != 200)) { + if((stats->session_end_reason != XRSR_SESSION_END_REASON_EOS && stats->session_end_reason != XRSR_SESSION_END_REASON_EOT) || (this->server_ret_code != 0 && this->server_ret_code != 200)) { success = false; } diff --git a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nsp.cpp b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nsp.cpp index da4d4035..a123c0d6 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nsp.cpp +++ b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nsp.cpp @@ -203,7 +203,7 @@ void ctrlm_voice_endpoint_ws_nsp_t::voice_session_end_callback_ws_nsp(void *data } // Check if WS was successful - if((stats->reason != XRSR_SESSION_END_REASON_DISCONNECT_REMOTE) || (this->server_ret_code != 0 && this->server_ret_code != 200)) { + if((stats->session_end_reason != XRSR_SESSION_END_REASON_DISCONNECT_REMOTE) || (this->server_ret_code != 0 && this->server_ret_code != 200)) { success = false; } diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp index b85c6a34..661c1fbc 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp @@ -281,7 +281,7 @@ void ctrlm_voice_telemetry_session_t::update_on_stream_end(uint32_t time_stream_ } } -bool ctrlm_voice_telemetry_session_t::update_on_session_end(bool result, int32_t end_reason_rcu, int32_t end_reason_session, int32_t end_reason_server, const std::string &server_message, int32_t time_stream_len_exp, int32_t ret_code_protocol) { +bool ctrlm_voice_telemetry_session_t::update_on_session_end(bool result, int32_t end_reason_rcu, int32_t end_reason_session, int32_t end_reason_server, const std::string &server_message, int32_t time_stream_len_exp, int32_t ret_code_protocol, int32_t stream_end_reason) { m_result = result; m_end_reason_rcu = end_reason_rcu; m_end_reason_session = end_reason_session; diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.h b/src/voice/telemetry/ctrlm_voice_telemetry_events.h index 1a349ecd..a1e9f4a6 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.h +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.h @@ -76,7 +76,7 @@ class ctrlm_voice_telemetry_session_t : public ctrlm_telemetry_event_t Date: Mon, 2 Mar 2026 19:33:19 +0000 Subject: [PATCH 9/9] Adding stream reason end to telemetry --- src/voice/telemetry/ctrlm_voice_telemetry_events.cpp | 3 ++- src/voice/telemetry/ctrlm_voice_telemetry_events.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp index 661c1fbc..d5f6bba3 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.cpp @@ -211,9 +211,9 @@ bool ctrlm_voice_telemetry_session_t::event() { ss << m_end_reason_server << ","; ss << "\"" << m_server_message << "\","; ss << m_result << ","; + ss << m_end_reason_stream << ","; ss << m_ret_code_protocol << "]]"; - if(m_event_list.length() + ss.str().length() > m_event_list_max_size) { // Maximum data size exceeded XLOGD_WARN("telemetry event exceeds max size <%s,%s>", val_marker.c_str(), ss.str().c_str()); @@ -288,6 +288,7 @@ bool ctrlm_voice_telemetry_session_t::update_on_session_end(bool result, int32_t m_end_reason_server = end_reason_server; m_server_message = server_message; m_ret_code_protocol = ret_code_protocol; + m_end_reason_stream = stream_end_reason; if(!m_has_key_release) { // if there is no key release, the start time and end time are not known rdkx_timestamp_get(&m_time_prev_session_end); diff --git a/src/voice/telemetry/ctrlm_voice_telemetry_events.h b/src/voice/telemetry/ctrlm_voice_telemetry_events.h index a1e9f4a6..adadfde6 100644 --- a/src/voice/telemetry/ctrlm_voice_telemetry_events.h +++ b/src/voice/telemetry/ctrlm_voice_telemetry_events.h @@ -109,6 +109,7 @@ class ctrlm_voice_telemetry_session_t : public ctrlm_telemetry_event_t