]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
gsmopen: retry serial initialization if failed, zeroing audio buffers, slower retry...
authorGiovanni Maruzzelli <gmaruzz@gmail.com>
Fri, 26 Nov 2010 12:44:57 +0000 (06:44 -0600)
committerGiovanni Maruzzelli <gmaruzz@gmail.com>
Fri, 26 Nov 2010 12:48:48 +0000 (06:48 -0600)
src/mod/endpoints/mod_gsmopen/gsmopen.h
src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp
src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp

index fd94bccc2ab0dd7cf58d013ec13e4868c50c5bb6..05ef1641bf48b5a8e3d3bbceab946fd561f08bdd 100644 (file)
@@ -158,7 +158,7 @@ typedef enum {
 #define WARNINGA(...)  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,               "rev "GSMOPEN_SVN_VERSION "[%p|%-7lx][WARNINGA  %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
 #define NOTICA(...)  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,          "rev "GSMOPEN_SVN_VERSION "[%p|%-7lx][NOTICA  %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
 
-#define GSMOPEN_P_LOG NULL, (unsigned long)55, __LINE__, tech_pvt ? tech_pvt->name ? tech_pvt->name : "none" : "none", -1, tech_pvt ? tech_pvt->interface_state : -1, tech_pvt ? tech_pvt->phone_callflow : -1
+#define GSMOPEN_P_LOG (void *)NULL, (unsigned long)55, __LINE__, tech_pvt ? tech_pvt->name ? tech_pvt->name : "none" : "none", -1, tech_pvt ? tech_pvt->interface_state : -1, tech_pvt ? tech_pvt->phone_callflow : -1
 
 /*********************************/
 #define GSMOPEN_CAUSE_NORMAL           1
index e4bb6b9200062209f57af6613216aeaf46c3c9fd..76d32ac3f0a0b9b62ea287d6eeb794b22ba7a9b3 100644 (file)
@@ -3294,12 +3294,18 @@ int alsa_write(private_t * tech_pvt, short *data, int datalen)
        time_t now_timestamp;
        /* size_t frames = 0; */
        snd_pcm_state_t state;
-       snd_pcm_sframes_t delayp1;
-       snd_pcm_sframes_t delayp2;
+       snd_pcm_sframes_t delayp1=0;
+       snd_pcm_sframes_t delayp2=0;
 
        if(tech_pvt->no_sound==1){
                return res;
        }
+
+
+       memset(sizbuf, 255, sizeof(sizbuf));
+       memset(sizbuf2, 255, sizeof(sizbuf));
+       memset(silencebuf, 255, sizeof(sizbuf));
+
        //ERRORA("data=%p, datalen=%d\n", GSMOPEN_P_LOG, (void *)data, datalen);
        /* We have to digest the frame in 160-byte portions */
        if (datalen > sizeof(sizbuf) - sizpos) {
@@ -3307,8 +3313,11 @@ int alsa_write(private_t * tech_pvt, short *data, int datalen)
                res = -1;
        } else {
                memcpy(sizbuf + sizpos, data, datalen);
+               memset(data, 255, datalen);
                len += datalen;
                pos = 0;
+
+
 #ifdef ALSA_MONITOR
                alsa_monitor_write(sizbuf, len);
 #endif
@@ -3456,6 +3465,7 @@ int alsa_write(private_t * tech_pvt, short *data, int datalen)
                        if (res == -ESTRPIPE) {
                                ERRORA("You've got some big problems\n", GSMOPEN_P_LOG);
                        } else if (res == -EAGAIN) {
+                               DEBUGA_GSMOPEN("Momentarily busy\n", GSMOPEN_P_LOG);
                                res = 0;
                        } else if (res < 0) {
                                ERRORA("Error %d on audio write: \"%s\"\n", GSMOPEN_P_LOG, res, snd_strerror(res));
@@ -3572,9 +3582,11 @@ int alsa_read(private_t * tech_pvt, short *data, int datalen)
                return r;
 
        } else if (r == -EAGAIN) {
-               DEBUGA_GSMOPEN("ALSA read -EAGAIN, the soundcard is not ready to be read by gsmopen\n", GSMOPEN_P_LOG);
+               int count=0;
                while (r == -EAGAIN) {
-                       gsmopen_sleep(1000);
+                       gsmopen_sleep(10000);
+                       DEBUGA_GSMOPEN("%d ALSA read -EAGAIN, the soundcard is not ready to be read by gsmopen\n", GSMOPEN_P_LOG, count);
+                       count++;
 
                        if (tech_pvt->alsa_capture_is_mono) {
                                r = snd_pcm_readi(tech_pvt->alsac, buf + readpos, left);
index cb440d3bcb98c73f26fb7f898fb142bb31a40a04..7e20b7c25e498a5632b995463af962b27f7cbb30 100644 (file)
@@ -1904,14 +1904,25 @@ static switch_status_t load_config(int reload_type)
                                if (globals.GSMOPEN_INTERFACES[interface_id].controldevprotocol != PROTOCOL_NO_SERIAL) {
                                        res = gsmopen_serial_config(&globals.GSMOPEN_INTERFACES[interface_id]);
                                        if (res) {
-                                               ERRORA("gsmopen_serial_config 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_config failed");
-                                               globals.GSMOPEN_INTERFACES[interface_id].active=0;
-                                               globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0';
-                                               continue;
+                                               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;
+                                               }
                                        }
                                }