|
|
|
@ -1018,6 +1018,35 @@ static void call_ng_codec_flags(struct sdp_ng_flags *out, str *key, bencode_item
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void call_ng_parse_block_mode(str *s, enum block_dtmf_mode *output) {
|
|
|
|
|
|
|
|
switch (__csh_lookup(s)) {
|
|
|
|
|
|
|
|
case CSH_LOOKUP("off"):
|
|
|
|
|
|
|
|
*output = BLOCK_DTMF_OFF;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("drop"):
|
|
|
|
|
|
|
|
*output = BLOCK_DTMF_DROP;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("silence"):
|
|
|
|
|
|
|
|
*output = BLOCK_DTMF_SILENCE;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("tone"):
|
|
|
|
|
|
|
|
*output = BLOCK_DTMF_TONE;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("random"):
|
|
|
|
|
|
|
|
*output = BLOCK_DTMF_RANDOM;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("zero"):
|
|
|
|
|
|
|
|
*output = BLOCK_DTMF_ZERO;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("DTMF"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("dtmf"):
|
|
|
|
|
|
|
|
*output = BLOCK_DTMF_DTMF;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
ilog(LOG_WARN, "Unknown DTMF block mode encountered: '" STR_FORMAT "'",
|
|
|
|
|
|
|
|
STR_FMT(s));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
static void call_ng_main_flags(struct sdp_ng_flags *out, str *key, bencode_item_t *value) {
|
|
|
|
static void call_ng_main_flags(struct sdp_ng_flags *out, str *key, bencode_item_t *value) {
|
|
|
|
str s = STR_NULL;
|
|
|
|
str s = STR_NULL;
|
|
|
|
bencode_item_t *it;
|
|
|
|
bencode_item_t *it;
|
|
|
|
@ -1328,6 +1357,27 @@ static void call_ng_main_flags(struct sdp_ng_flags *out, str *key, bencode_item_
|
|
|
|
if (s.len == 1)
|
|
|
|
if (s.len == 1)
|
|
|
|
out->digit = s.s[0];
|
|
|
|
out->digit = s.s[0];
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("trigger"):
|
|
|
|
|
|
|
|
out->trigger = s;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("trigger-end"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("trigger end"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("end trigger"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("end-trigger"):
|
|
|
|
|
|
|
|
out->trigger_end = s;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("trigger-end-time"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("trigger end time"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("end-trigger-time"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("end trigger time"):
|
|
|
|
|
|
|
|
out->trigger_end_ms = bencode_get_integer_str(value, out->trigger_end_ms);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("trigger-end-digits"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("trigger end digits"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("end-trigger-digits"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("end trigger digits"):
|
|
|
|
|
|
|
|
out->trigger_end_digits = bencode_get_integer_str(value, out->trigger_end_digits);
|
|
|
|
|
|
|
|
break;
|
|
|
|
#ifdef WITH_TRANSCODING
|
|
|
|
#ifdef WITH_TRANSCODING
|
|
|
|
case CSH_LOOKUP("T38"):
|
|
|
|
case CSH_LOOKUP("T38"):
|
|
|
|
case CSH_LOOKUP("T.38"):
|
|
|
|
case CSH_LOOKUP("T.38"):
|
|
|
|
@ -1339,30 +1389,19 @@ static void call_ng_main_flags(struct sdp_ng_flags *out, str *key, bencode_item_
|
|
|
|
case CSH_LOOKUP("dtmf-security"):
|
|
|
|
case CSH_LOOKUP("dtmf-security"):
|
|
|
|
case CSH_LOOKUP("DTMF security"):
|
|
|
|
case CSH_LOOKUP("DTMF security"):
|
|
|
|
case CSH_LOOKUP("dtmf security"):
|
|
|
|
case CSH_LOOKUP("dtmf security"):
|
|
|
|
switch (__csh_lookup(&s)) {
|
|
|
|
call_ng_parse_block_mode(&s, &out->block_dtmf_mode);
|
|
|
|
case CSH_LOOKUP("drop"):
|
|
|
|
break;
|
|
|
|
out->block_dtmf_mode = BLOCK_DTMF_DROP;
|
|
|
|
case CSH_LOOKUP("DTMF-security-trigger"):
|
|
|
|
break;
|
|
|
|
case CSH_LOOKUP("dtmf-security-trigger"):
|
|
|
|
case CSH_LOOKUP("silence"):
|
|
|
|
case CSH_LOOKUP("DTMF security trigger"):
|
|
|
|
out->block_dtmf_mode = BLOCK_DTMF_SILENCE;
|
|
|
|
case CSH_LOOKUP("dtmf security trigger"):
|
|
|
|
break;
|
|
|
|
call_ng_parse_block_mode(&s, &out->block_dtmf_mode_trigger);
|
|
|
|
case CSH_LOOKUP("tone"):
|
|
|
|
break;
|
|
|
|
out->block_dtmf_mode = BLOCK_DTMF_TONE;
|
|
|
|
case CSH_LOOKUP("DTMF-security-trigger-end"):
|
|
|
|
break;
|
|
|
|
case CSH_LOOKUP("dtmf-security-trigger-end"):
|
|
|
|
case CSH_LOOKUP("random"):
|
|
|
|
case CSH_LOOKUP("DTMF security trigger end"):
|
|
|
|
out->block_dtmf_mode = BLOCK_DTMF_RANDOM;
|
|
|
|
case CSH_LOOKUP("dtmf security trigger end"):
|
|
|
|
break;
|
|
|
|
call_ng_parse_block_mode(&s, &out->block_dtmf_mode_trigger_end);
|
|
|
|
case CSH_LOOKUP("zero"):
|
|
|
|
|
|
|
|
out->block_dtmf_mode = BLOCK_DTMF_ZERO;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CSH_LOOKUP("DTMF"):
|
|
|
|
|
|
|
|
case CSH_LOOKUP("dtmf"):
|
|
|
|
|
|
|
|
out->block_dtmf_mode = BLOCK_DTMF_DTMF;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
ilog(LOG_WARN, "Unknown 'DTMF-security' flag encountered: '" STR_FORMAT "'",
|
|
|
|
|
|
|
|
STR_FMT(&s));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case CSH_LOOKUP("delay-buffer"):
|
|
|
|
case CSH_LOOKUP("delay-buffer"):
|
|
|
|
case CSH_LOOKUP("delay buffer"):
|
|
|
|
case CSH_LOOKUP("delay buffer"):
|
|
|
|
@ -1371,6 +1410,7 @@ static void call_ng_main_flags(struct sdp_ng_flags *out, str *key, bencode_item_
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void call_ng_process_flags(struct sdp_ng_flags *out, bencode_item_t *input, enum call_opmode opmode) {
|
|
|
|
static void call_ng_process_flags(struct sdp_ng_flags *out, bencode_item_t *input, enum call_opmode opmode) {
|
|
|
|
call_ng_flags_init(out, opmode);
|
|
|
|
call_ng_flags_init(out, opmode);
|
|
|
|
call_ng_dict_iter(out, input, call_ng_main_flags);
|
|
|
|
call_ng_dict_iter(out, input, call_ng_main_flags);
|
|
|
|
@ -2394,6 +2434,13 @@ static void call_monologue_set_block_mode(struct call_monologue *ml, struct sdp_
|
|
|
|
ml->dtmf_digit = flags->digit;
|
|
|
|
ml->dtmf_digit = flags->digit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
call_str_cpy(ml->call, &ml->dtmf_trigger, &flags->trigger);
|
|
|
|
|
|
|
|
call_str_cpy(ml->call, &ml->dtmf_trigger_end, &flags->trigger_end);
|
|
|
|
|
|
|
|
ml->block_dtmf_trigger = flags->block_dtmf_mode_trigger;
|
|
|
|
|
|
|
|
ml->dtmf_trigger_match = 0;
|
|
|
|
|
|
|
|
ml->dtmf_trigger_digits = flags->trigger_end_digits;
|
|
|
|
|
|
|
|
ml->block_dtmf_trigger_end_ms = flags->trigger_end_ms;
|
|
|
|
|
|
|
|
|
|
|
|
codec_update_all_handlers(ml);
|
|
|
|
codec_update_all_handlers(ml);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const char *call_block_dtmf_ng(bencode_item_t *input, bencode_item_t *output) {
|
|
|
|
const char *call_block_dtmf_ng(bencode_item_t *input, bencode_item_t *output) {
|
|
|
|
@ -2407,6 +2454,9 @@ const char *call_block_dtmf_ng(bencode_item_t *input, bencode_item_t *output) {
|
|
|
|
return errstr;
|
|
|
|
return errstr;
|
|
|
|
|
|
|
|
|
|
|
|
enum block_dtmf_mode mode = BLOCK_DTMF_DROP;
|
|
|
|
enum block_dtmf_mode mode = BLOCK_DTMF_DROP;
|
|
|
|
|
|
|
|
// special case default: if there's a trigger, default block mode is none
|
|
|
|
|
|
|
|
if (flags.block_dtmf_mode_trigger || flags.trigger.len)
|
|
|
|
|
|
|
|
mode = BLOCK_DTMF_OFF;
|
|
|
|
if (flags.block_dtmf_mode)
|
|
|
|
if (flags.block_dtmf_mode)
|
|
|
|
mode = flags.block_dtmf_mode;
|
|
|
|
mode = flags.block_dtmf_mode;
|
|
|
|
|
|
|
|
|
|
|
|
@ -2420,7 +2470,7 @@ const char *call_block_dtmf_ng(bencode_item_t *input, bencode_item_t *output) {
|
|
|
|
call->block_dtmf = mode;
|
|
|
|
call->block_dtmf = mode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (is_dtmf_replace_mode(mode) || flags.delay_buffer >= 0) {
|
|
|
|
if (is_dtmf_replace_mode(mode) || flags.delay_buffer >= 0 || flags.trigger.len) {
|
|
|
|
if (monologue)
|
|
|
|
if (monologue)
|
|
|
|
call_monologue_set_block_mode(monologue, &flags);
|
|
|
|
call_monologue_set_block_mode(monologue, &flags);
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
|