]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_page and app_confbridge: Fix custom announcement on entering conference.
authorMatthew Jordan <mjordan@digium.com>
Thu, 14 Feb 2013 15:19:12 +0000 (15:19 +0000)
committerMatthew Jordan <mjordan@digium.com>
Thu, 14 Feb 2013 15:19:12 +0000 (15:19 +0000)
The Page and ConfBridge custom announcement did not play when users
entered the conference.

* Fix the CONFBRIDGE(user,announcement) file not getting played.  The code
to do this got removed accidentally when the ConfBridge code was
restructured to be more state machine like.

* Fixed play_prompt_to_user() doxygen comments.

* Fixed the Page A(x) and n options for the caller.  The caller never
played the announcement file and totally ignored the n option.  The code
to do this was lost when the application was converted to use ConfBridge.

* Factored out setup_profile_bridge(), setup_profile_paged(), and
setup_profile_caller() routines to setup ConfBridge profiles.  Made each
profile setup routine use the default template if one has not already been
setup by dialplan.

(closes issue ASTERISK-20990)
Reported by: Jeremy Kister
Tested by: rmudgett
........

Merged revisions 380894 from http://svn.asterisk.org/svn/asterisk/branches/11

git-svn-id: https://origsvn.digium.com/svn/asterisk/certified/branches/11.2@381410 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_confbridge.c
apps/app_page.c

index 12ae7872cd9a6ea4eb750968016cc49d8e259734..e223f3ef01b5646ef35f171b8e9c83b867012ee0 100644 (file)
@@ -722,9 +722,8 @@ static int announce_user_count(struct conference_bridge *conference_bridge, stru
 /*!
  * \brief Play back an audio file to a channel
  *
- * \param conference_bridge Conference bridge they are in
- * \param chan Channel to play audio prompt to
- * \param file Prompt to play
+ * \param cbu User to play audio prompt to
+ * \param filename Prompt to play
  *
  * \return Returns 0 on success, -1 if the user hung up
  * \note Generally this should be called when the conference is unlocked to avoid blocking
@@ -1105,6 +1104,15 @@ static struct conference_bridge *join_conference_bridge(const char *name, struct
 
        ao2_unlock(conference_bridge);
 
+       /* If an announcement is to be played play it */
+       if (!ast_strlen_zero(conference_bridge_user->u_profile.announcement)) {
+               if (play_prompt_to_user(conference_bridge_user,
+                       conference_bridge_user->u_profile.announcement)) {
+                       leave_conference(conference_bridge_user);
+                       return NULL;
+               }
+       }
+
        /* Announce number of users if need be */
        if (ast_test_flag(&conference_bridge_user->u_profile, USER_OPT_ANNOUNCEUSERCOUNT)) {
                if (announce_user_count(conference_bridge, conference_bridge_user)) {
@@ -1413,7 +1421,6 @@ static int confbridge_exec(struct ast_channel *chan, const char *data)
        if (args.argc > 2 && !ast_strlen_zero(args.u_profile_name)) {
                u_profile_name = args.u_profile_name;
        }
-
        if (!conf_find_user_profile(chan, u_profile_name, &conference_bridge_user.u_profile)) {
                ast_log(LOG_WARNING, "Conference user profile %s does not exist\n", u_profile_name);
                res = -1;
index 8c56948414a276bb8a034e0e6bfc0fee0c72cdb8..8514a52c499c227704707b8a2d8eba84a938bebc 100644 (file)
@@ -141,35 +141,85 @@ struct page_options {
        struct ast_flags flags;
 };
 
-static void page_state_callback(struct ast_dial *dial)
+/*!
+ * \internal
+ * \brief Setup the page bridge profile.
+ *
+ * \param chan Setup bridge profile on this channel.
+ * \param options Options to setup bridge profile.
+ *
+ * \return Nothing
+ */
+static void setup_profile_bridge(struct ast_channel *chan, struct page_options *options)
 {
-       struct ast_channel *chan;
-       struct page_options *options;
-
-       if (ast_dial_state(dial) != AST_DIAL_RESULT_ANSWERED ||
-           !(chan = ast_dial_answered(dial)) ||
-           !(options = ast_dial_get_user_data(dial))) {
-               return;
-       }
-
-       ast_func_write(chan, "CONFBRIDGE(bridge,template)", "default_bridge");
-
+       /* Use default_bridge as a starting point */
+       ast_func_write(chan, "CONFBRIDGE(bridge,template)", "");
        if (ast_test_flag(&options->flags, PAGE_RECORD)) {
                ast_func_write(chan, "CONFBRIDGE(bridge,record_conference)", "yes");
        }
+}
 
+/*!
+ * \internal
+ * \brief Setup the paged user profile.
+ *
+ * \param chan Setup user profile on this channel.
+ * \param options Options to setup paged user profile.
+ *
+ * \return Nothing
+ */
+static void setup_profile_paged(struct ast_channel *chan, struct page_options *options)
+{
+       /* Use default_user as a starting point */
+       ast_func_write(chan, "CONFBRIDGE(user,template)", "");
        ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
        ast_func_write(chan, "CONFBRIDGE(user,end_marked)", "yes");
-
        if (!ast_test_flag(&options->flags, PAGE_DUPLEX)) {
                ast_func_write(chan, "CONFBRIDGE(user,startmuted)", "yes");
        }
+       if (ast_test_flag(&options->flags, PAGE_ANNOUNCE)
+               && !ast_strlen_zero(options->opts[OPT_ARG_ANNOUNCE])) {
+               ast_func_write(chan, "CONFBRIDGE(user,announcement)", options->opts[OPT_ARG_ANNOUNCE]);
+       }
+}
 
-       if (ast_test_flag(&options->flags, PAGE_ANNOUNCE) && !ast_strlen_zero(options->opts[OPT_ARG_ANNOUNCE])) {
+/*!
+ * \internal
+ * \brief Setup the caller user profile.
+ *
+ * \param chan Setup user profile on this channel.
+ * \param options Options to setup caller user profile.
+ *
+ * \return Nothing
+ */
+static void setup_profile_caller(struct ast_channel *chan, struct page_options *options)
+{
+       /* Use default_user as a starting point if not already setup. */
+       ast_func_write(chan, "CONFBRIDGE(user,template)", "");
+       ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
+       ast_func_write(chan, "CONFBRIDGE(user,marked)", "yes");
+       if (!ast_test_flag(&options->flags, PAGE_NOCALLERANNOUNCE)
+               && ast_test_flag(&options->flags, PAGE_ANNOUNCE)
+               && !ast_strlen_zero(options->opts[OPT_ARG_ANNOUNCE])) {
                ast_func_write(chan, "CONFBRIDGE(user,announcement)", options->opts[OPT_ARG_ANNOUNCE]);
        }
 }
 
+static void page_state_callback(struct ast_dial *dial)
+{
+       struct ast_channel *chan;
+       struct page_options *options;
+
+       if (ast_dial_state(dial) != AST_DIAL_RESULT_ANSWERED ||
+           !(chan = ast_dial_answered(dial)) ||
+           !(options = ast_dial_get_user_data(dial))) {
+               return;
+       }
+
+       setup_profile_bridge(chan, options);
+       setup_profile_paged(chan, options);
+}
+
 static int page_exec(struct ast_channel *chan, const char *data)
 {
        char *tech, *resource, *tmp;
@@ -302,17 +352,10 @@ static int page_exec(struct ast_channel *chan, const char *data)
        }
 
        if (!res) {
-               ast_func_write(chan, "CONFBRIDGE(bridge,template)", "default_bridge");
-
-               if (ast_test_flag(&options.flags, PAGE_RECORD)) {
-                       ast_func_write(chan, "CONFBRIDGE(bridge,record_conference)", "yes");
-               }
-
-               ast_func_write(chan, "CONFBRIDGE(user,quiet)", "yes");
-               ast_func_write(chan, "CONFBRIDGE(user,marked)", "yes");
+               setup_profile_bridge(chan, &options);
+               setup_profile_caller(chan, &options);
 
                snprintf(confbridgeopts, sizeof(confbridgeopts), "%u", confid);
-
                pbx_exec(chan, app, confbridgeopts);
        }