diff --git a/src/mod/endpoints/mod_gsmopen/Makefile b/src/mod/endpoints/mod_gsmopen/Makefile index 9aff13615a..610dfc13ae 100644 --- a/src/mod/endpoints/mod_gsmopen/Makefile +++ b/src/mod/endpoints/mod_gsmopen/Makefile @@ -1,9 +1,9 @@ MODNAME=mod_gsmopen SVNDEF := -D'GSMOPEN_SVN_VERSION="$(shell svnversion -n .)"' #LOCAL_CFLAGS += $(SVNDEF) -I/usr/src/gsmlib-1.10 -LOCAL_CFLAGS += $(SVNDEF) -I../../../../libs/spandsp/src -I../../../..//libs/tiff-3.8.2/libtiff +LOCAL_CFLAGS += $(SVNDEF) -DNO_GSMLIB -DNO_ALSA -I../../../../libs/spandsp/src -I../../../..//libs/tiff-3.8.2/libtiff #LOCAL_LDFLAGS=-lasound -L/usr/src/gsmlib-1.10/gsmlib/.libs -lgsmme -LOCAL_LDFLAGS=-L../../../../libs/spandsp/src -lasound -lgsmme -lspandsp +LOCAL_LDFLAGS=-L../../../../libs/spandsp/src -lspandsp LOCAL_OBJS=gsmopen_protocol.o #OUR_OBJS += /usr/src/gsmlib-1.10/gsmlib/libgsmme.la include ../../../../build/modmake.rules diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen.h b/src/mod/endpoints/mod_gsmopen/gsmopen.h index 37eb15741c..a335070604 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen.h +++ b/src/mod/endpoints/mod_gsmopen/gsmopen.h @@ -514,6 +514,18 @@ struct private_object { int network_creg_not_supported; char creg[128]; + char controldevice_audio_name[50]; /*!< \brief name of the serial device controlling the interface, possibly none */ + int controldev_audio_fd; /*!< \brief serial controlling file descriptor for this interface */ + //pthread_t controldev_thread; /*!< \brief serial control thread for this interface, running during the call */ +#ifdef WIN32 + int controldevice_audio_speed; +#else + speed_t controldevice_audio_speed; +#endif// WIN32 + int controldev_audio_dead; + switch_mutex_t *controldev_audio_lock; + + }; typedef struct private_object private_t; @@ -663,3 +675,9 @@ int gsmopen_portaudio_shutdown(private_t *tech_pvt); int dump_event(private_t *tech_pvt); int alarm_event(private_t * tech_pvt, int alarm_code, const char *alarm_message); int dump_event_full(private_t * tech_pvt, int is_alarm, int alarm_code, const char *alarm_message); + + +int gsmopen_serial_init_audio_port(private_t * tech_pvt, speed_t controldevice_audio_speed); +int serial_audio_init(private_t * tech_pvt); +int serial_audio_shutdown(private_t * tech_pvt); + diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index 6834a1d880..1f0464fa2f 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -783,9 +783,9 @@ int gsmopen_serial_config_AT(private_t * tech_pvt) } /* signal incoming SMS with a +CMTI unsolicited msg */ - res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=3,1,0,0,0"); + res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0"); if (res) { - DEBUGA_GSMOPEN("AT+CNMI=3,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG); + DEBUGA_GSMOPEN("AT+CNMI=1,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG); tech_pvt->sms_cnmi_not_supported = 1; tech_pvt->gsmopen_serial_sync_period = 30; //FIXME in config } @@ -828,7 +828,7 @@ int gsmopen_serial_config_AT(private_t * tech_pvt) WARNINGA("AT+CSCS=\"UCS2\" (set TE messages to ucs2) do not got OK from the phone, let's try with 'GSM'\n", GSMOPEN_P_LOG); tech_pvt->no_ucs2 = 1; } - +#ifdef NOTDEF if (tech_pvt->no_ucs2) { res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCS=\"GSM\""); if (res) { @@ -878,6 +878,7 @@ int gsmopen_serial_config_AT(private_t * tech_pvt) } else { tech_pvt->at_has_ecam = 1; } +#endif// NOTDEF /* disable unsolicited signaling of call list */ res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CLCC=0"); @@ -1375,6 +1376,42 @@ int gsmopen_serial_read_AT(private_t * tech_pvt, int look_for_ack, int timeout_u } + if ((strncmp(tech_pvt->line_array.result[i], "^CEND:1", 7) == 0)) { + tech_pvt->phone_callflow = CALLFLOW_CALL_IDLE; + if (option_debug > 1) + DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_IDLE\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]); + if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->owner) { + DEBUGA_GSMOPEN("just received a remote HANGUP\n", GSMOPEN_P_LOG); + tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_NORMAL; + gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP); + DEBUGA_GSMOPEN("just sent GSMOPEN_CONTROL_HANGUP\n", GSMOPEN_P_LOG); + } + + tech_pvt->phone_callflow = CALLFLOW_CALL_NOCARRIER; + if (option_debug > 1) + DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_NOCARRIER\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]); + if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN) { + //cicopet + switch_core_session_t *session = NULL; + switch_channel_t *channel = NULL; + + tech_pvt->interface_state = GSMOPEN_STATE_DOWN; + + session = switch_core_session_locate(tech_pvt->session_uuid_str); + if (session) { + channel = switch_core_session_get_channel(session); + //gsmopen_hangup(tech_pvt); + switch_core_session_rwunlock(session); + switch_channel_hangup(channel, SWITCH_CAUSE_NONE); + } + // + //tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_FAILURE; + //gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP); + } else { + ERRORA("Why NO CARRIER now?\n", GSMOPEN_P_LOG); + } + } + /* at_call_* are unsolicited messages sent by the modem to signal us about call processing activity and events */ if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_call_idle) == 0)) { tech_pvt->phone_callflow = CALLFLOW_CALL_IDLE; @@ -2465,6 +2502,7 @@ int gsmopen_serial_answer_AT(private_t * tech_pvt) return -1; } } + res = gsmopen_serial_write_AT_expect(tech_pvt, "AT^DDSETEX=2", tech_pvt->at_dial_expect); //tech_pvt->interface_state = GSMOPEN_STATE_UP; //tech_pvt->phone_callflow = CALLFLOW_CALL_ACTIVE; DEBUGA_GSMOPEN("AT: call answered\n", GSMOPEN_P_LOG); @@ -2500,7 +2538,15 @@ int gsmopen_serial_hangup_AT(private_t * tech_pvt) ERRORA("at_hangup command failed, command used: 'AT+CKPD=\"EEE\"'\n", GSMOPEN_P_LOG); return -1; } + } + + res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CHUP"); + if (res) { + ERRORA("at_hangup command failed, command used: 'AT+CHUP'\n", GSMOPEN_P_LOG); + //return -1; + } + } tech_pvt->interface_state = GSMOPEN_STATE_DOWN; tech_pvt->phone_callflow = CALLFLOW_CALL_IDLE; @@ -2552,6 +2598,7 @@ int gsmopen_serial_call_AT(private_t * tech_pvt, char *dstr) ERRORA("dial command failed, dial string was: %s\n", GSMOPEN_P_LOG, at_command); return -1; } + res = gsmopen_serial_write_AT_expect(tech_pvt, "AT^DDSETEX=2", tech_pvt->at_dial_expect); // jet - early audio //if (tech_pvt->at_early_audio) { //ast_queue_control(tech_pvt->owner, AST_CONTROL_ANSWER); @@ -4002,3 +4049,122 @@ int gsmopen_serial_getstatus_AT(private_t * tech_pvt) POPPA_UNLOCKA(p->controldev_lock); return 0; } + + +int gsmopen_serial_init_audio_port(private_t * tech_pvt, speed_t controldevice_audio_speed) +{ + int fd; + int rt; + struct termios tp; + unsigned int status = 0; + unsigned int flags = TIOCM_DTR; + +/* if there is a file descriptor, close it. But it is probably just an old value, so don't check for close success*/ + fd = tech_pvt->controldev_audio_fd; + if (fd) { + close(fd); + } +/* open the serial port */ +//#ifdef __CYGWIN__ + fd = open(tech_pvt->controldevice_audio_name, O_RDWR | O_NOCTTY | O_NONBLOCK); + sleep(1); + close(fd); +//#endif /* __CYGWIN__ */ + fd = open(tech_pvt->controldevice_audio_name, O_RDWR | O_NOCTTY | O_NONBLOCK); + if (fd == -1) { + perror("AUDIO open error "); + DEBUGA_GSMOPEN("AUDIO serial error: %s\n", GSMOPEN_P_LOG, strerror(errno)); + tech_pvt->controldev_audio_fd = fd; + return -1; + } +/* flush it */ + rt = tcflush(fd, TCIFLUSH); + if (rt == -1) { + ERRORA("AUDIO serial error: %s", GSMOPEN_P_LOG, strerror(errno)); + } +/* attributes */ + tp.c_cflag = B0 | CS8 | CLOCAL | CREAD | HUPCL; + tp.c_iflag = IGNPAR; + tp.c_cflag &= ~CRTSCTS; + tp.c_oflag = 0; + tp.c_lflag = 0; + tp.c_cc[VMIN] = 1; + tp.c_cc[VTIME] = 0; +/* set controldevice_audio_speed */ + rt = cfsetispeed(&tp, tech_pvt->controldevice_audio_speed); + if (rt == -1) { + ERRORA("AUDIO serial error: %s, speed was: %d", GSMOPEN_P_LOG, strerror(errno), tech_pvt->controldevice_audio_speed); + } + rt = cfsetospeed(&tp, tech_pvt->controldevice_audio_speed); + if (rt == -1) { + ERRORA("AUDIO serial error: %s", GSMOPEN_P_LOG, strerror(errno)); + } +/* set port attributes */ + if (tcsetattr(fd, TCSADRAIN, &tp) == -1) { + ERRORA("AUDIO serial error: %s", GSMOPEN_P_LOG, strerror(errno)); + } + rt = tcsetattr(fd, TCSANOW, &tp); + if (rt == -1) { + ERRORA("AUDIO serial error: %s", GSMOPEN_P_LOG, strerror(errno)); + } +#ifndef __CYGWIN__ + ioctl(fd, TIOCMGET, &status); + status |= TIOCM_DTR; /* Set DTR high */ + status &= ~TIOCM_RTS; /* Set RTS low */ + ioctl(fd, TIOCMSET, &status); + ioctl(fd, TIOCMGET, &status); + ioctl(fd, TIOCMBIS, &flags); + flags = TIOCM_RTS; + ioctl(fd, TIOCMBIC, &flags); + ioctl(fd, TIOCMGET, &status); +#else /* __CYGWIN__ */ + ioctl(fd, TIOCMGET, &status); + status |= TIOCM_DTR; /* Set DTR high */ + status &= ~TIOCM_RTS; /* Set RTS low */ + ioctl(fd, TIOCMSET, &status); +#endif /* __CYGWIN__ */ + tech_pvt->controldev_audio_fd = fd; + + return (fd); +} +int serial_audio_init(private_t * tech_pvt) +{ + int res; + int err; + + res=gsmopen_serial_init_audio_port(tech_pvt, tech_pvt->controldevice_audio_speed); + ERRORA("serial_audio_init res=%d\n", GSMOPEN_P_LOG, res); + + if(res > 0) + err=0; + else + err=1; + + + res = gsmopen_serial_write_AT_ack(tech_pvt, "AT^DDSETEX=2"); + if (res) { + ERRORA("at_hangup command failed, command used: 'AT^DDSETEX=2'\n", GSMOPEN_P_LOG); + //return -1; + } + + return err; +} +int serial_audio_shutdown(private_t * tech_pvt) +{ + + int res; + int err; + + res = close(tech_pvt->controldev_audio_fd); + ERRORA("serial_audio_shutdown res=%d (controldev_audio_fd is %d)\n", GSMOPEN_P_LOG, res, tech_pvt->controldev_audio_fd); + tech_pvt->controldev_audio_fd = -1; + + err = res; + + return err; +} + + + + + diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp index 7db2452a95..6b8c6d5aaf 100644 --- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp +++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp @@ -1,3 +1,12 @@ +#ifdef GSMOPEN_ALSA +int alsa_init(private_t * tech_pvt); +int alsa_shutdown(private_t * tech_pvt); +snd_pcm_t *alsa_open_dev(private_t * tech_pvt, snd_pcm_stream_t stream); +int alsa_write(private_t * tech_pvt, short *data, int datalen); +int alsa_read(private_t * tech_pvt, short *data, int datalen); + +#endif /* GSMOPEN_ALSA */ + /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * Copyright (C) 2005/2011, Anthony Minessale II @@ -296,6 +305,13 @@ switch_status_t gsmopen_tech_init(private_t * tech_pvt, switch_core_session_t *s } } #endif// GSMOPEN_PORTAUDIO + if(tech_pvt->no_sound==0){ + if (serial_audio_init(tech_pvt)) { + ERRORA("serial_audio_init failed\n", GSMOPEN_P_LOG); + return SWITCH_STATUS_FALSE; + + } + } if (switch_core_timer_init(&tech_pvt->timer_read, "soft", 20, tech_pvt->read_codec.implementation->samples_per_packet, gsmopen_module_pool) != SWITCH_STATUS_SUCCESS) { @@ -634,6 +650,9 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session) } } #endif// GSMOPEN_PORTAUDIO + if(tech_pvt->no_sound==0){ + serial_audio_shutdown(tech_pvt); + } *tech_pvt->session_uuid_str = '\0'; @@ -820,6 +839,10 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch int i; #endif// GSMOPEN_ALSA #endif// WANT_SPEEX + int samples; + int samples2; + char digit_str[256]; + short buffer2[640]; channel = switch_core_session_get_channel(session); @@ -845,11 +868,13 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch #ifndef GSMOPEN_PORTAUDIO switch_core_timer_next(&tech_pvt->timer_read); #endif// GSMOPEN_PORTAUDIO + //usleep(20000); + //goto cng; if(tech_pvt->no_sound==1){ goto cng; } -#if defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) +//#if defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) #ifdef GSMOPEN_ALSA //if ((samples = snd_pcm_readi(tech_pvt->alsac, tech_pvt->read_frame.data, tech_pvt->read_codec.implementation->samples_per_packet)) > 0) if ((samples = alsa_read(tech_pvt, (short *) tech_pvt->read_frame.data, tech_pvt->read_codec.implementation->samples_per_packet)) > 0) @@ -857,6 +882,9 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch #ifdef GSMOPEN_PORTAUDIO if ((samples = gsmopen_portaudio_read(tech_pvt, (short *) tech_pvt->read_frame.data, tech_pvt->read_codec.implementation->samples_per_packet)) > 0) #endif// GSMOPEN_PORTAUDIO + + //sent = write(tech_pvt->controldev_audio_fd, (short *) frame->data, (int) (frame->datalen)); + if ((samples = read(tech_pvt->controldev_audio_fd, (short *) tech_pvt->read_frame.data, 320)) >0) { #ifdef GSMOPEN_PORTAUDIO @@ -886,8 +914,9 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch - tech_pvt->read_frame.datalen = samples * 2; - tech_pvt->read_frame.samples = samples; + //tech_pvt->read_frame.datalen = samples * 2; + tech_pvt->read_frame.datalen = samples; + tech_pvt->read_frame.samples = samples/2; #ifndef GSMOPEN_PORTAUDIO tech_pvt->read_frame.timestamp = tech_pvt->timer_read.samplecount; @@ -895,13 +924,17 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch *frame = &tech_pvt->read_frame; + if ((samples2 = read(tech_pvt->controldev_audio_fd, (short *) buffer2, 320)) >0){ + WARNINGA("samples2=%d\n", GSMOPEN_P_LOG, samples2); + +} //status = SWITCH_STATUS_SUCCESS; switch_set_flag(tech_pvt, TFLAG_VOICE); } //WARNINGA("samples=%d\n", GSMOPEN_P_LOG, samples); - if (samples != 160) { - ERRORA("samples=%d\n", GSMOPEN_P_LOG, samples); + if (samples != 320) { + //DEBUGA_GSMOPEN("samples=%d\n", GSMOPEN_P_LOG, samples); goto cng; } //DEBUGA_GSMOPEN("samples=%d tech_pvt->read_frame.timestamp=%d\n", GSMOPEN_P_LOG, samples, tech_pvt->read_frame.timestamp); @@ -911,7 +944,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch - +//#ifdef NOTDEF memset(digit_str, 0, sizeof(digit_str)); //teletone_dtmf_detect(&tech_pvt->dtmf_detect, (int16_t *) tech_pvt->read_frame.data, tech_pvt->read_frame.samples); @@ -939,6 +972,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch tech_pvt->old_dtmf_timestamp = new_dtmf_timestamp; } } +//#endif //NOTDEF while (switch_test_flag(tech_pvt, TFLAG_IO)) { if (switch_test_flag(tech_pvt, TFLAG_BREAK)) { switch_clear_flag(tech_pvt, TFLAG_BREAK); @@ -975,7 +1009,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch DEBUGA_GSMOPEN("CHANNEL READ FALSE\n", GSMOPEN_P_LOG); return SWITCH_STATUS_FALSE; -#endif // defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) +//#endif // defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) cng: data = (switch_byte_t *) tech_pvt->read_frame.data; data[0] = 65; @@ -1002,6 +1036,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc spx_int16_t *speexptr; #endif// GSMOPEN_ALSA #endif// WANT_SPEEX + unsigned int sent; channel = switch_core_session_get_channel(session); switch_assert(channel != NULL); @@ -1058,6 +1093,15 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc } #endif //WANT_SPEEX #endif // GSMOPEN_PORTAUDIO + + sent = write(tech_pvt->controldev_audio_fd, (short *) frame->data, (int) (frame->datalen)); +//DEBUGA_GSMOPEN("sent=%d \n", GSMOPEN_P_LOG, sent); + + if (sent && sent != frame->datalen && sent != -1) { + DEBUGA_GSMOPEN("sent %d\n", GSMOPEN_P_LOG, sent); + } + + //NOTICA("sent=%d\n", GSMOPEN_P_LOG, sent); return SWITCH_STATUS_SUCCESS; } @@ -1392,6 +1436,7 @@ static switch_status_t load_config(int reload_type) const char *dialplan = "XML"; const char *destination = "5000"; const char *controldevice_name = "/dev/ttyACM0"; + const char *controldevice_audio_name = "/dev/ttyUSB2"; char *digit_timeout = NULL; char *max_digits = NULL; char *hotline = NULL; @@ -1427,17 +1472,17 @@ static switch_status_t load_config(int reload_type) const char *at_postinit_3_expect = "OK"; const char *at_postinit_4 = "at+sidet=0"; const char *at_postinit_4_expect = "OK"; - const char *at_postinit_5 = "at+clvl=99"; + const char *at_postinit_5 = "at+clvl=3"; const char *at_postinit_5_expect = "OK"; const char *at_query_battchg = "AT+CBC"; const char *at_query_battchg_expect = "OK"; const char *at_query_signal = "AT+CSQ"; const char *at_query_signal_expect = "OK"; const char *at_call_idle = "+MCST: 1"; - const char *at_call_incoming = "+MCST: 2"; - const char *at_call_active = "+CSSI: 7"; + const char *at_call_incoming = "RING"; + const char *at_call_active = "^CONN:1,0"; const char *at_call_failed = "+MCST: 65"; - const char *at_call_calling = "+CSSI: 1"; + const char *at_call_calling = "^ORIG:1,0"; const char *at_indicator_noservice_string = "CIEV: 2;0"; const char *at_indicator_nosignal_string = "CIEV: 5;0"; const char *at_indicator_lowsignal_string = "CIEV: 5;1"; @@ -1467,7 +1512,7 @@ static switch_status_t load_config(int reload_type) #if defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) const char *no_sound = "0"; #else - const char *no_sound = "1"; + const char *no_sound = "0"; #endif // defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) const char *portaudiocindex = "1"; const char *portaudiopindex = "1"; @@ -1479,6 +1524,7 @@ static switch_status_t load_config(int reload_type) int controldevice_speed = 115200; //FIXME TODO #else uint32_t controldevice_speed = B115200; //FIXME TODO + uint32_t controldevice_audio_speed = B115200; //FIXME TODO #endif //WIN32 uint32_t controldevprotocol = PROTOCOL_AT; //FIXME TODO uint32_t running = 1; //FIXME TODO @@ -1504,6 +1550,8 @@ static switch_status_t load_config(int reload_type) destination = val; } else if (!strcasecmp(var, "controldevice_name")) { controldevice_name = val; + } else if (!strcasecmp(var, "controldevice_audio_name")) { + controldevice_audio_name = val; } else if (!strcasecmp(var, "digit_timeout")) { digit_timeout = val; } else if (!strcasecmp(var, "max_digits")) { @@ -1756,6 +1804,7 @@ static switch_status_t load_config(int reload_type) tech_pvt = &globals.GSMOPEN_INTERFACES[interface_id]; switch_mutex_init(&globals.GSMOPEN_INTERFACES[interface_id].controldev_lock, SWITCH_MUTEX_NESTED, gsmopen_module_pool); + switch_mutex_init(&globals.GSMOPEN_INTERFACES[interface_id].controldev_audio_lock, SWITCH_MUTEX_NESTED, gsmopen_module_pool); switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].id, id); @@ -1764,6 +1813,7 @@ static switch_status_t load_config(int reload_type) switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].dialplan, dialplan); switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].destination, destination); switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].controldevice_name, controldevice_name); + switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].controldevice_audio_name, controldevice_audio_name); switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].dial_regex, dial_regex); switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].hold_music, hold_music); switch_set_string(globals.GSMOPEN_INTERFACES[interface_id].fail_dial_regex, fail_dial_regex); @@ -1845,7 +1895,7 @@ static switch_status_t load_config(int reload_type) #if defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) globals.GSMOPEN_INTERFACES[interface_id].no_sound = atoi(no_sound); #else - globals.GSMOPEN_INTERFACES[interface_id].no_sound = 1; + globals.GSMOPEN_INTERFACES[interface_id].no_sound = 0; #endif // defined(GSMOPEN_ALSA) || defined(GSMOPEN_PORTAUDIO) globals.GSMOPEN_INTERFACES[interface_id].gsmopen_serial_sync_period = atoi(gsmopen_serial_sync_period); @@ -1865,6 +1915,7 @@ static switch_status_t load_config(int reload_type) DEBUGA_GSMOPEN("dialplan=%s\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[interface_id].dialplan); DEBUGA_GSMOPEN("destination=%s\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[interface_id].destination); DEBUGA_GSMOPEN("controldevice_name=%s\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[interface_id].controldevice_name); + DEBUGA_GSMOPEN("controldevice_audio_name=%s\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[interface_id].controldevice_audio_name); #ifdef GSMOPEN_ALSA DEBUGA_GSMOPEN("alsacname=%s\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[interface_id].alsacname); DEBUGA_GSMOPEN("alsapname=%s\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[interface_id].alsapname); @@ -1883,6 +1934,10 @@ static switch_status_t load_config(int reload_type) DEBUGA_GSMOPEN("speexpreprocess=%d\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[interface_id].speexpreprocess); #endif// GSMOPEN_PORTAUDIO DEBUGA_GSMOPEN("gsmopen_serial_sync_period=%d\n", GSMOPEN_P_LOG, (int)globals.GSMOPEN_INTERFACES[interface_id].gsmopen_serial_sync_period); + + + + /* init the serial port */ if (globals.GSMOPEN_INTERFACES[interface_id].controldevprotocol != PROTOCOL_NO_SERIAL) { globals.GSMOPEN_INTERFACES[interface_id].controldevfd = @@ -1976,6 +2031,76 @@ static switch_status_t load_config(int reload_type) } #endif// GSMOPEN_PORTAUDIO + if (serial_audio_init(&globals.GSMOPEN_INTERFACES[interface_id])) { + ERRORA("serial_audio_init failed\n", GSMOPEN_P_LOG); + ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id); + //return SWITCH_STATUS_FALSE; + globals.GSMOPEN_INTERFACES[interface_id].running=0; + alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "serial_audio_init failed"); + globals.GSMOPEN_INTERFACES[interface_id].active=0; + globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0'; + continue; + + } + + if (serial_audio_shutdown(&globals.GSMOPEN_INTERFACES[interface_id])) { + ERRORA("serial_audio_shutdown failed\n", GSMOPEN_P_LOG); + ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id); + //return SWITCH_STATUS_FALSE; + globals.GSMOPEN_INTERFACES[interface_id].running=0; + alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "serial_audio_shutdown failed"); + globals.GSMOPEN_INTERFACES[interface_id].active=0; + globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0'; + continue; + + } + +#ifdef NOTDEF + /* init the serial port */ + if (globals.GSMOPEN_INTERFACES[interface_id].controldevprotocol != PROTOCOL_NO_SERIAL) { + globals.GSMOPEN_INTERFACES[interface_id].controldevfd = + gsmopen_serial_init(&globals.GSMOPEN_INTERFACES[interface_id], globals.GSMOPEN_INTERFACES[interface_id].controldevice_speed); + if (globals.GSMOPEN_INTERFACES[interface_id].controldevfd == -1) { + ERRORA("gsmopen_serial_init failed\n", GSMOPEN_P_LOG); + ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id); + //return SWITCH_STATUS_FALSE; + globals.GSMOPEN_INTERFACES[interface_id].running=0; + alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_serial_init failed"); + globals.GSMOPEN_INTERFACES[interface_id].active=0; + globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0'; + continue; + } + } + + /* config the phone/modem on the serial port */ + if (globals.GSMOPEN_INTERFACES[interface_id].controldevprotocol != PROTOCOL_NO_SERIAL) { + res = gsmopen_serial_config(&globals.GSMOPEN_INTERFACES[interface_id]); + if (res) { + int count = 0; + ERRORA("gsmopen_serial_config failed, let's try again\n", GSMOPEN_P_LOG); + while(res && count < 5){ + switch_sleep(100000); //0.1 seconds + res = gsmopen_serial_config(&globals.GSMOPEN_INTERFACES[interface_id]); + count++; + if (res) { + ERRORA("%d: gsmopen_serial_config failed, let's try again\n", GSMOPEN_P_LOG, count); + } + } + if (res) { + ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id); + //return SWITCH_STATUS_FALSE; + globals.GSMOPEN_INTERFACES[interface_id].running=0; + alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_serial_config failed"); + globals.GSMOPEN_INTERFACES[interface_id].active=0; + globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0'; + continue; + } + } + } +#endif// NOTDEF + + + } globals.GSMOPEN_INTERFACES[interface_id].active=1; @@ -2027,6 +2152,7 @@ static switch_status_t load_config(int reload_type) DEBUGA_GSMOPEN("speexpreprocess=%d\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[i].speexpreprocess); #endif// GSMOPEN_PORTAUDIO DEBUGA_GSMOPEN("gsmopen_serial_sync_period=%d\n", GSMOPEN_P_LOG, (int)globals.GSMOPEN_INTERFACES[i].gsmopen_serial_sync_period); + DEBUGA_GSMOPEN("controldevice_audio_name=%s\n", GSMOPEN_P_LOG, globals.GSMOPEN_INTERFACES[i].controldevice_audio_name); } }