Revision
14369
Author
gmaruzz
Date
2009-07-27 04:08:28 -0500 (Mon, 27 Jul 2009)

Log Message

skypiax: let's drain the audiopipe to empty, each time we read from it. This avoid accumulation of unread samples in the pipe buffer (was cause of delays?). Anyway, now latency is lower. Let's check if it breaks on windoz

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c (14368 => 14369)


--- freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c	2009-07-27 02:30:15 UTC (rev 14368)
+++ freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c	2009-07-27 09:08:28 UTC (rev 14369)
@@ -671,6 +671,7 @@
       while ((fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
         DEBUGA_SKYPE("ACCEPTED here you send me %d\n", SKYPIAX_P_LOG,
                      tech_pvt->tcp_cli_port);
+		fcntl(tech_pvt->audioskypepipe[0], F_SETFL, O_NONBLOCK);
         if (!running)
           break;
         while (tech_pvt->interface_state != SKYPIAX_STATE_DOWN
@@ -686,7 +687,7 @@
           if (!running)
             break;
           FD_ZERO(&fs);
-          to.tv_usec = 60000;   //60msec
+          to.tv_usec = 120000;   //120msec
           to.tv_sec = 0;
 #if defined(WIN32) && !defined(__CYGWIN__)
 /* on win32 we cannot select from the apr "pipe", so we select on socket writability */
@@ -703,10 +704,17 @@
 #endif
 
           if (rt > 0) {
+			  int counter;
+
+			  /* until we drained the pipe to empty */
+			for(counter = 0; counter < 10; counter++){
             /* read from the pipe the audio frame we are supposed to send out */
             got =
               skypiax_pipe_read(tech_pvt->audioskypepipe[0], cli_in,
                                 SAMPLES_PER_FRAME * sizeof(short));
+			if(got == -1)
+				break;
+
             if (got != SAMPLES_PER_FRAME * sizeof(short)) {
               WARNINGA("got is %d, but was expected to be %d\n", SKYPIAX_P_LOG, got,
                        (int) (SAMPLES_PER_FRAME * sizeof(short)));
@@ -752,6 +760,7 @@
               WARNINGA("got is %d, but was expected to be %d\n", SKYPIAX_P_LOG, got,
                        (int) (SAMPLES_PER_FRAME * sizeof(short)));
             }
+			}
           } else {
             if (rt)
               ERRORA("CLI rt=%d\n", SKYPIAX_P_LOG, rt);