diff --git a/UPGRADE.txt b/UPGRADE.txt index 5831c8d992..9712c49ea9 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -20,6 +20,11 @@ === UPGRADE-11.txt -- Upgrade info for 10 to 11 === UPGRADE-12.txt -- Upgrade info for 11 to 12 =========================================================== +* The sound_place_into_conference sound used in Confbridge is now deprecated + and is no longer functional since it has been broken since its inception + and the fix involved using a different method to achieve the same goal. The + new method to achieve this functionality is by using sound_begin to play + a sound to the conference when waitmarked users are moved into the conference. From 12 to 13: diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c index 4f854aa1a4..10cfb096ff 100644 --- a/apps/app_confbridge.c +++ b/apps/app_confbridge.c @@ -430,6 +430,8 @@ const char *conf_get_sound(enum conf_sounds sound, struct bridge_profile_sounds return S_OR(custom_sounds->participantsmuted, "conf-now-muted"); case CONF_SOUND_PARTICIPANTS_UNMUTED: return S_OR(custom_sounds->participantsunmuted, "conf-now-unmuted"); + case CONF_SOUND_BEGIN: + return S_OR(custom_sounds->begin, "confbridge-conf-begin"); } return ""; @@ -1097,14 +1099,6 @@ static void conf_moh_suspend(struct confbridge_user *user) ao2_unlock(user->conference); } -int conf_handle_first_marked_common(struct confbridge_user *user) -{ - if (!ast_test_flag(&user->u_profile, USER_OPT_QUIET) && play_prompt_to_user(user, conf_get_sound(CONF_SOUND_PLACE_IN_CONF, user->b_profile.sounds))) { - return -1; - } - return 0; -} - int conf_handle_inactive_waitmarked(struct confbridge_user *user) { /* If we have not been quieted play back that they are waiting for the leader */ diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c index ec5b0e6182..0e81e7e8e8 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -874,6 +874,12 @@ static int set_sound(const char *sound_name, const char *sound_file, struct brid } else if (!strcasecmp(sound_name, "sound_other_in_party")) { ast_string_field_set(sounds, otherinparty, sound_file); } else if (!strcasecmp(sound_name, "sound_place_into_conference")) { + static int deprecation_warning = 1; + if (deprecation_warning) { + ast_log(LOG_WARNING, "sound_place_into_conference is deprecated" + " and unused. Use sound_begin for similar functionality."); + deprecation_warning = 0; + } ast_string_field_set(sounds, placeintoconf, sound_file); } else if (!strcasecmp(sound_name, "sound_wait_for_leader")) { ast_string_field_set(sounds, waitforleader, sound_file); @@ -899,6 +905,8 @@ static int set_sound(const char *sound_name, const char *sound_file, struct brid ast_string_field_set(sounds, participantsmuted, sound_file); } else if (!strcasecmp(sound_name, "sound_participants_unmuted")) { ast_string_field_set(sounds, participantsunmuted, sound_file); + } else if (!strcasecmp(sound_name, "sound_begin")) { + ast_string_field_set(sounds, begin, sound_file); } else { return -1; } @@ -1564,6 +1572,7 @@ static char *handle_cli_confbridge_show_bridge_profile(struct ast_cli_entry *e, ast_cli(a->fd,"sound_leave: %s\n", conf_get_sound(CONF_SOUND_LEAVE, b_profile.sounds)); ast_cli(a->fd,"sound_participants_muted: %s\n", conf_get_sound(CONF_SOUND_PARTICIPANTS_MUTED, b_profile.sounds)); ast_cli(a->fd,"sound_participants_unmuted: %s\n", conf_get_sound(CONF_SOUND_PARTICIPANTS_UNMUTED, b_profile.sounds)); + ast_cli(a->fd,"sound_begin: %s\n", conf_get_sound(CONF_SOUND_BEGIN, b_profile.sounds)); ast_cli(a->fd,"\n"); conf_bridge_profile_destroy(&b_profile); @@ -1906,6 +1915,7 @@ static int bridge_template_handler(const struct aco_option *opt, struct ast_vari ast_string_field_set(sounds, leave, b_profile->sounds->leave); ast_string_field_set(sounds, participantsmuted, b_profile->sounds->participantsmuted); ast_string_field_set(sounds, participantsunmuted, b_profile->sounds->participantsunmuted); + ast_string_field_set(sounds, begin, b_profile->sounds->begin); ao2_ref(b_profile->sounds, -1); /* sounds struct copied over to it from the template by reference only. */ ao2_ref(oldsounds, -1); /* original sounds struct we don't need anymore */ diff --git a/apps/confbridge/conf_state_empty.c b/apps/confbridge/conf_state_empty.c index bd1309bfdc..285f22abbe 100644 --- a/apps/confbridge/conf_state_empty.c +++ b/apps/confbridge/conf_state_empty.c @@ -73,7 +73,6 @@ static void join_marked(struct confbridge_user *user) { conf_add_user_marked(user->conference, user); conf_handle_first_join(user->conference); - conf_add_post_join_action(user, conf_handle_first_marked_common); conf_change_state(user, CONF_STATE_SINGLE_MARKED); } diff --git a/apps/confbridge/conf_state_multi_marked.c b/apps/confbridge/conf_state_multi_marked.c index 42a8e7ea25..9c88848aa5 100644 --- a/apps/confbridge/conf_state_multi_marked.c +++ b/apps/confbridge/conf_state_multi_marked.c @@ -171,14 +171,21 @@ static void leave_marked(struct confbridge_user *user) } } +static int post_join_play_begin(struct confbridge_user *cbu) +{ + int res; + + ast_autoservice_start(cbu->chan); + res = play_sound_file(cbu->conference, + conf_get_sound(CONF_SOUND_BEGIN, cbu->b_profile.sounds)); + ast_autoservice_stop(cbu->chan); + return res; +} + static void transition_to_marked(struct confbridge_user *user) { struct confbridge_user *user_iter; - - /* Play the audio file stating they are going to be placed into the conference */ - if (user->conference->markedusers == 1 && ast_test_flag(&user->u_profile, USER_OPT_MARKEDUSER)) { - conf_handle_first_marked_common(user); - } + int waitmarked_moved = 0; /* Move all waiting users to active, stopping MOH and unmuting if necessary */ AST_LIST_TRAVERSE_SAFE_BEGIN(&user->conference->waiting_list, user_iter, list) { @@ -190,6 +197,15 @@ static void transition_to_marked(struct confbridge_user *user) conf_moh_stop(user_iter); } conf_update_user_mute(user_iter); + waitmarked_moved++; } AST_LIST_TRAVERSE_SAFE_END; + + /* Play the audio file stating that the conference is beginning */ + if (user->conference->markedusers == 1 + && ast_test_flag(&user->u_profile, USER_OPT_MARKEDUSER) + && !ast_test_flag(&user->u_profile, USER_OPT_QUIET) + && waitmarked_moved) { + conf_add_post_join_action(user, post_join_play_begin); + } } diff --git a/apps/confbridge/include/confbridge.h b/apps/confbridge/include/confbridge.h index e3e3642eed..ce6253744f 100644 --- a/apps/confbridge/include/confbridge.h +++ b/apps/confbridge/include/confbridge.h @@ -163,6 +163,7 @@ enum conf_sounds { CONF_SOUND_LEAVE, CONF_SOUND_PARTICIPANTS_MUTED, CONF_SOUND_PARTICIPANTS_UNMUTED, + CONF_SOUND_BEGIN, }; struct bridge_profile_sounds { @@ -189,6 +190,7 @@ struct bridge_profile_sounds { AST_STRING_FIELD(join); AST_STRING_FIELD(participantsmuted); AST_STRING_FIELD(participantsunmuted); + AST_STRING_FIELD(begin); ); }; @@ -418,13 +420,6 @@ void conf_moh_start(struct confbridge_user *user); */ void conf_mute_only_active(struct confbridge_conference *conference); -/*! \brief Callback to execute any time we transition from zero to one marked users - * \param user The first marked user joining the conference - * \retval 0 success - * \retval -1 failure - */ -int conf_handle_first_marked_common(struct confbridge_user *user); - /*! \brief Callback to execute any time we transition from zero to one active users * \param conference The conference bridge with a single active user joined * \retval 0 success diff --git a/configs/confbridge.conf.sample b/configs/confbridge.conf.sample index 4f7c6e5522..860f1cb876 100644 --- a/configs/confbridge.conf.sample +++ b/configs/confbridge.conf.sample @@ -232,7 +232,9 @@ type=bridge ; The sounds are stringed together like this. ; "sound_there_are" "sound_other_in_party" ;sound_place_into_conference ; The sound played when someone is placed into the conference - ; after waiting for a marked user. + ; after waiting for a marked user. This sound is now deprecated + ; since it was only ever used improperly and correcting that bug + ; made it completely unused. ;sound_wait_for_leader ; The sound played when a user is placed into a conference that ; can not start until a marked user enters. ;sound_leader_has_left ; The sound played when the last marked user leaves the conference. @@ -242,6 +244,7 @@ type=bridge ;sound_locked_now ; The sound played to an admin after toggling the conference to locked mode. ;sound_unlocked_now; The sound played to an admin after toggling the conference to unlocked mode. ;sound_error_menu ; The sound played when an invalid menu option is entered. +;sound_begin ; The sound played to the conference when the first marked user enters the conference. ; --- ConfBridge Menu Options --- ; The ConfBridge application also has the ability to