diff --git a/line-dect.c b/line-dect.c index d505734f5668f87988a391cc02247a4ab5bfc36c..6ea562dfcf07cd44450e425bef62b7a7c259f200 100644 --- a/line-dect.c +++ b/line-dect.c @@ -69,6 +69,12 @@ int ubus_process_queued_reqs_to_dectmngr(void) { return -1; } break; + case ACTION_SIG_BUSY_TONE: + if(ubus_call_dectmngr(voicemngr_line_to_dectmngr_line(req->line), 0, 2, req->caller_id, req->pcm_id, req)) { + free(req); + return -1; + } + break; case ACTION_SIG_ANSWERED: if(ubus_call_dectmngr(voicemngr_line_to_dectmngr_line(req->line), 2, 0, req->caller_id, req->pcm_id, req)) { free(req); diff --git a/line.c b/line.c index 5ec9f99c3b9543c0bd6f42a98b6ca1b45296f3e7..84841ade7a60898cedc85fc13f7109bc31266c83 100644 --- a/line.c +++ b/line.c @@ -92,6 +92,46 @@ static int perhaps_simulate_busy(int line, struct voice_ubus_req_t *ubus_req) return 1; } +//---------------------------------------------------------------------------------- +// DECT handset tone trigger +static int dect_tone_play(int line, int pcm, enum VOICE_SIGNAL signal, const char *data, struct voice_ubus_req_t *ubus_req) +{ + struct line_req_t *line_req = NULL; + ENDPT_DBG("%s: line=%d, pcm=%d, data=%s\n", __func__, line, pcm, data); + pcm_states_dump(__func__, line); + + assert(ubus_req); + line_req = calloc(1, sizeof(struct line_req_t)); + if(!line_req) { + ENDPT_DBG("%s: out of memory\n", __func__); + return -1; + } + line_req->line = line; + line_req->connection_id = -1; + line_req->pcm_id = pcm; + switch(signal) { + case VOICE_SIG_UNOBTAINABLE: + case VOICE_SIG_BUSY: + case VOICE_SIG_NETBUSY: + line_req->action = ACTION_SIG_BUSY_TONE; //only busy tone available + break; + default: + free(line_req); + return -1; + } + + ENDPT_DBG("%s: line %d set pcm to %d\n", __func__, line, line_req->pcm_id); + memcpy(&line_req->ubus, ubus_req, sizeof(struct voice_ubus_req_t)); + + assert(lines[line].type == VOICE_LINE_DECT); + assert(line_req); + if(ubus_queue_req_to_dectmngr(line_req) || ubus_process_queued_reqs_to_dectmngr()) + return -1; + ubus_defer_request(line_req->ubus.ctx, line_req->ubus.reqIn, &line_req->ubus.reqOut); + line_req->ubus.reqIn = NULL; + + return 0; +} //---------------------------------------------------------------------------------- // Asterisk wants to make a FXS phone or DECT handset ring probably with a caller ID @@ -266,19 +306,25 @@ int line_signal(int line, const char *signame, const char *data, struct voice_ub break; case VOICE_SIG_UNOBTAINABLE: - case VOICE_SIG_BUSY: if (lines[line].type == VOICE_LINE_DECT) { + pcm_states_dump(__func__, line); send_dect_event_to_asterisk(line, dect_event_map[DECT_EVT_RELEASE]); } else { res = voice_line_signal(line, -1, sig->signal, atoi(data), NULL); } break; - + case VOICE_SIG_BUSY: case VOICE_SIG_NETBUSY: if (lines[line].type == VOICE_LINE_DECT) { - send_dect_event_to_asterisk(line, dect_event_map[DECT_EVT_RELEASE]); + pcm_states_dump(__func__, line); + if (get_callid_state(lines[line].pcm_callid[PCM_0])==CALLID_ESTABLISHED && get_callid_state(lines[line].pcm_callid[PCM_1])==CALLID_ESTABLISHED){ + send_dect_event_to_asterisk(line, dect_event_map[DECT_EVT_RELEASE]); + } else if (get_callid_state(lines[line].pcm_callid[PCM_0]) == CALLID_ESTABLISHED || get_callid_state(lines[line].pcm_callid[PCM_1]) == CALLID_ESTABLISHED){ + // play tone on DECT + res = dect_tone_play(line, get_callid_state(lines[line].pcm_callid[PCM_0]) == CALLID_ESTABLISHED ? PCM_0 : PCM_1, sig->signal, data, ubus_req); + } } else { - res = voice_line_signal(line, -1, sig->signal, atoi(data), NULL); + res = voice_line_signal(line, -1, VOICE_SIG_BUSY, atoi(data), NULL); } break; diff --git a/line.h b/line.h index 17c1253653aa1abf0db766099ee3c5d034cf40b8..3951ab1feb08ef0d6abb8916fd813b20f0d46292 100644 --- a/line.h +++ b/line.h @@ -11,6 +11,7 @@ enum line_action_t { ACTION_CONN_CLOSE, ACTION_SIG_RING, ACTION_SIG_ANSWERED, + ACTION_SIG_BUSY_TONE, }; // In UBUS request to voicemngr we need to define what this request is about