From ddc2cca659dc7db0a5a5737cdffef92cc2533277 Mon Sep 17 00:00:00 2001 From: Naveen Albert <asterisk@phreaknet.org> Date: Tue, 31 May 2022 10:59:56 +0000 Subject: [PATCH] res_parking: Add music on hold override option. 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 | 4 ++++ res/parking/parking_applications.c | 30 ++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 doc/CHANGES-staging/res_parking_moh.txt diff --git a/doc/CHANGES-staging/res_parking_moh.txt b/doc/CHANGES-staging/res_parking_moh.txt new file mode 100644 index 0000000000..50f589ca43 --- /dev/null +++ b/doc/CHANGES-staging/res_parking_moh.txt @@ -0,0 +1,4 @@ +Subject: res_parking + +An m option to Park and ParkAndAnnounce now allows +specifying a music on hold class override. diff --git a/res/parking/parking_applications.c b/res/parking/parking_applications.c index 17ac4eb0ce..7d11516a1e 100644 --- a/res/parking/parking_applications.c +++ b/res/parking/parking_applications.c @@ -241,6 +241,7 @@ 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); } -- GitLab