]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_parking: Add music on hold override option.
authorNaveen Albert <asterisk@phreaknet.org>
Tue, 31 May 2022 10:59:56 +0000 (10:59 +0000)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Thu, 9 Jun 2022 09:42:31 +0000 (04:42 -0500)
An m option to Park and ParkAndAnnounce now allows
specifying a music on hold class override.

ASTERISK-30087

Change-Id: I03de8d97b100e451b2611b5a621d48750f5d6a9e

doc/CHANGES-staging/res_parking_moh.txt [new file with mode: 0644]
res/parking/parking_applications.c

diff --git a/doc/CHANGES-staging/res_parking_moh.txt b/doc/CHANGES-staging/res_parking_moh.txt
new file mode 100644 (file)
index 0000000..50f589c
--- /dev/null
@@ -0,0 +1,4 @@
+Subject: res_parking
+
+An m option to Park and ParkAndAnnounce now allows
+specifying a music on hold class override.
index 29878f8e192b468bd5bd14e0f76fa9c59d120c2c..531db88aef43f683e4f3779b6ee26a6e44c3d85d 100644 (file)
 enum park_args {
        OPT_ARG_COMEBACK,
        OPT_ARG_TIMEOUT,
+       OPT_ARG_MUSICONHOLD,
        OPT_ARG_ARRAY_SIZE /* Always the last element of the enum */
 };
 
@@ -250,6 +251,7 @@ enum park_flags {
        MUXFLAG_NOANNOUNCE = (1 << 2),
        MUXFLAG_COMEBACK_OVERRIDE = (1 << 3),
        MUXFLAG_TIMEOUT_OVERRIDE = (1 << 4),
+       MUXFLAG_MUSICONHOLD = (1 << 5),
 };
 
 AST_APP_OPTIONS(park_opts, {
@@ -258,6 +260,7 @@ AST_APP_OPTIONS(park_opts, {
        AST_APP_OPTION('s', MUXFLAG_NOANNOUNCE),
        AST_APP_OPTION_ARG('c', MUXFLAG_COMEBACK_OVERRIDE, OPT_ARG_COMEBACK),
        AST_APP_OPTION_ARG('t', MUXFLAG_TIMEOUT_OVERRIDE, OPT_ARG_TIMEOUT),
+       AST_APP_OPTION_ARG('m', MUXFLAG_MUSICONHOLD, OPT_ARG_MUSICONHOLD),
 });
 
 static int apply_option_timeout (int *var, char *timeout_arg)
@@ -275,7 +278,8 @@ static int apply_option_timeout (int *var, char *timeout_arg)
        return 0;
 }
 
-static int park_app_parse_data(const char *data, int *disable_announce, int *use_ringing, int *randomize, int *time_limit, char **comeback_override, char **lot_name)
+static int park_app_parse_data(const char *data, int *disable_announce, int *use_ringing, int *randomize, int *time_limit,
+       char **comeback_override, char **lot_name, char **musicclass)
 {
        char *parse;
        struct ast_flags flags = { 0 };
@@ -308,6 +312,10 @@ static int park_app_parse_data(const char *data, int *disable_announce, int *use
                        }
                }
 
+               if (ast_test_flag(&flags, MUXFLAG_MUSICONHOLD)) {
+                       *musicclass = ast_strdup(opts[OPT_ARG_MUSICONHOLD]);
+               }
+
                if (ast_test_flag(&flags, MUXFLAG_RINGING)) {
                        *use_ringing = 1;
                }
@@ -481,8 +489,8 @@ struct park_common_datastore *get_park_common_datastore_copy(struct ast_channel
        return data_copy;
 }
 
-struct ast_bridge *park_common_setup(struct ast_channel *parkee, struct ast_channel *parker,
-               const char *lot_name, const char *comeback_override,
+static struct ast_bridge *park_common_setup2(struct ast_channel *parkee, struct ast_channel *parker,
+               const char *lot_name, const char *comeback_override, const char *musicclass,
                int use_ringing, int randomize, int time_limit, int silence_announcements)
 {
        struct ast_bridge *parking_bridge;
@@ -518,11 +526,22 @@ struct ast_bridge *park_common_setup(struct ast_channel *parkee, struct ast_chan
 
        /* Apply relevant bridge roles and such to the parking channel */
        parking_channel_set_roles(parkee, lot, use_ringing);
+       /* If requested, override the MOH class */
+       if (!ast_strlen_zero(musicclass)) {
+               ast_channel_set_bridge_role_option(parkee, "holding_participant", "moh_class", musicclass);
+       }
        setup_park_common_datastore(parkee, ast_channel_uniqueid(parker), comeback_override, randomize, time_limit,
                silence_announcements);
        return parking_bridge;
 }
 
+struct ast_bridge *park_common_setup(struct ast_channel *parkee, struct ast_channel *parker,
+               const char *lot_name, const char *comeback_override,
+               int use_ringing, int randomize, int time_limit, int silence_announcements)
+{
+       return park_common_setup2(parkee, parker, lot_name, comeback_override, NULL, use_ringing, randomize, time_limit, silence_announcements);
+}
+
 struct ast_bridge *park_application_setup(struct ast_channel *parkee, struct ast_channel *parker, const char *app_data,
                int *silence_announcements)
 {
@@ -532,12 +551,13 @@ struct ast_bridge *park_application_setup(struct ast_channel *parkee, struct ast
 
        RAII_VAR(char *, comeback_override, NULL, ast_free);
        RAII_VAR(char *, lot_name_app_arg, NULL, ast_free);
+       RAII_VAR(char *, musicclass, NULL, ast_free);
 
        if (app_data) {
-               park_app_parse_data(app_data, silence_announcements, &use_ringing, &randomize, &time_limit, &comeback_override, &lot_name_app_arg);
+               park_app_parse_data(app_data, silence_announcements, &use_ringing, &randomize, &time_limit, &comeback_override, &lot_name_app_arg, &musicclass);
        }
 
-       return park_common_setup(parkee, parker, lot_name_app_arg, comeback_override, use_ringing,
+       return park_common_setup2(parkee, parker, lot_name_app_arg, comeback_override, musicclass, use_ringing,
                randomize, time_limit, silence_announcements ? *silence_announcements : 0);
 
 }