diff --git a/CHANGES b/CHANGES index c3f804944a06c69ba088080cf20cf65b1f4ba8e3..ecf4d23331904cc5c47fa7233def52db58f107a5 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,21 @@ --- Functionality changes from Asterisk 13 to Asterisk 14 -------------------- ------------------------------------------------------------------------------ +Applications +------------------ + +ConfBridge +------------------ + * Added the ability to pass options to MixMonitor when recording is used with + ConfBridge. This includes the addition of the following configuration + parameters for the 'bridge' object: + - record_file_timestamp: whether or not to append the start time to the + recorded file name + - record_options: the options to pass to the MixMonitor application + - record_command: a command to execute when recording is finished + Note that these options may also be with the CONFBRIDGE function. + + Channel Drivers ------------------ diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c index fd28395f4ac8f5292b4b44052a626c91d13c2eb1..8bffb2958e23924af796d85d5c66010281a00958 100644 --- a/apps/app_confbridge.c +++ b/apps/app_confbridge.c @@ -569,7 +569,7 @@ static void set_rec_filename(struct confbridge_conference *conference, struct as ast_str_reset(*filename); if (ast_strlen_zero(rec_file)) { ast_str_set(filename, 0, "confbridge-%s-%u.wav", conference->name, (unsigned int)now); - } else { + } else if (ast_test_flag(&conference->b_profile, BRIDGE_OPT_RECORD_FILE_TIMESTAMP)) { /* insert time before file extension */ ext = strrchr(rec_file, '.'); if (ext) { @@ -578,11 +578,14 @@ static void set_rec_filename(struct confbridge_conference *conference, struct as } else { ast_str_set(filename, 0, "%s-%u", rec_file, (unsigned int)now); } + } else { + ast_str_set(filename, 0, "%s", rec_file); } - if (ast_test_flag(&conference->b_profile, BRIDGE_OPT_RECORD_FILE_APPEND)) { - ast_str_append(filename, 0, ",a"); - } + ast_str_append(filename, 0, ",%s%s,%s", + ast_test_flag(&conference->b_profile, BRIDGE_OPT_RECORD_FILE_APPEND) ? "a" : "", + conference->b_profile.rec_options, + conference->b_profile.rec_command); } static int is_new_rec_file(const char *rec_file, struct ast_str **orig_rec_file) diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c index 2f60110567bf0ab48f18c398e4fc52f20f6c3fd2..b55976f9501102c400cdc677d9025d2d8e6ffe00 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -306,7 +306,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") </para></description> </configOption> <configOption name="record_file_append" default="yes"> - <synopsis>Append record file when starting/stopping on same conference recording</synopsis> + <synopsis>Append to record file when starting/stopping on same conference recording</synopsis> <description><para> When <replaceable>record_file_append</replaceable> is set to yes, stopping and starting recording on a conference adds the new portion to end of current record_file. When this is @@ -314,6 +314,28 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") on a conference. </para></description> </configOption> + <configOption name="record_file_timestamp" default="yes"> + <synopsis>Append the start time to the <replaceable>record_file</replaceable> name so that it is unique.</synopsis> + <description><para> + When <replaceable>record_file_timestamp</replaceable> is set to yes, the start time is appended to + <replaceable>record_file</replaceable> so that the filename is unique. This allows you to specify + a <replaceable>record_file</replaceable> but not overwrite existing recordings. + </para></description> + </configOption> + <configOption name="record_options" default=""> + <synopsis>Pass additional options to MixMonitor when recording</synopsis> + <description><para> + Pass additional options to MixMonitor when <replaceable>record_conference</replaceable> is set to yes. + See <literal>MixMonitor</literal> for available options. + </para></description> + </configOption> + <configOption name="record_command" default=""> + <synopsis>Execute a command after recording ends</synopsis> + <description><para> + Executes the specified command when recording ends. Any strings matching <literal>^{X}</literal> will be + unescaped to <variable>X</variable>. All variables will be evaluated at the time ConfBridge is called. + </para></description> + </configOption> <configOption name="video_mode"> <synopsis>Sets how confbridge handles video distribution to the conference participants</synopsis> <description><para> @@ -1524,10 +1546,20 @@ static char *handle_cli_confbridge_show_bridge_profile(struct ast_cli_entry *e, b_profile.flags & BRIDGE_OPT_RECORD_FILE_APPEND ? "yes" : "no"); + ast_cli(a->fd,"Record File Timestamp: %s\n", + b_profile.flags & BRIDGE_OPT_RECORD_FILE_TIMESTAMP ? + "yes" : "no"); + ast_cli(a->fd,"Record File: %s\n", ast_strlen_zero(b_profile.rec_file) ? "Auto Generated" : b_profile.rec_file); + ast_cli(a->fd,"Record Options: %s\n", + b_profile.rec_options); + + ast_cli(a->fd,"Record Command: %s\n", + b_profile.rec_command); + if (b_profile.max_members) { ast_cli(a->fd,"Max Members: %u\n", b_profile.max_members); } else { @@ -2096,8 +2128,11 @@ int conf_load_config(void) aco_option_register(&cfg_info, "record_conference", ACO_EXACT, bridge_types, "no", OPT_BOOLFLAG_T, 1, FLDSET(struct bridge_profile, flags), BRIDGE_OPT_RECORD_CONFERENCE); aco_option_register_custom(&cfg_info, "video_mode", ACO_EXACT, bridge_types, NULL, video_mode_handler, 0); aco_option_register(&cfg_info, "record_file_append", ACO_EXACT, bridge_types, "yes", OPT_BOOLFLAG_T, 1, FLDSET(struct bridge_profile, flags), BRIDGE_OPT_RECORD_FILE_APPEND); + aco_option_register(&cfg_info, "record_file_timestamp", ACO_EXACT, bridge_types, "yes", OPT_BOOLFLAG_T, 1, FLDSET(struct bridge_profile, flags), BRIDGE_OPT_RECORD_FILE_TIMESTAMP); aco_option_register(&cfg_info, "max_members", ACO_EXACT, bridge_types, "0", OPT_UINT_T, 0, FLDSET(struct bridge_profile, max_members)); aco_option_register(&cfg_info, "record_file", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_file)); + aco_option_register(&cfg_info, "record_options", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_options)); + aco_option_register(&cfg_info, "record_command", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_command)); aco_option_register(&cfg_info, "language", ACO_EXACT, bridge_types, "en", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, language)); aco_option_register_custom(&cfg_info, "^sound_", ACO_REGEX, bridge_types, NULL, sound_option_handler, 0); /* This option should only be used with the CONFBRIDGE dialplan function */ diff --git a/apps/confbridge/include/confbridge.h b/apps/confbridge/include/confbridge.h index 4e155e621e797ae4e2976b03fceb8cf04708b24e..3b62ea1d87941efce230a0ee6de1295775b0bbb3 100644 --- a/apps/confbridge/include/confbridge.h +++ b/apps/confbridge/include/confbridge.h @@ -68,6 +68,7 @@ enum bridge_profile_flags { BRIDGE_OPT_VIDEO_SRC_FIRST_MARKED = (1 << 2), /*!< Set if conference should feed video of first marked user to all participants. */ BRIDGE_OPT_VIDEO_SRC_FOLLOW_TALKER = (1 << 3), /*!< Set if conference set the video feed to follow the loudest talker. */ BRIDGE_OPT_RECORD_FILE_APPEND = (1 << 4), /*!< Set if the record file should be appended to between start/stops. */ + BRIDGE_OPT_RECORD_FILE_TIMESTAMP = (1 << 5), /*< Set if the record file should have a timestamp appended */ }; enum conf_menu_action_id { @@ -198,6 +199,8 @@ struct bridge_profile { char name[64]; char language[MAX_LANGUAGE]; /*!< Language used for playback_chan */ char rec_file[PATH_MAX]; + char rec_options[128]; + char rec_command[128]; unsigned int flags; unsigned int max_members; /*!< The maximum number of participants allowed in the conference */ unsigned int internal_sample_rate; /*!< The internal sample rate of the bridge. 0 when set to auto adjust mode. */ diff --git a/configs/samples/confbridge.conf.sample b/configs/samples/confbridge.conf.sample index 860f1cb876e69d4cbd306d74d2b3619ea2352ed0..25ca33f8faff2e9b0e923e87793082dc31315bcb 100644 --- a/configs/samples/confbridge.conf.sample +++ b/configs/samples/confbridge.conf.sample @@ -163,6 +163,12 @@ type=bridge ; By default, the record_file is stored in Asterisk's spool/monitor directory ; with a unique filename starting with the 'confbridge' prefix. +;record_file_append=yes ; Append record file when starting/stopping on same conference recording. +;record_file_timestamp=yes ; Append the start time to the record file name. + +;record_options= ; Pass additional options to MixMonitor. +;record_command=</path/to/command> ; Command to execute when recording finishes. + ;internal_sample_rate=auto ; Sets the internal native sample rate the ; conference is mixed at. This is set to automatically ; adjust the sample rate to the best quality by default.