diff --git a/libvoice/broadcom/brcm-line.c b/libvoice/broadcom/brcm-line.c index 33c557c30493970ea5856fd4c8ea865bd74b5dc3..476909248ace02b31758c6765390837546442648 100644 --- a/libvoice/broadcom/brcm-line.c +++ b/libvoice/broadcom/brcm-line.c @@ -34,7 +34,7 @@ static const struct vrg_country_t vrg_country_map[] = { { .name = "TW", .vrg_country = VRG_COUNTRY_TAIWAN }, { .name = "57", .vrg_country = VRG_COUNTRY_TR57 }, { .name = "UK", .vrg_country = VRG_COUNTRY_UK }, - { .name = "", .vrg_country = VRG_COUNTRY_LAST }, + { .name = "", .vrg_country = VRG_COUNTRY_MAX }, }; static VRG_COUNTRY config_country = VRG_COUNTRY_SWEDEN; @@ -119,7 +119,7 @@ int voice_set_country(const char *country_code) { return -1; /* Check if the country code is supported */ - for (country = vrg_country_map; country->vrg_country != VRG_COUNTRY_LAST; country++) { + for (country = vrg_country_map; country->vrg_country != VRG_COUNTRY_MAX; country++) { if (strncasecmp(country_code, country->name, strlen(country->name)) == 0) { config_country = country->vrg_country; return 0; diff --git a/libvoice/libvoice.h b/libvoice/libvoice.h index 7da18a73ae0744ee78422621c4902e8c31e1d61a..74cd93642612392cdb142d09eaaf4b68e88dcbe6 100644 --- a/libvoice/libvoice.h +++ b/libvoice/libvoice.h @@ -56,6 +56,37 @@ enum DECT_EVENT { DECT_EVT_END }; +enum VOICE_SIGNAL { + VOICE_SIG_DIAL, + VOICE_SIG_RINGBACK, + VOICE_SIG_STUTTER, + VOICE_SIG_UNOBTAINABLE, + VOICE_SIG_CALL_WAITING, + VOICE_SIG_BUSY, + VOICE_SIG_RINGING, + VOICE_SIG_CALLID_RINGING, + VOICE_SIG_CALLID, + VOICE_SIG_NETBUSY, + VOICE_SIG_DTMF0, + VOICE_SIG_DTMF1, + VOICE_SIG_DTMF2, + VOICE_SIG_DTMF3, + VOICE_SIG_DTMF4, + VOICE_SIG_DTMF5, + VOICE_SIG_DTMF6, + VOICE_SIG_DTMF7, + VOICE_SIG_DTMF8, + VOICE_SIG_DTMF9, + VOICE_SIG_DTMFH, + VOICE_SIG_DTMFS, + VOICE_SIG_DTMFA, + VOICE_SIG_DTMFB, + VOICE_SIG_DTMFC, + VOICE_SIG_DTMFD, + VOICE_SIG_INGRESS_DTMF, // Simulate phone keypad button pressing + VOICE_SIG_LAST +}; + enum LINE_PCM_ID { PCM_0, PCM_1 diff --git a/line.c b/line.c index 5465f61a35335c9d2fcda7f26e3cbbd7a5914fd4..89b38cd8c10c3459b451e1b8f110c9ed8eec40f2 100644 --- a/line.c +++ b/line.c @@ -29,43 +29,40 @@ enum { ACTION_LAST, }; -#define VRG_COUNTRY_LAST 9999 - -struct epsig { +struct voice_signal_t { const char *name; - EPSIG epsig; + enum VOICE_SIGNAL signal; }; -static const struct epsig epsig_map[] = { // For generating a signal to the phone - { .name = "dial", .epsig = EPSIG_DIAL }, - { .name = "ringback", .epsig = EPSIG_RINGBACK }, - { .name = "stutter", .epsig = EPSIG_STUTTER }, - { .name = "unobtainable", .epsig = EPSIG_RINGBACK_CUST1 }, // Maps onto ToneUserDefined1 in endpoint_api.h - { .name = "callwt", .epsig = EPSIG_CALLWT }, - { .name = "busy", .epsig = EPSIG_BUSY }, - { .name = "ringing", .epsig = EPSIG_RINGING }, - { .name = "callid_ringing", .epsig = EPSIG_CALLID_RINGING }, - { .name = "callid", .epsig = EPSIG_CALLID }, - { .name = "congestion", .epsig = EPSIG_NETBUSY }, - { .name = "dial2", .epsig = EPSIG_DIAL2 }, - { .name = "dtmf0", .epsig = EPSIG_DTMF0 }, - { .name = "dtmf1", .epsig = EPSIG_DTMF1 }, - { .name = "dtmf2", .epsig = EPSIG_DTMF2 }, - { .name = "dtmf3", .epsig = EPSIG_DTMF3 }, - { .name = "dtmf4", .epsig = EPSIG_DTMF4 }, - { .name = "dtmf5", .epsig = EPSIG_DTMF5 }, - { .name = "dtmf6", .epsig = EPSIG_DTMF6 }, - { .name = "dtmf7", .epsig = EPSIG_DTMF7 }, - { .name = "dtmf8", .epsig = EPSIG_DTMF8 }, - { .name = "dtmf9", .epsig = EPSIG_DTMF9 }, - { .name = "dtmf#", .epsig = EPSIG_DTMFH }, - { .name = "dtmf*", .epsig = EPSIG_DTMFS }, - { .name = "dtmfA", .epsig = EPSIG_DTMFA }, - { .name = "dtmfB", .epsig = EPSIG_DTMFB }, - { .name = "dtmfC", .epsig = EPSIG_DTMFC }, - { .name = "dtmfD", .epsig = EPSIG_DTMFD }, - { .name = "keypad", .epsig = EPSIG_INGRESS_DTMF }, - { .name = "", .epsig = EPSIG_LAST }, +static const struct voice_signal_t signal_map[] = { // For generating a signal to the phone + { .name = "dial", .signal = VOICE_SIG_DIAL }, + { .name = "ringback", .signal = VOICE_SIG_RINGBACK }, + { .name = "stutter", .signal = VOICE_SIG_STUTTER }, + { .name = "unobtainable", .signal = VOICE_SIG_RINGBACK_CUST1 }, // Maps onto ToneUserDefined1 in endpoint_api.h + { .name = "callwt", .signal = VOICE_SIG_CALLWT }, + { .name = "busy", .signal = VOICE_SIG_BUSY }, + { .name = "ringing", .signal = VOICE_SIG_RINGING }, + { .name = "callid_ringing", .signal = VOICE_SIG_CALLID_RINGING }, + { .name = "callid", .signal = VOICE_SIG_CALLID }, + { .name = "congestion", .signal = VOICE_SIG_NETBUSY }, + { .name = "dtmf0", .signal = VOICE_SIG_DTMF0 }, + { .name = "dtmf1", .signal = VOICE_SIG_DTMF1 }, + { .name = "dtmf2", .signal = VOICE_SIG_DTMF2 }, + { .name = "dtmf3", .signal = VOICE_SIG_DTMF3 }, + { .name = "dtmf4", .signal = VOICE_SIG_DTMF4 }, + { .name = "dtmf5", .signal = VOICE_SIG_DTMF5 }, + { .name = "dtmf6", .signal = VOICE_SIG_DTMF6 }, + { .name = "dtmf7", .signal = VOICE_SIG_DTMF7 }, + { .name = "dtmf8", .signal = VOICE_SIG_DTMF8 }, + { .name = "dtmf9", .signal = VOICE_SIG_DTMF9 }, + { .name = "dtmf#", .signal = VOICE_SIG_DTMFH }, + { .name = "dtmf*", .signal = VOICE_SIG_DTMFS }, + { .name = "dtmfA", .signal = VOICE_SIG_DTMFA }, + { .name = "dtmfB", .signal = VOICE_SIG_DTMFB }, + { .name = "dtmfC", .signal = VOICE_SIG_DTMFC }, + { .name = "dtmfD", .signal = VOICE_SIG_DTMFD }, + { .name = "keypad", .signal = VOICE_SIG_INGRESS_DTMF }, + { .name = "", .signal = VOICE_SIG_LAST }, }; static int send_dect_event_to_asterisk(int line, struct dect_event_t dectEvnt) { @@ -93,26 +90,31 @@ static int perhaps_simulate_busy(int line, struct voice_ubus_req_t *ubus_req) { if(!lines[line].simulated_busy) return 0; - // Inform the PBX only once per UBUS session or we get a loop. + // Inform Asterisk only once per UBUS session or we get a loop assert(ubus_req && ubus_req->reqIn); if(lines[line].simulated_busy_peer_id == ubus_req->reqIn->peer) { return 1; } lines[line].simulated_busy_peer_id = ubus_req->reqIn->peer; - for(ev = event_map; ev->event != VOICE_EVT_OFFHOOK; ev++); + for(ev = event_map; ev->event != VOICE_EVT_OFFHOOK; ev++) + continue; msg = malloc(sizeof(struct line_event_t)); - msg->name = ev->name; - msg->data = 0; - msg->line = line; - send_event_main(msg, EVENT_MAIN_LINE); + if (msg) { + msg->name = ev->name; + msg->data = 0; + msg->line = line; + send_event_main(msg, EVENT_MAIN_LINE); + } else { + ENDPT_DBG("%s: out of memory\n", __func__); + } return 1; } //---------------------------------------------------------------------------------- // Asterisk wants to make a FXS phone or DECT handset ring probably with a caller ID -static EPSTATUS line_signal_ring(int line, int pcm, EPSIG epsig, const char *data, struct voice_ubus_req_t *ubus_req) { +static EPSTATUS line_signal_ring(int line, int pcm, EPSIG signal, const char *data, struct voice_ubus_req_t *ubus_req) { const unsigned int CLID_MIN_LEN = 14; // Minimum string length to be valid. const unsigned int CLID_TIME_DELIM = 8; // String index where time record ends. const unsigned int CLID_NUMB_REC = CLID_TIME_DELIM + 2; // String index where number starts. @@ -149,20 +151,20 @@ static EPSTATUS line_signal_ring(int line, int pcm, EPSIG epsig, const char *dat } // What type of ring signal? - switch(epsig) { - case EPSIG_CALLID: + switch(signal) { + case VOICE_SIG_CALLID: if(line_req) { line_req->action = start_ring ? ACTION_SIG_RING : ACTION_CONN_CLOSE; } else { - return vrgEndptSignal(&lines[line].epHandle, -1, epsig, (unsigned int)data, -1, -1, -1); + return vrgEndptSignal(&lines[line].epHandle, -1, signal, (unsigned int)data, -1, -1, -1); } break; - case EPSIG_RINGING: - case EPSIG_CALLID_RINGING: + case VOICE_SIG_RINGING: + case VOICE_SIG_CALLID_RINGING: if(line_req) { if(start_ring) { - if(epsig == EPSIG_CALLID_RINGING) { + if(signal == VOICE_SIG_CALLID_RINGING) { // Dect ignore this enable signal free(line_req); return EPSTATUS_SUCCESS; @@ -173,7 +175,7 @@ static EPSTATUS line_signal_ring(int line, int pcm, EPSIG epsig, const char *dat } line_req->caller_id[0] = 0; // Discard enable/disable char or it will become the caller ID } else { - return vrgEndptSignal(&lines[line].epHandle, -1, epsig, start_ring, -1, -1, -1); + return vrgEndptSignal(&lines[line].epHandle, -1, signal, start_ring, -1, -1, -1); } break; @@ -196,16 +198,16 @@ static EPSTATUS line_signal_ring(int line, int pcm, EPSIG epsig, const char *dat //------------------------------------------------------------- // Generate a signal to the phone, such as DTMF tones or ringing int line_signal(int line, const char *signame, const char *data, struct voice_ubus_req_t *ubus_req) { - const struct epsig *sig; + const struct voice_signal_t *sig; EPCMD_PARMS sigArg; EPSTATUS status; int i; ENDPT_DBG("%s: line: %d, signame: %s, data: %s\n", __func__, line, signame, data); - for(sig = epsig_map; sig->epsig != EPSIG_LAST && strcmp(signame, sig->name) != 0; sig++) + for(sig = signal_map; sig->signal != VOICE_SIG_LAST && strcmp(signame, sig->name) != 0; sig++) continue; - if(sig->epsig == EPSIG_LAST) { + if(sig->signal == VOICE_SIG_LAST) { ENDPT_DBG("%s: signal %s is not supported\n", __func__, signame); return -1; } @@ -214,21 +216,21 @@ int line_signal(int line, const char *signame, const char *data, struct voice_ub if(perhaps_simulate_busy(line, ubus_req)) return 0; - switch(sig->epsig) { - case EPSIG_CALLID_RINGING: - case EPSIG_CALLID: - case EPSIG_RINGING: + switch(sig->signal) { + case VOICE_SIG_CALLID_RINGING: + case VOICE_SIG_CALLID: + case VOICE_SIG_RINGING: if(atoi(data) == 0) { status = line_signal_ring(line, lines[line].pcm_state[PCM_0] == - LINE_PCM_STATE_RINGING ? PCM_0 : PCM_1, sig->epsig, data, ubus_req); + LINE_PCM_STATE_RINGING ? PCM_0 : PCM_1, sig->signal, data, ubus_req); lines[line].signaled_call_waiting = 0; } else { status = line_signal_ring(line, lines[line].pcm_state[PCM_0] == - LINE_PCM_STATE_NOT_USED ? PCM_0 : PCM_1, sig->epsig, data, ubus_req); + LINE_PCM_STATE_NOT_USED ? PCM_0 : PCM_1, sig->signal, data, ubus_req); } break; - case EPSIG_INGRESS_DTMF: // Simulate phone keypad button presses + case VOICE_SIG_INGRESS_DTMF: // Simulate phone keypad button presses status = (data ? EPSTATUS_SUCCESS : EPSTATUS_SIGNAL_UNKNOWN); /* Split user arg ASCII phone number string into (max 100) @@ -266,38 +268,38 @@ int line_signal(int line, const char *signame, const char *data, struct voice_ub } break; - case EPSIG_CALLWT: + case VOICE_SIG_CALL_WAITING: if (lines[line].type == VOICE_LINE_DECT) { ENDPT_DBG("lines[%d].signaled_call_waiting: %d\n", line, lines[line].signaled_call_waiting); if((data[0] == '1') && (lines[line].signaled_call_waiting == 0)) { // start call waiting status = line_signal_ring(line, lines[line].pcm_state[PCM_1] == - LINE_PCM_STATE_NOT_USED ? PCM_1 : PCM_0, EPSIG_RINGING, data, ubus_req); + LINE_PCM_STATE_NOT_USED ? PCM_1 : PCM_0, VOICE_SIG_RINGING, data, ubus_req); lines[line].signaled_call_waiting = 1; } else if((data[0] == '0')) { // stop call waiting status = line_signal_ring(line, lines[line].pcm_state[PCM_1] == - LINE_PCM_STATE_RINGING ? PCM_1 : PCM_0, EPSIG_RINGING, data, ubus_req); + LINE_PCM_STATE_RINGING ? PCM_1 : PCM_0, VOICE_SIG_RINGING, data, ubus_req); lines[line].signaled_call_waiting = 0; } else { return 0; } } else { - status = vrgEndptSignal(&lines[line].epHandle, -1, sig->epsig, atoi(data), -1, -1, -1); + status = vrgEndptSignal(&lines[line].epHandle, -1, sig->signal, atoi(data), -1, -1, -1); } break; - case EPSIG_RINGBACK_CUST1: - case EPSIG_BUSY: + case VOICE_SIG_UNOBTAINABLE: + case VOICE_SIG_BUSY: if (lines[line].type == VOICE_LINE_DECT) { send_dect_event_to_asterisk(line, dect_event_map[DECT_EVT_RELEASE]); status = EPSTATUS_SUCCESS; } else { - status = vrgEndptSignal(&lines[line].epHandle, -1, sig->epsig, atoi(data), -1, -1, -1); + status = vrgEndptSignal(&lines[line].epHandle, -1, sig->signal, atoi(data), -1, -1, -1); } break; - case EPSIG_NETBUSY: + case VOICE_SIG_NETBUSY: if (lines[line].type == VOICE_LINE_DECT) { send_dect_event_to_asterisk(line, dect_event_map[DECT_EVT_RELEASE]); } @@ -305,7 +307,7 @@ int line_signal(int line, const char *signame, const char *data, struct voice_ub break; default: - status = vrgEndptSignal(&lines[line].epHandle, -1, sig->epsig, atoi(data), -1, -1, -1); + status = vrgEndptSignal(&lines[line].epHandle, -1, sig->signal, atoi(data), -1, -1, -1); break; }