Index: apps/app_dial.c =================================================================== --- head/apps/app_dial.c +++ local/apps/app_dial.c @@ -467,6 +467,20 @@ Allow the calling party to enable recording of the call by sending the DTMF sequence defined for one-touch automixmonitor in features.conf. + + @@ -609,6 +623,8 @@ #define OPT_CALLER_ANSWER (1LLU << 40) #define OPT_PREDIAL_CALLEE (1LLU << 41) #define OPT_PREDIAL_CALLER (1LLU << 42) +#define OPT_RINGING_MACRO (1LLU << 43) +#define OPT_PROGRESS_MACRO (1LLU << 44) enum { OPT_ARG_ANNOUNCE = 0, @@ -632,6 +648,8 @@ OPT_ARG_PREDIAL_CALLER, /* note: this entry _MUST_ be the last one in the enum */ OPT_ARG_ARRAY_SIZE, + OPT_ARG_PROGRESS_MACRO, + OPT_ARG_RINGING_MACRO, }; AST_APP_OPTIONS(dial_exec_options, BEGIN_OPTIONS @@ -674,13 +692,15 @@ AST_APP_OPTION('W', OPT_CALLER_MONITOR), AST_APP_OPTION('x', OPT_CALLEE_MIXMONITOR), AST_APP_OPTION('X', OPT_CALLER_MIXMONITOR), + AST_APP_OPTION_ARG('y', OPT_PROGRESS_MACRO, OPT_ARG_PROGRESS_MACRO), + AST_APP_OPTION_ARG('Y', OPT_RINGING_MACRO, OPT_ARG_RINGING_MACRO), AST_APP_OPTION('z', OPT_CANCEL_TIMEOUT), END_OPTIONS ); #define CAN_EARLY_BRIDGE(flags,chan,peer) (!ast_test_flag64(flags, OPT_CALLEE_HANGUP | \ OPT_CALLER_HANGUP | OPT_CALLEE_TRANSFER | OPT_CALLER_TRANSFER | \ OPT_CALLEE_MONITOR | OPT_CALLER_MONITOR | OPT_CALLEE_PARK | \ - OPT_CALLER_PARK | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB) && \ + OPT_CALLER_PARK | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_PROGRESS_MACRO | OPT_RINGING_MACRO | OPT_CALLEE_GOSUB) && \ !ast_channel_audiohooks(chan) && !ast_channel_audiohooks(peer) && \ ast_framehook_list_is_empty(ast_channel_framehooks(chan)) && ast_framehook_list_is_empty(ast_channel_framehooks(peer))) @@ -1398,6 +1418,7 @@ ++num_ringing; if (ignore_cc || cc_frame_received || num_ringing == numlines) { ast_verb(3, "%s is ringing\n", ast_channel_name(c)); + /* Setup early media if appropriate */ if (single && !caller_entertained && CAN_EARLY_BRIDGE(peerflags, in, c)) { @@ -1407,6 +1428,12 @@ ast_indicate(in, AST_CONTROL_RINGING); pa->sentringing++; } + + /* Handle macro callback for this callee-ring event */ + if(!ast_strlen_zero(opt_args[OPT_ARG_RINGING_MACRO])){ + ast_log(LOG_NOTICE, "Executing callback macro '%s' for ringing event\n", opt_args[OPT_ARG_RINGING_MACRO]); + ast_app_exec_macro(in, c, opt_args[OPT_ARG_RINGING_MACRO]); + } } break; case AST_CONTROL_PROGRESS: @@ -1427,6 +1454,10 @@ dtmf_progress); ast_dtmf_stream(c, in, dtmf_progress, 250, 0); } + if(!ast_strlen_zero(opt_args[OPT_ARG_PROGRESS_MACRO])){ + ast_log(LOG_NOTICE, "Executing callback macro '%s' for progress event\n", opt_args[OPT_ARG_PROGRESS_MACRO]); + ast_app_exec_macro(in, c, opt_args[OPT_ARG_PROGRESS_MACRO]); + } break; case AST_CONTROL_VIDUPDATE: case AST_CONTROL_SRCUPDATE: @@ -2303,7 +2334,8 @@ /* Set per dial instance flags. These flags are also passed back to RetryDial. */ ast_copy_flags64(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID | OPT_CALLER_HANGUP | OPT_IGNORE_FORWARDING | OPT_CANCEL_TIMEOUT - | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB | OPT_FORCECLID); + | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_RINGING_MACRO | OPT_PROGRESS_MACRO + | OPT_CALLEE_GOSUB | OPT_FORCECLID); /* PREDIAL: Run gosub on the caller's channel */ if (ast_test_flag64(&opts, OPT_PREDIAL_CALLER)