[Freeswitch-svn] [commit] r10977 - freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax

FreeSWITCH SVN gmaruzz at freeswitch.org
Sun Dec 28 03:25:02 PST 2008


Author: gmaruzz
Date: Sun Dec 28 06:25:01 2008
New Revision: 10977

Log:
skypiax: using real pipes on linux

Modified:
   freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c
   freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax.h
   freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c

Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c
==============================================================================
--- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c	(original)
+++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.c	Sun Dec 28 06:25:01 2008
@@ -393,9 +393,16 @@
 
   sent = frame->datalen;
   //DEBUGA_SKYPE("CLI PIPE to write %d\n", SKYPIAX_P_LOG, sent);
+#ifdef WIN32 
   switch_file_write(p->audioskypepipe[1], frame->data, &sent);
-  if(sent != frame->datalen)
+#else /* WIN32 */
+  sent = write(p->audioskypepipe[1], frame->data, sent);
+#endif /* WIN32 */
+  if(sent != frame->datalen){
 	ERRORA("CLI PIPE write %d\n", SKYPIAX_P_LOG, sent);
+  }else{
+	//NOTICA("CLI PIPE write %d\n", SKYPIAX_P_LOG, sent);
+  }
 
   return SWITCH_STATUS_SUCCESS;
 
@@ -958,7 +965,11 @@
   p = &globals.SKYPIAX_INTERFACES[interface_id];
 
 if(globals.SKYPIAX_INTERFACES[interface_id].skypiax_do_controldev_thread_thread){
+#ifdef WIN32
   switch_file_write(p->AsteriskHandlesAst.fdesc[1], "sciutati", &howmany);  // let's the controldev_thread die
+#else /* WIN32 */
+          write(p->AsteriskHandlesAst.fdesc[1], "sciutati", howmany);
+#endif /* WIN32 */
   }
 
 if(globals.SKYPIAX_INTERFACES[interface_id].skypiax_do_skype_thread_thread){

Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax.h
==============================================================================
--- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax.h	(original)
+++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax.h	Sun Dec 28 06:25:01 2008
@@ -137,7 +137,7 @@
   Display *disp;
   Window win;
 int api_connected;
-  switch_file_t *fdesc[2];
+  int fdesc[2];
 };
 #else //WIN32
 
@@ -192,8 +192,13 @@
   int skype_callflow;           /*!< \brief 'callflow' of the skype interface (as opposed to phone interface) */
   int skype;                    /*!< \brief config flag, bool, Skype support on this interface (0 if false, -1 if true) */
   int control_to_send;
+#ifdef WIN32
   switch_file_t *audiopipe[2];
   switch_file_t *audioskypepipe[2];
+#else /* WIN32 */
+  int audiopipe[2];
+  int audioskypepipe[2];
+#endif /* WIN32 */
   switch_thread_t *tcp_srv_thread;
   switch_thread_t *tcp_cli_thread;
   switch_thread_t *skypiax_do_controldev_thread_thread;

Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c
==============================================================================
--- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c	(original)
+++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/skypiax_protocol.c	Sun Dec 28 06:25:01 2008
@@ -1,4 +1,5 @@
 #include "skypiax.h"
+#include <netinet/tcp.h>
 
 extern switch_memory_pool_t *skypiax_module_pool;
 extern int option_debug;
@@ -53,6 +54,8 @@
   int exit = 0;
   unsigned int kill_cli_size;
   short kill_cli_buff[SAMPLES_PER_FRAME];
+  short totalbuf[SAMPLES_PER_FRAME];
+  //int one = 1;
 
   if (option_debug > 10) {
     WARNINGA("ENTERING FUNC\n", SKYPIAX_P_LOG);
@@ -70,6 +73,8 @@
     return NULL;
   }
 
+  //setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
+
   if (bind(s, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) < 0) {
     ERRORA("bind Error\n", SKYPIAX_P_LOG);
     if (option_debug > 10) {
@@ -78,7 +83,6 @@
     return NULL;
   }
   DEBUGA_SKYPE("started tcp_srv_thread thread.\n", SKYPIAX_P_LOG);
-    ERRORA("sizeof(short)=%d, sizeof(char)=%d\n", SKYPIAX_P_LOG, sizeof(short), sizeof(char));
 
   listen(s, 6);
 
@@ -107,7 +111,7 @@
       fdselect = fd;
       FD_ZERO(&fs);
       FD_SET(fdselect, &fs);
-      to.tv_usec = 50000;
+      to.tv_usec = 2000000; //20 msec
       to.tv_sec = 0;
 
       rt = select(fdselect + 1, &fs, NULL, NULL, &to);
@@ -138,7 +142,6 @@
 				      p->audiobuf_is_loaded = 1;
 			      } else {
 				      unsigned int howmany;
-				      short totalbuf[SAMPLES_PER_FRAME];
 
 				      howmany = len / 2 / 2;
 				      for (i = 0; i < howmany; i++)
@@ -152,7 +155,11 @@
 
 				      howmany = len;
 
+#ifdef WIN32 
 				      switch_file_write(p->audiopipe[1], totalbuf, &howmany);
+#else /* WIN32 */
+				      howmany = write(p->audiopipe[1], totalbuf, howmany);
+#endif /* WIN32 */
 				      p->audiobuf_is_loaded = 0;
 				      //DEBUGA_SKYPE("read=====> req=%d recv=%d to sent=%d sent=%d\n", SKYPIAX_P_LOG, sizeof(short)*SAMPLES_PER_FRAME, len, (len*sizeof(short))/2, howmany);
 			      }
@@ -177,7 +184,11 @@
 
 						WARNINGA("SRV recv %d\n", SKYPIAX_P_LOG, len);
 
+#ifdef WIN32 
 				      switch_file_write(p->audiopipe[1], srv_in, &howmany);
+#else /* WIN32 */
+				      howmany = write(p->audiopipe[1], srv_in, howmany);
+#endif /* WIN32 */
 				      p->audiobuf_is_loaded = 0;
 				      WARNINGA("SRV PIPE WRITE=====> req=%d recv=%d to sent=%d sent=%d\n", SKYPIAX_P_LOG, sizeof(short)*SAMPLES_PER_FRAME, len, len, howmany);
 			      }else if (len == SAMPLES_PER_FRAME * sizeof(short) / 2) {
@@ -192,7 +203,7 @@
 					      p->audiobuf_is_loaded = 1;
 				      } else {
 					      unsigned int howmany = SAMPLES_PER_FRAME * sizeof(short);
-					      short totalbuf[SAMPLES_PER_FRAME];
+					      //short totalbuf[SAMPLES_PER_FRAME];
 
 					      for (i = 0; i < (len / sizeof(short)); i++)
 						      totalbuf[i] = p->audiobuf[i];
@@ -201,7 +212,11 @@
 						      i++;
 					      }
 
+#ifdef WIN32 
 					      switch_file_write(p->audiopipe[1], totalbuf, &howmany);
+#else /* WIN32 */
+					      howmany = write(p->audiopipe[1], totalbuf, howmany);
+#endif /* WIN32 */
 					      p->audiobuf_is_loaded = 0;
 					      //NOTICA("SRV PIPE WRITE=====> req=%d recv=%d to sent=%d sent=%d\n", SKYPIAX_P_LOG, SAMPLES_PER_FRAME * sizeof(short), len, SAMPLES_PER_FRAME * sizeof(short), howmany);
 				      }
@@ -235,10 +250,13 @@
 	      }
       } else {
 
-		 ERRORA("SRV rt=%d\n", SKYPIAX_P_LOG, rt);
+		  if(rt)
+			ERRORA("SRV rt=%d\n", SKYPIAX_P_LOG, rt);
+		  switch_sleep(10000);
 	  }
     }
 
+#ifdef WIN32 
     kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
     switch_file_write(p->audiopipe[1], kill_cli_buff, &kill_cli_size);
     kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
@@ -248,6 +266,17 @@
     switch_file_write(p->audiopipe[1], kill_cli_buff, &kill_cli_size);
     kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
     switch_file_write(p->audioskypepipe[1], kill_cli_buff, &kill_cli_size);
+#else /* WIN32 */
+    kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
+    write(p->audiopipe[1], kill_cli_buff, kill_cli_size);
+    kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
+    write(p->audioskypepipe[1], kill_cli_buff, kill_cli_size);
+    p->interface_state = SKYPIAX_STATE_DOWN;
+    kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
+    write(p->audiopipe[1], kill_cli_buff, kill_cli_size);
+    kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
+    write(p->audioskypepipe[1], kill_cli_buff, kill_cli_size);
+#endif /* WIN32 */
 
     DEBUGA_SKYPE("Skype client GONE\n", SKYPIAX_P_LOG);
 
@@ -297,6 +326,7 @@
   short cli_out[SAMPLES_PER_FRAME * 2];
   short cli_in[SAMPLES_PER_FRAME];
 #endif /* WIN32 */
+  //int one = 1;
 
   if (option_debug > 10) {
     WARNINGA("ENTERING FUNC\n", SKYPIAX_P_LOG);
@@ -314,6 +344,8 @@
     return NULL;
   }
 
+  //setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
+
   if (bind(s, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) < 0) {
     ERRORA("bind Error\n", SKYPIAX_P_LOG);
     if (option_debug > 10) {
@@ -349,21 +381,33 @@
 
       if (!running)
         break;
-      fdselect = fd;
+#ifdef WIN32
+      fdselect = fd; //cannot select on audioskypepipe, let's select on socket write
+#else /* WIN32 */
+      fdselect = p->audioskypepipe[0];
+#endif /* WIN32 */
       FD_ZERO(&fs);
       FD_SET(fdselect, &fs);
-      to.tv_usec = 50000; //50msec
+      to.tv_usec = 2000000; //20 msec
       to.tv_sec = 0;
 
-      rt = select(fdselect + 1, NULL, &fs, NULL, &to);
+#ifdef WIN32
+      rt = select(fdselect + 1, NULL, &fs, NULL, &to);//cannot select on audioskypepipe, let's select on socket write
+#else /* WIN32 */
+      rt = select(fdselect + 1, &fs, NULL, NULL, &to);
+#endif /* WIN32 */
 	  //switch_sleep(1000);//FIXME
-	  memset(cli_in, '\0', sizeof(cli_in));
-      //rt = 1;
+	  //memset(cli_in, '\0', sizeof(cli_in));
+      //rt = 0;
 	  if (rt > 0) {
 			  /*********************************************/
 		  if ((SAMPLERATE_SKYPIAX - 8000) == 0) {
 			  got = SAMPLES_PER_FRAME * sizeof(short);
+#ifdef WIN32 
 			  switch_file_read(p->audioskypepipe[0], cli_in, &got);
+#else /* WIN32 */
+			  got = read(p->audioskypepipe[0], cli_in, got);
+#endif /* WIN32 */
 
 			  if (got > 0) {
 				  //DEBUGA_SKYPE("CLI PIPE read %d\n", SKYPIAX_P_LOG, got);
@@ -396,7 +440,11 @@
 			  /*********************************************/
 		  else if (SAMPLERATE_SKYPIAX == 16000) {
 			  got = SAMPLES_PER_FRAME * sizeof(short);
+#ifdef WIN32 
 			  switch_file_read(p->audioskypepipe[0], cli_in, &got);
+#else /* WIN32 */
+			  got = read(p->audioskypepipe[0], cli_in, got);
+#endif /* WIN32 */
 
 			  if (got > 0) {
 				  if(got != SAMPLES_PER_FRAME * sizeof(short) )
@@ -422,7 +470,11 @@
 		  }
 		  /*********************************************/
 
-	  }
+	  } else {
+				  switch_sleep(1000);
+				  if(rt)
+					ERRORA("select give us: %u\n", SKYPIAX_P_LOG, rt);
+			  }
 
     }
     DEBUGA_SKYPE("Skype server GONE\n", SKYPIAX_P_LOG);
@@ -449,17 +501,26 @@
 int skypiax_skypeaudio_init(struct skypiax_interface *p)
 {
 
-  switch_status_t rv;
 
+#ifdef WIN32
+  switch_status_t rv;
   rv =
     switch_file_pipe_create(&p->audiopipe[0], &p->audiopipe[1], skypiax_module_pool);
+  rv =
+    switch_file_pipe_create(&p->audioskypepipe[0], &p->audioskypepipe[1], skypiax_module_pool);
+#else /* WIN32 */
+  pipe(p->audiopipe);
+  fcntl(p->audiopipe[0], F_SETFL, O_NONBLOCK);
+  fcntl(p->audiopipe[1], F_SETFL, O_NONBLOCK);
+  pipe(p->audioskypepipe);
+  fcntl(p->audioskypepipe[0], F_SETFL, O_NONBLOCK);
+  fcntl(p->audioskypepipe[1], F_SETFL, O_NONBLOCK);
+#endif /* WIN32 */
   //rv = switch_file_pipe_timeout_set(p->audiopipe[0], 100);
 
 /* the pipe is our audio fd for pbx to poll on */
-  p->skypiax_sound_capt_fd = p->audiopipe[0];
+  //p->skypiax_sound_capt_fd = p->audiopipe[0];
 
-  rv =
-    switch_file_pipe_create(&p->audioskypepipe[0], &p->audioskypepipe[1], skypiax_module_pool);
   //rv = switch_file_pipe_timeout_set(p->audioskypepipe[0], 20000);
   if (option_debug > 10) {
     DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);
@@ -472,18 +533,40 @@
   struct skypiax_interface *p;
   unsigned int samples;
   int rt;
+#ifndef WIN32
+  int fdselect;
+  fd_set fs;
+  struct timeval to;
+#endif /* WIN32 */
+
 
   p = tech_pvt->p;
 
   //DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG);
 
-
+#ifdef WIN32
   rt = 1;
+#else /* WIN32 */
+
+  fdselect = p->audiopipe[0];
+  FD_ZERO(&fs);
+  FD_SET(fdselect, &fs);
+  to.tv_usec = 2000000; //20 msec
+  to.tv_sec = 0;
+  rt = select(fdselect + 1, &fs, NULL, NULL, &to);
+#endif /* WIN32 */
+
   if (rt > 0) {
 
     samples = SAMPLES_PER_FRAME * sizeof(short);
 
+#ifdef WIN32
     switch_file_read(p->audiopipe[0], tech_pvt->read_frame.data, &samples);
+#else /* WIN32 */
+
+	//samples = read(p->audiopipe[0], buf, SAMPLES_PER_FRAME * sizeof(short));
+    samples = read(p->audiopipe[0], tech_pvt->read_frame.data, samples);
+#endif /* WIN32 */
 
     if (samples != SAMPLES_PER_FRAME * sizeof(short)) {
       if (samples)
@@ -496,7 +579,8 @@
       /* A real frame */
     }
   } else {
-    DEBUGA_SKYPE("select returned %d\n", SKYPIAX_P_LOG, rt);
+	  if(rt)
+		DEBUGA_SKYPE("select returned %d\n", SKYPIAX_P_LOG, rt);
 
   }
 
@@ -943,7 +1027,10 @@
   p = obj;
   DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG);
 
-  switch_file_pipe_create(&p->AsteriskHandlesAst.fdesc[0], &p->AsteriskHandlesAst.fdesc[1], skypiax_module_pool);
+  //switch_file_pipe_create(&p->AsteriskHandlesAst.fdesc[0], &p->AsteriskHandlesAst.fdesc[1], skypiax_module_pool);
+  pipe(p->AsteriskHandlesAst.fdesc);
+  fcntl(p->AsteriskHandlesAst.fdesc[0], F_SETFL, O_NONBLOCK);
+  fcntl(p->AsteriskHandlesAst.fdesc[1], F_SETFL, O_NONBLOCK);
 
   //switch_file_pipe_timeout_set(p->AsteriskHandlesAst.fdesc[0], 100);
   AsteriskHandlesAst = &p->AsteriskHandlesAst;
@@ -1037,7 +1124,8 @@
 
           howmany = strlen(b) + 1;
 
-          switch_file_write(AsteriskHandlesAst->fdesc[1], b, &howmany);
+          //switch_file_write(AsteriskHandlesAst->fdesc[1], b, &howmany);
+          write(AsteriskHandlesAst->fdesc[1], b, howmany);
           //write(AsteriskHandlesAst->fdesc[1], "\0", 1);
           //FIXME DEBUGA_SKYPE("SKYPE pipewrite: |||%s|||len=%d serial=%ld\n\n\n", SKYPIAX_P_LOG, b, strlen(b) + 1, an_event.xclient.serial);
           //switch_sleep(1000);
@@ -1135,13 +1223,15 @@
   char messaggio_2[4096];
   char *buf, obj[512] = "", id[512] = "", prop[512] = "", value[512] = "", *where;
   char **stringp = NULL;
-  //int fd;
   int rt;
-  //fd_set fs;
-  //struct timeval to;
   int a;
   unsigned int howmany;
   unsigned int i;
+#ifndef WIN32
+  int fdselect;
+  fd_set fs;
+  struct timeval to;
+#endif /* WIN32 */
 
   if (option_debug > 100) {
     DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG);
@@ -1151,11 +1241,27 @@
   memset(messaggio, 0, 4096);
   memset(messaggio_2, 0, 4096);
 
+#ifdef WIN32
   rt = 1;
-  //if (rt > 0) {
+#else /* WIN32 */
+
+  fdselect = p->AsteriskHandlesAst.fdesc[0];
+  FD_ZERO(&fs);
+  FD_SET(fdselect, &fs);
+  to.tv_usec = 2000000; //500 msec
+  to.tv_sec = 0;
+  rt = select(fdselect + 1, &fs, NULL, NULL, &to);
+#endif /* WIN32 */
+
+  if (rt > 0) {
   if (p->AsteriskHandlesAst.fdesc[0]) {
     howmany = sizeof(read_from_pipe);
+#ifdef WIN32
     switch_file_read(p->AsteriskHandlesAst.fdesc[0], read_from_pipe, &howmany);
+#else /* WIN32 */
+    howmany =
+      read(p->AsteriskHandlesAst.fdesc[0], read_from_pipe, sizeof(read_from_pipe));
+#endif /* WIN32 */
 
     a = 0;
     for (i = 0; i < howmany; i++) {
@@ -1592,6 +1698,7 @@
     }                           //read_from_pipe
 
   }
+  }
 
   if (option_debug > 100) {
     DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);



More information about the Freeswitch-svn mailing list