FreeCalypso > hg > themwi-system-sw
diff sip-in/mgw_ops.c @ 128:5685412bd6aa
sip-in: pass DTMF start & stop to themwi-mgw
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 01 Oct 2022 23:07:01 -0800 |
parents | c1c94b7fc2e2 |
children | e499e8db8b82 |
line wrap: on
line diff
--- a/sip-in/mgw_ops.c Sat Oct 01 20:31:15 2022 -0800 +++ b/sip-in/mgw_ops.c Sat Oct 01 23:07:01 2022 -0800 @@ -102,6 +102,39 @@ call->mgw_xact_id = req.transact_ref; } +void +tmgw_send_dtmf_start(call) + struct call *call; +{ + struct tmgw_ctrl_req req; + + bzero(&req, sizeof req); + req.opcode = TMGW_CTRL_OP_DTMF_START; + req.transact_ref = get_new_tmgw_xact_id(); + req.ep_id = call->mgw_ep_id; + req.fwd_mode = call->dtmf_digit; + send_req_to_tmgw(&req); + call->mgw_state = MGW_STATE_DTMF_OP; + call->mgw_xact = TMGW_CTRL_OP_DTMF_START; + call->mgw_xact_id = req.transact_ref; +} + +void +tmgw_send_dtmf_stop(call) + struct call *call; +{ + struct tmgw_ctrl_req req; + + bzero(&req, sizeof req); + req.opcode = TMGW_CTRL_OP_DTMF_STOP; + req.transact_ref = get_new_tmgw_xact_id(); + req.ep_id = call->mgw_ep_id; + send_req_to_tmgw(&req); + call->mgw_state = MGW_STATE_DTMF_OP; + call->mgw_xact = TMGW_CTRL_OP_DTMF_STOP; + call->mgw_xact_id = req.transact_ref; +} + static void handle_crcx_fail(call, msg) struct call *call; @@ -227,6 +260,39 @@ transition_dead_sip(call); } +static void +dtmf_start_response(call, msg) + struct call *call; + struct tmgw_ctrl_resp *msg; +{ + if (call->overall_state == OVERALL_STATE_TEARDOWN) { + tmgw_send_dlcx(call); + return; + } + if (msg->res == TMGW_RESP_OK) + mncc_dtmf_start_ok(call); + else + mncc_dtmf_start_err(call); + if (call->dtmf_pending_stop) + tmgw_send_dtmf_stop(call); + else + call->mgw_state = MGW_STATE_COMPLETE; +} + +static void +dtmf_stop_response(call, msg) + struct call *call; + struct tmgw_ctrl_resp *msg; +{ + if (call->overall_state == OVERALL_STATE_TEARDOWN) { + tmgw_send_dlcx(call); + return; + } + mncc_dtmf_stop_ok(call); + call->mgw_state = MGW_STATE_COMPLETE; + call->dtmf_pending_stop = 0; +} + void process_tmgw_response(msg) struct tmgw_ctrl_resp *msg; @@ -253,6 +319,12 @@ case TMGW_CTRL_OP_DLCX: dlcx_response(call, msg); return; + case TMGW_CTRL_OP_DTMF_START: + dtmf_start_response(call, msg); + return; + case TMGW_CTRL_OP_DTMF_STOP: + dtmf_stop_response(call, msg); + return; default: syslog(LOG_CRIT, "FATAL: invalid opcode 0x%x in call->msg_xact", opc);