diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index b214e2cb6e..574a637498 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -266,6 +266,7 @@ typedef struct conference_file_node { uint32_t leadin; struct conference_file_node *next; char *file; + switch_bool_t mux; } conference_file_node_t; typedef enum { @@ -526,7 +527,7 @@ static void launch_conference_video_thread(conference_obj_t *conference); static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *obj); static switch_status_t conference_local_play_file(conference_obj_t *conference, switch_core_session_t *session, char *path, uint32_t leadin, void *buf, uint32_t buflen); -static switch_status_t conference_member_play_file(conference_member_t *member, char *file, uint32_t leadin); +static switch_status_t conference_member_play_file(conference_member_t *member, char *file, uint32_t leadin, switch_bool_t mux); static switch_status_t conference_member_say(conference_member_t *member, char *text, uint32_t leadin); static uint32_t conference_member_stop_file(conference_member_t *member, file_stop_t stop); static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_core_session_t *session, switch_memory_pool_t *pool); @@ -2683,7 +2684,7 @@ static void conference_loop_fn_energy_up(conference_member_t *member, caller_con switch_snprintf(str, sizeof(str), "%d", abs(member->energy_level) / 200); for (p = str; p && *p; p++) { switch_snprintf(msg, sizeof(msg), "digits/%c.wav", *p); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } @@ -2715,7 +2716,7 @@ static void conference_loop_fn_energy_equ_conf(conference_member_t *member, call switch_snprintf(str, sizeof(str), "%d", abs(member->energy_level) / 200); for (p = str; p && *p; p++) { switch_snprintf(msg, sizeof(msg), "digits/%c.wav", *p); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } } @@ -2747,7 +2748,7 @@ static void conference_loop_fn_energy_dn(conference_member_t *member, caller_con switch_snprintf(str, sizeof(str), "%d", abs(member->energy_level) / 200); for (p = str; p && *p; p++) { switch_snprintf(msg, sizeof(msg), "digits/%c.wav", *p); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } } @@ -2776,11 +2777,11 @@ static void conference_loop_fn_volume_talk_up(conference_member_t *member, calle if (member->volume_out_level < 0) { switch_snprintf(msg, sizeof(msg), "currency/negative.wav", member->volume_out_level); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } switch_snprintf(msg, sizeof(msg), "digits/%d.wav", abs(member->volume_out_level)); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } @@ -2808,11 +2809,11 @@ static void conference_loop_fn_volume_talk_zero(conference_member_t *member, cal if (member->volume_out_level < 0) { switch_snprintf(msg, sizeof(msg), "currency/negative.wav", member->volume_out_level); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } switch_snprintf(msg, sizeof(msg), "digits/%d.wav", abs(member->volume_out_level)); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } static void conference_loop_fn_volume_talk_dn(conference_member_t *member, caller_control_action_t *action) @@ -2839,11 +2840,11 @@ static void conference_loop_fn_volume_talk_dn(conference_member_t *member, calle if (member->volume_out_level < 0) { switch_snprintf(msg, sizeof(msg), "currency/negative.wav", member->volume_out_level); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } switch_snprintf(msg, sizeof(msg), "digits/%d.wav", abs(member->volume_out_level)); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } static void conference_loop_fn_volume_listen_up(conference_member_t *member, caller_control_action_t *action) @@ -2870,11 +2871,11 @@ static void conference_loop_fn_volume_listen_up(conference_member_t *member, cal if (member->volume_in_level < 0) { switch_snprintf(msg, sizeof(msg), "currency/negative.wav", member->volume_in_level); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } switch_snprintf(msg, sizeof(msg), "digits/%d.wav", abs(member->volume_in_level)); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } @@ -2901,11 +2902,11 @@ static void conference_loop_fn_volume_listen_zero(conference_member_t *member, c if (member->volume_in_level < 0) { switch_snprintf(msg, sizeof(msg), "currency/negative.wav", member->volume_in_level); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } switch_snprintf(msg, sizeof(msg), "digits/%d.wav", abs(member->volume_in_level)); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } @@ -2933,11 +2934,11 @@ static void conference_loop_fn_volume_listen_dn(conference_member_t *member, cal if (member->volume_in_level < 0) { switch_snprintf(msg, sizeof(msg), "currency/negative.wav", member->volume_in_level); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } switch_snprintf(msg, sizeof(msg), "digits/%d.wav", abs(member->volume_in_level)); - conference_member_play_file(member, msg, 0); + conference_member_play_file(member, msg, 0, SWITCH_TRUE); } static void conference_loop_fn_event(conference_member_t *member, caller_control_action_t *action) @@ -3510,9 +3511,13 @@ static void member_add_file_data(conference_member_t *member, int16_t *data, swi } for (i = 0; i < file_sample_len; i++) { - sample = data[i] + file_frame[i]; - switch_normalize_to_16bit(sample); - data[i] = sample; + if (member->fnode->mux) { + sample = data[i] + file_frame[i]; + switch_normalize_to_16bit(sample); + data[i] = sample; + } else { + data[i] = file_frame[i]; + } } } @@ -3672,7 +3677,7 @@ static void conference_loop_output(conference_member_t *member) goto end; } - conference_member_play_file(member, "tone_stream://%(500,0,640)", 0); + conference_member_play_file(member, "tone_stream://%(500,0,640)", 0, SWITCH_TRUE); } if (!switch_test_flag(member->conference, CFLAG_ANSWERED)) { @@ -3825,7 +3830,7 @@ static void conference_loop_output(conference_member_t *member) if (switch_test_flag(member, MFLAG_INDICATE_MUTE)) { if (!zstr(member->conference->muted_sound)) { - conference_member_play_file(member, member->conference->muted_sound, 0); + conference_member_play_file(member, member->conference->muted_sound, 0, SWITCH_TRUE); } else { char msg[512]; @@ -3837,7 +3842,7 @@ static void conference_loop_output(conference_member_t *member) if (switch_test_flag(member, MFLAG_INDICATE_MUTE_DETECT)) { if (!zstr(member->conference->mute_detect_sound)) { - conference_member_play_file(member, member->conference->mute_detect_sound, 0); + conference_member_play_file(member, member->conference->mute_detect_sound, 0, SWITCH_TRUE); } else { char msg[512]; @@ -3849,7 +3854,7 @@ static void conference_loop_output(conference_member_t *member) if (switch_test_flag(member, MFLAG_INDICATE_UNMUTE)) { if (!zstr(member->conference->unmuted_sound)) { - conference_member_play_file(member, member->conference->unmuted_sound, 0); + conference_member_play_file(member, member->conference->unmuted_sound, 0, SWITCH_TRUE); } else { char msg[512]; @@ -4351,7 +4356,7 @@ static switch_status_t conference_play_file(conference_obj_t *conference, char * } /* Play a file in the conference room to a member */ -static switch_status_t conference_member_play_file(conference_member_t *member, char *file, uint32_t leadin) +static switch_status_t conference_member_play_file(conference_member_t *member, char *file, uint32_t leadin, switch_bool_t mux) { switch_status_t status = SWITCH_STATUS_FALSE; char *dfile = NULL, *expanded = NULL; @@ -4398,6 +4403,8 @@ static switch_status_t conference_member_play_file(conference_member_t *member, } fnode->type = NODE_TYPE_FILE; fnode->leadin = leadin; + fnode->mux = mux; + /* Open the file */ fnode->fh.pre_buffer_datalen = SWITCH_DEFAULT_FILE_BUFFER_LEN; if (switch_core_file_open(&fnode->fh, @@ -5718,12 +5725,17 @@ static switch_status_t conf_api_sub_play(conference_obj_t *conference, switch_st stream->write_function(stream, "(play) File: %s not found.\n", argv[2] ? argv[2] : "(unspecified)"); } ret_status = SWITCH_STATUS_SUCCESS; - } else if (argc == 4) { + } else if (argc >= 4) { uint32_t id = atoi(argv[3]); conference_member_t *member; + switch_bool_t mux = SWITCH_TRUE; + + if (argc > 4 && !strcasecmp(argv[4], "nomux")) { + mux = SWITCH_FALSE; + } if ((member = conference_member_get(conference, id))) { - if (conference_member_play_file(member, argv[2], 0) == SWITCH_STATUS_SUCCESS) { + if (conference_member_play_file(member, argv[2], 0, mux) == SWITCH_STATUS_SUCCESS) { stream->write_function(stream, "(play) Playing file %s to member %u\n", argv[2], id); if (test_eflag(conference, EFLAG_PLAY_FILE_MEMBER) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { @@ -6524,7 +6536,7 @@ static api_command_t conf_api_sub_commands[] = { {"energy", (void_fn_t) & conf_api_sub_energy, CONF_API_SUB_MEMBER_TARGET, "energy", " []"}, {"volume_in", (void_fn_t) & conf_api_sub_volume_in, CONF_API_SUB_MEMBER_TARGET, "volume_in", " []"}, {"volume_out", (void_fn_t) & conf_api_sub_volume_out, CONF_API_SUB_MEMBER_TARGET, "volume_out", " []"}, - {"play", (void_fn_t) & conf_api_sub_play, CONF_API_SUB_ARGS_SPLIT, "play", " [async|]"}, + {"play", (void_fn_t) & conf_api_sub_play, CONF_API_SUB_ARGS_SPLIT, "play", " [async| [nomux]]"}, {"pause_play", (void_fn_t) & conf_api_sub_pause_play, CONF_API_SUB_ARGS_SPLIT, "pause", ""}, {"file_seek", (void_fn_t) & conf_api_sub_file_seek, CONF_API_SUB_ARGS_SPLIT, "file_seek", "[+-]"}, {"say", (void_fn_t) & conf_api_sub_say, CONF_API_SUB_ARGS_AS_ONE, "say", ""},