@ -60,14 +60,14 @@ static char *descrip =
" This application sets the following channel variable upon completion: \n "
" This application sets the following channel variable upon completion: \n "
" AMDSTATUS - This is the status of the answering machine detection. \n "
" AMDSTATUS - This is the status of the answering machine detection. \n "
" Possible values are: \n "
" Possible values are: \n "
" AMD _ MACHINE | AMD_ PERSON | AMD_ NOTSURE | AMD_ HANGUP\n "
" AMD MACHINE | AMDPERSON | AMDNOTSURE | AMDHANGUP\n "
" AMDCAUSE - Indicates the cause that led to the conclusion. \n "
" AMDCAUSE - Indicates the cause that led to the conclusion. \n "
" Possible values are: \n "
" Possible values are: \n "
" AMD _ TOOLONG-<%d total_time>\n "
" AMD TOOLONG-<%d total_time>\n "
" AMD _ INITIALSILENCE-<%d silenceDuration>-<%d initialSilence>\n "
" AMD INITIALSILENCE-<%d silenceDuration>-<%d initialSilence>\n "
" AMD _ HUMAN-<%d silenceDuration>-<%d afterGreetingSilence>\n "
" AMD HUMAN-<%d silenceDuration>-<%d afterGreetingSilence>\n "
" AMD _ MAXWORDS-<%d wordsCount>-<%d maximumNumberOfWords>\n "
" AMD MAXWORDS-<%d wordsCount>-<%d maximumNumberOfWords>\n "
" AMD _ LONGGREETING-<%d voiceDuration>-<%d greeting>\n " ;
" AMD LONGGREETING-<%d voiceDuration>-<%d greeting>\n " ;
STANDARD_LOCAL_USER ;
STANDARD_LOCAL_USER ;
@ -96,6 +96,7 @@ static void isAnsweringMachine(struct ast_channel *chan, void *data)
struct ast_dsp * silenceDetector ; /* silence detector dsp */
struct ast_dsp * silenceDetector ; /* silence detector dsp */
int dspsilence = 0 ;
int dspsilence = 0 ;
int readFormat ;
int readFormat ;
int framelength ;
int inInitialSilence = 1 ;
int inInitialSilence = 1 ;
int inGreeting = 0 ;
int inGreeting = 0 ;
@ -208,16 +209,17 @@ static void isAnsweringMachine(struct ast_channel *chan, void *data)
/* No Frame: Called Party Must Have Dropped */
/* No Frame: Called Party Must Have Dropped */
ast_verbose ( VERBOSE_PREFIX_3 " AMD: HANGUP \n " ) ;
ast_verbose ( VERBOSE_PREFIX_3 " AMD: HANGUP \n " ) ;
ast_log ( LOG_DEBUG , " Got hangup \n " ) ;
ast_log ( LOG_DEBUG , " Got hangup \n " ) ;
strcpy ( amdStatus , " AMD _ HANGUP" ) ;
strcpy ( amdStatus , " AMD HANGUP" ) ;
strcpy ( amdCause , " " ) ;
strcpy ( amdCause , " " ) ;
break ;
break ;
}
}
iTotalTime + = 20 ;
framelength = ( ast_codec_get_samples ( f ) / 8 ) ;
iTotalTime + = framelength ;
if ( iTotalTime > = totalAnalysisTime ) {
if ( iTotalTime > = totalAnalysisTime ) {
ast_verbose ( VERBOSE_PREFIX_3 " AMD: Channel [%s]. Too long... \n " , chan - > name ) ;
ast_verbose ( VERBOSE_PREFIX_3 " AMD: Channel [%s]. Too long... \n " , chan - > name ) ;
ast_frfree ( f ) ;
ast_frfree ( f ) ;
strcpy ( amdStatus , " AMD _ NOTSURE" ) ;
strcpy ( amdStatus , " AMD NOTSURE" ) ;
sprintf ( amdCause , " AMD _ TOOLONG-%d" , iTotalTime ) ;
sprintf ( amdCause , " AMD TOOLONG-%d" , iTotalTime ) ;
break ;
break ;
}
}
if ( f - > frametype = = AST_FRAME_VOICE ) {
if ( f - > frametype = = AST_FRAME_VOICE ) {
@ -238,8 +240,8 @@ static void isAnsweringMachine(struct ast_channel *chan, void *data)
ast_verbose ( VERBOSE_PREFIX_3 " AMD: ANSWERING MACHINE: silenceDuration:%d initialSilence:%d \n " ,
ast_verbose ( VERBOSE_PREFIX_3 " AMD: ANSWERING MACHINE: silenceDuration:%d initialSilence:%d \n " ,
silenceDuration , initialSilence ) ;
silenceDuration , initialSilence ) ;
ast_frfree ( f ) ;
ast_frfree ( f ) ;
strcpy ( amdStatus , " AMD _ MACHINE" ) ;
strcpy ( amdStatus , " AMD MACHINE" ) ;
sprintf ( amdCause , " AMD _ INITIALSILENCE-%d-%d" , silenceDuration , initialSilence ) ;
sprintf ( amdCause , " AMD INITIALSILENCE-%d-%d" , silenceDuration , initialSilence ) ;
break ;
break ;
}
}
@ -247,13 +249,13 @@ static void isAnsweringMachine(struct ast_channel *chan, void *data)
ast_verbose ( VERBOSE_PREFIX_3 " AMD: HUMAN: silenceDuration:%d afterGreetingSilence:%d \n " ,
ast_verbose ( VERBOSE_PREFIX_3 " AMD: HUMAN: silenceDuration:%d afterGreetingSilence:%d \n " ,
silenceDuration , afterGreetingSilence ) ;
silenceDuration , afterGreetingSilence ) ;
ast_frfree ( f ) ;
ast_frfree ( f ) ;
strcpy ( amdStatus , " AMD _ PERSON" ) ;
strcpy ( amdStatus , " AMD PERSON" ) ;
sprintf ( amdCause , " AMD _ HUMAN-%d-%d" , silenceDuration , afterGreetingSilence ) ;
sprintf ( amdCause , " AMD HUMAN-%d-%d" , silenceDuration , afterGreetingSilence ) ;
break ;
break ;
}
}
} else {
} else {
consecutiveVoiceDuration + = 20 ;
consecutiveVoiceDuration + = framelength ;
voiceDuration + = 20 ;
voiceDuration + = framelength ;
/* ast_verbose(VERBOSE_PREFIX_3 "AMD: %d VOICE: ConsecutiveVoice:%d voiceDuration:%d inGreeting:%d\n", currentState, consecutiveVoiceDuration, voiceDuration, inGreeting ); */
/* ast_verbose(VERBOSE_PREFIX_3 "AMD: %d VOICE: ConsecutiveVoice:%d voiceDuration:%d inGreeting:%d\n", currentState, consecutiveVoiceDuration, voiceDuration, inGreeting ); */
/* If I have enough consecutive voice to say that I am in a Word, I can only increment the
/* If I have enough consecutive voice to say that I am in a Word, I can only increment the
@ -270,8 +272,8 @@ static void isAnsweringMachine(struct ast_channel *chan, void *data)
if ( iWordsCount > = maximumNumberOfWords ) {
if ( iWordsCount > = maximumNumberOfWords ) {
ast_verbose ( VERBOSE_PREFIX_3 " AMD: ANSWERING MACHINE: iWordsCount:%d \n " , iWordsCount ) ;
ast_verbose ( VERBOSE_PREFIX_3 " AMD: ANSWERING MACHINE: iWordsCount:%d \n " , iWordsCount ) ;
ast_frfree ( f ) ;
ast_frfree ( f ) ;
strcpy ( amdStatus , " AMD _ MACHINE" ) ;
strcpy ( amdStatus , " AMD MACHINE" ) ;
sprintf ( amdCause , " AMD _ MAXWORDS-%d-%d" , iWordsCount , maximumNumberOfWords ) ;
sprintf ( amdCause , " AMD MAXWORDS-%d-%d" , iWordsCount , maximumNumberOfWords ) ;
break ;
break ;
}
}
@ -279,8 +281,8 @@ static void isAnsweringMachine(struct ast_channel *chan, void *data)
ast_verbose ( VERBOSE_PREFIX_3 " AMD: ANSWERING MACHINE: voiceDuration:%d greeting:%d \n " ,
ast_verbose ( VERBOSE_PREFIX_3 " AMD: ANSWERING MACHINE: voiceDuration:%d greeting:%d \n " ,
voiceDuration , greeting ) ;
voiceDuration , greeting ) ;
ast_frfree ( f ) ;
ast_frfree ( f ) ;
strcpy ( amdStatus , " AMD _ MACHINE" ) ;
strcpy ( amdStatus , " AMD MACHINE" ) ;
sprintf ( amdCause , " AMD _ LONGGREETING-%d-%d" , voiceDuration , greeting ) ;
sprintf ( amdCause , " AMD LONGGREETING-%d-%d" , voiceDuration , greeting ) ;
break ;
break ;
}
}
if ( voiceDuration > = minimumWordLength ) {
if ( voiceDuration > = minimumWordLength ) {