diff --git a/src/control_socket.cpp b/src/control_socket.cpp index 8130429c6..bad621096 100644 --- a/src/control_socket.cpp +++ b/src/control_socket.cpp @@ -499,16 +499,17 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message, s send_message(s->root_module, path_audio, (struct message *) msg_audio); free_response(resp_audio); } else if(prefix_matches(message, "fec ")) { - struct msg_change_fec_data *msg = (struct msg_change_fec_data *) - new_message(sizeof(struct msg_change_fec_data)); + auto *msg = reinterpret_cast(new_message(sizeof(struct msg_universal))); char *fec = suffix(message, "fec "); + enum tx_media_type media_type{}; + strncpy(msg->text, MSG_UNIVERSAL_TAG_TX "fec ", sizeof(msg->text) - 1); if(strncasecmp(fec, "audio ", 6) == 0) { - msg->media_type = TX_MEDIA_AUDIO; - strncpy(msg->fec, fec + 6, sizeof(msg->fec) - 1); + media_type = TX_MEDIA_AUDIO; + strncat(msg->text, fec + 6, sizeof(msg->text) - strlen(msg->text) - 1); } else if(strncasecmp(fec, "video ", 6) == 0) { - msg->media_type = TX_MEDIA_VIDEO; - strncpy(msg->fec, fec + 6, sizeof(msg->fec) - 1); + media_type = TX_MEDIA_VIDEO; + strncat(msg->text, fec + 6, sizeof(msg->text) - strlen(msg->text) - 1); } else { resp = new_response(RESPONSE_NOT_FOUND, "unknown media type"); free(msg); @@ -516,7 +517,7 @@ static int process_msg(struct control_state *s, fd_t client_fd, char *message, s } if (msg) { - if(msg->media_type == TX_MEDIA_VIDEO) { + if (media_type == TX_MEDIA_VIDEO) { enum module_class path_tx[] = { MODULE_CLASS_SENDER, MODULE_CLASS_TX, MODULE_CLASS_NONE }; append_message_path(path, sizeof(path), path_tx); diff --git a/src/messaging.h b/src/messaging.h index 465bffec6..d447026ae 100644 --- a/src/messaging.h +++ b/src/messaging.h @@ -130,12 +130,6 @@ struct msg_receiver { }; }; -struct msg_change_fec_data { - struct message m; - enum tx_media_type media_type; - char fec[128]; -}; - enum compress_change_type { CHANGE_COMPRESS, CHANGE_PARAMS @@ -153,11 +147,17 @@ struct msg_stats { int value; }; +/** + * It is suggested to use a tag at the beginning of + * msg_universal::text to identify the receiving module. + */ struct msg_universal { struct message m; char text[8192]; }; +#define MSG_UNIVERSAL_TAG_TX "TX_msg " + struct response *new_response(int status, const char *optional_message); void free_response(struct response *r); int response_get_status(struct response *r); diff --git a/src/transmit.cpp b/src/transmit.cpp index e1404f061..3dae32858 100644 --- a/src/transmit.cpp +++ b/src/transmit.cpp @@ -317,19 +317,27 @@ static void fec_check_messages(struct tx *tx) { struct message *msg; while ((msg = check_message(&tx->mod))) { - struct msg_change_fec_data *data = (struct msg_change_fec_data *) msg; - if(tx->media_type != data->media_type) { - fprintf(stderr, "[Transmit] FEC media type mismatch!\n"); - free_message(msg, new_response(RESPONSE_BAD_REQUEST, NULL)); + auto *data = reinterpret_cast(msg); + const char *text = data->text; + if (strstr(text, MSG_UNIVERSAL_TAG_TX) != text) { + LOG(LOG_LEVEL_ERROR) << "[Transmit] Unexpected TX message: " << text << "\n"; + free_message(msg, new_response(RESPONSE_BAD_REQUEST, "Unexpected message")); continue; } - struct response *r; - if (set_fec(tx, data->fec)) { - r = new_response(RESPONSE_OK, NULL); - printf("[Transmit] FEC set to new setting.\n"); + text += strlen(MSG_UNIVERSAL_TAG_TX); + struct response *r = nullptr; + if (strstr(text, "fec ") == text) { + text += strlen("fec "); + if (set_fec(tx, text)) { + r = new_response(RESPONSE_OK, nullptr); + LOG(LOG_LEVEL_NOTICE) << "[Transmit] FEC set to new setting: " << text << "\n"; + } else { + r = new_response(RESPONSE_INT_SERV_ERR, "cannot set FEC"); + LOG(LOG_LEVEL_ERROR) << "[Transmit] Unable to reconfiure FEC to: " << text << "\n"; + } } else { - r = new_response(RESPONSE_INT_SERV_ERR, NULL); - fprintf(stderr, "[Transmit] Unable to reconfigure FEC!\n"); + r = new_response(RESPONSE_BAD_REQUEST, "Unknown TX message"); + LOG(LOG_LEVEL_ERROR) << "[Transmit] Unknown TX message: " << text << "\n"; } free_message(msg, r);