diff --git a/CHANGES b/CHANGES index c3f804944a..ecf4d23331 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 fd28395f4a..8bffb2958e 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 2f60110567..b55976f950 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -306,7 +306,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") - Append record file when starting/stopping on same conference recording + Append to record file when starting/stopping on same conference recording When record_file_append 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. + + Append the start time to the record_file name so that it is unique. + + When record_file_timestamp is set to yes, the start time is appended to + record_file so that the filename is unique. This allows you to specify + a record_file but not overwrite existing recordings. + + + + Pass additional options to MixMonitor when recording + + Pass additional options to MixMonitor when record_conference is set to yes. + See MixMonitor for available options. + + + + Execute a command after recording ends + + Executes the specified command when recording ends. Any strings matching ^{X} will be + unescaped to X. All variables will be evaluated at the time ConfBridge is called. + + Sets how confbridge handles video distribution to the conference participants @@ -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 4e155e621e..3b62ea1d87 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 860f1cb876..25ca33f8fa 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= ; 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.