--- apps/app_amd.c.2007-03-08 2007-03-08 18:07:00.000000000 -0700 +++ apps/app_amd.c 2007-03-12 16:24:52.000000000 -0600 @@ -86,6 +86,9 @@ static int dfltMaximumNumberOfWords = 3; static int dfltSilenceThreshold = 256; +/* Set to the lowest ms value provided in amd.conf or application parameters */ +static int dfltMaxWaitTimeForFrame = 50; + static void isAnsweringMachine(struct ast_channel *chan, void *data) { int res = 0; @@ -116,6 +119,7 @@ int betweenWordsSilence = dfltBetweenWordsSilence; int maximumNumberOfWords = dfltMaximumNumberOfWords; int silenceThreshold = dfltSilenceThreshold; + int maxWaitTimeForFrame = dfltMaxWaitTimeForFrame; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(argInitialSilence); @@ -154,6 +158,20 @@ } else if (option_debug) ast_log(LOG_DEBUG, "AMD using the default parameters.\n"); + /* Find lowest ms value, that will be max wait time for a frame */ + if (maxWaitTimeForFrame > initialSilence) + maxWaitTimeForFrame = initialSilence; + if (maxWaitTimeForFrame > greeting) + maxWaitTimeForFrame = greeting; + if (maxWaitTimeForFrame > afterGreetingSilence) + maxWaitTimeForFrame = afterGreetingSilence; + if (maxWaitTimeForFrame > totalAnalysisTime) + maxWaitTimeForFrame = totalAnalysisTime; + if (maxWaitTimeForFrame > minimumWordLength) + maxWaitTimeForFrame = minimumWordLength; + if (maxWaitTimeForFrame > betweenWordsSilence) + maxWaitTimeForFrame = betweenWordsSilence; + /* Now we're ready to roll! */ if (option_verbose > 2) ast_verbose(VERBOSE_PREFIX_3 "AMD: initialSilence [%d] greeting [%d] afterGreetingSilence [%d] " @@ -182,7 +200,8 @@ ast_dsp_set_threshold(silenceDetector, silenceThreshold); /* Now we go into a loop waiting for frames from the channel */ - while ((res = ast_waitfor(chan, totalAnalysisTime)) > -1) { + while ((res = ast_waitfor(chan, 2 * maxWaitTimeForFrame)) > -1) { + /* If we fail to read in a frame, that means they hung up */ if (!(f = ast_read(chan))) { if (option_verbose > 2) @@ -193,9 +212,13 @@ break; } - if (f->frametype == AST_FRAME_VOICE) { + if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_NULL || f->frametype == AST_FRAME_CNG) { /* If the total time exceeds the analysis time then give up as we are not too sure */ - framelength = (ast_codec_get_samples(f) / DEFAULT_SAMPLES_PER_MS); + if (f->frametype == AST_FRAME_VOICE) + framelength = (ast_codec_get_samples(f) / DEFAULT_SAMPLES_PER_MS); + else + framelength += maxWaitTimeForFrame; + iTotalTime += framelength; if (iTotalTime >= totalAnalysisTime) { if (option_verbose > 2) @@ -208,8 +231,12 @@ /* Feed the frame of audio into the silence detector and see if we get a result */ dspsilence = 0; - ast_dsp_silence(silenceDetector, f, &dspsilence); - if (dspsilence) { + if (f->frametype == AST_FRAME_VOICE) + ast_dsp_silence(silenceDetector, f, &dspsilence); + else + dspsilence = maxWaitTimeForFrame; + + if (dspsilence > 0) { silenceDuration = dspsilence; if (silenceDuration >= betweenWordsSilence) {