@ -594,6 +594,7 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura
struct codec_handler * ch = NULL ;
struct codec_handler * ch = NULL ;
struct codec_ssrc_handler * csh = NULL ;
struct codec_ssrc_handler * csh = NULL ;
int pt = - 1 ;
int pt = - 1 ;
int ch_pt = - 1 ;
for ( int i = 0 ; i < ssrc_in - > tracker . most_len ; i + + ) {
for ( int i = 0 ; i < ssrc_in - > tracker . most_len ; i + + ) {
pt = ssrc_in - > tracker . most [ i ] ;
pt = ssrc_in - > tracker . most [ i ] ;
if ( pt = = 255 )
if ( pt = = 255 )
@ -602,8 +603,11 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura
ch = codec_handler_get ( media , pt , sink , NULL ) ;
ch = codec_handler_get ( media , pt , sink , NULL ) ;
if ( ! ch )
if ( ! ch )
continue ;
continue ;
// for DTMF delay, payload type will be -1 but the real payload type will be correct
// and as we're specifically injecting we want to make sure we end up checking the right pt
ch_pt = ch - > real_dtmf_payload_type ! = - 1 ? ch - > real_dtmf_payload_type : ch - > dtmf_payload_type ;
// skip DTMF PTs
// skip DTMF PTs
if ( pt = = ch - > dtmf_payload_type )
if ( pt = = ch _pt)
continue ;
continue ;
if ( ch - > output_handler & & ch - > output_handler - > ssrc_hash ) // context switch if we have multiple inputs going to one output
if ( ch - > output_handler & & ch - > output_handler - > ssrc_hash ) // context switch if we have multiple inputs going to one output
ch = ch - > output_handler ;
ch = ch - > output_handler ;
@ -612,7 +616,7 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura
pt ,
pt ,
ch - > source_pt . payload_type ,
ch - > source_pt . payload_type ,
ch - > dest_pt . payload_type ,
ch - > dest_pt . payload_type ,
ch - > dtmf _payload_ type ,
ch _pt,
ssrc_in - > parent - > h . ssrc ) ;
ssrc_in - > parent - > h . ssrc ) ;
if ( ! ch - > ssrc_hash )
if ( ! ch - > ssrc_hash )
@ -633,7 +637,7 @@ const char *dtmf_inject(struct call_media *media, int code, int volume, int dura
return " No matching codec SSRC handler " ;
return " No matching codec SSRC handler " ;
// if we don't have a DTMF payload type, we have to generate PCM
// if we don't have a DTMF payload type, we have to generate PCM
if ( ch - > dtmf _payload_ type = = - 1 & & ch - > dtmf_injector )
if ( ch _pt = = - 1 & & ch - > dtmf_injector )
return dtmf_inject_pcm ( media , sink , monologue , ps , ssrc_in , ch , csh , code , volume , duration ,
return dtmf_inject_pcm ( media , sink , monologue , ps , ssrc_in , ch , csh , code , volume , duration ,
pause ) ;
pause ) ;