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

FreeSWITCH SVN gmaruzz at freeswitch.org
Fri Dec 19 09:32:01 PST 2008


Author: gmaruzz
Date: Fri Dec 19 12:32:01 2008
New Revision: 10885

Log:
sends and receive audio to/from remote skype client at native rate on linux, sound is nice :-)

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	Fri Dec 19 12:32:01 2008
@@ -30,6 +30,7 @@
 switch_endpoint_interface_t *skypiax_endpoint_interface;
 switch_memory_pool_t *skypiax_module_pool = NULL;
 int running = 1;
+switch_core_session_t *global_session = NULL;
 /*************************************************/
 /*************************************************/
 /*************************************************/
@@ -107,7 +108,7 @@
     p->tech_pvt = tech_pvt;
 
   }
-  if (skypiax_codec(tech_pvt, SAMPLERATE, 20) != SWITCH_STATUS_SUCCESS) {
+  if (skypiax_codec(tech_pvt, SAMPLERATE_SKYPIAX, 20) != SWITCH_STATUS_SUCCESS) {
     switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "skypiax_docec FAILED\n");
   } else {
     switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "skypiax_codec SUCCESS\n");
@@ -391,8 +392,10 @@
 #endif
 
   sent = frame->datalen;
-  switch_file_write(p->audioskypepipe[1], (short *) frame->data, &sent);
-  //DEBUGA_SKYPE("CLI PIPE write %d\n", SKYPIAX_P_LOG, sent);
+  //DEBUGA_SKYPE("CLI PIPE to write %d\n", SKYPIAX_P_LOG, sent);
+  switch_file_write(p->audioskypepipe[1], frame->data, &sent);
+  if(sent != frame->datalen)
+	ERRORA("CLI PIPE write %d\n", SKYPIAX_P_LOG, sent);
 
   return SWITCH_STATUS_SUCCESS;
 
@@ -557,7 +560,7 @@
   while (forever) {
     if (!running)
       break;
-    switch_sleep(1000);
+    //switch_sleep(1000); //cicopet
     res = skypiax_skype_read(p);
     //if (res == CALLFLOW_INCOMING_HANGUP && p->interface_state != SKYPIAX_STATE_DOWN) 
     if (res == CALLFLOW_INCOMING_HANGUP) {
@@ -581,6 +584,8 @@
           }
         }
       }
+    p->interface_state = SKYPIAX_STATE_DOWN;
+    global_session = NULL;    //FIXME
     }
   }
 

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	Fri Dec 19 12:32:01 2008
@@ -46,7 +46,7 @@
 #endif //WIN32
 
 #define SAMPLES_PER_FRAME 320
-#define SAMPLERATE 16000
+#define SAMPLERATE_SKYPIAX 16000
 //#define SKYPIAX_SVN_VERSION "SVN 123456"
 #define SKYPIAX_SVN_VERSION SWITCH_VERSION_REVISION
 

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	Fri Dec 19 12:32:01 2008
@@ -12,7 +12,7 @@
 /**********************************************************/
 
 
-switch_core_session_t *global_session = NULL;
+extern switch_core_session_t *global_session;
 
 
 #ifdef WIN32
@@ -48,17 +48,16 @@
   unsigned int len;
   unsigned int i;
   unsigned int a;
-  short srv_in[SAMPLES_PER_FRAME];
   int sin_size;
   unsigned int fd;
 #else
   int len;
   int i;
   int a;
-  short srv_in[SAMPLES_PER_FRAME];
   unsigned int sin_size;
   int fd;
 #endif /* WIN32 */
+  short srv_in[SAMPLES_PER_FRAME];
   struct sockaddr_in my_addr;
   struct sockaddr_in remote_addr;
   int exit = 0;
@@ -117,16 +116,17 @@
       fdselect = fd;
       FD_ZERO(&fs);
       FD_SET(fdselect, &fs);
-      to.tv_usec = 100000;
+      to.tv_usec = 50000;
       to.tv_sec = 0;
+
       rt = select(fdselect + 1, &fs, NULL, NULL, &to);
-	  //rt=1;
+	  //rt=0;
       if (rt > 0) {
 
-	      len = recv(fd, srv_in, sizeof(short) * SAMPLES_PER_FRAME, 0);
-	      //DEBUGA_SKYPE("recv %d\n", SKYPIAX_P_LOG, len);
+	      //len = recv(fd, srv_in, sizeof(short) * SAMPLES_PER_FRAME, 0);
+	      len = recv(fd, srv_in, 320, 0); //seems that Skype only sends 320 bytes at time
 
-	      if(SAMPLERATE == 8000) {
+		  if ((SAMPLERATE_SKYPIAX - 8000) == 0) {
 
 		      /****************************************************************/
 		      if (len > 0) {
@@ -165,29 +165,32 @@
 
 		      } else if (len == 0) {
 			      DEBUGA_SKYPE("Skype client GONE\n", SKYPIAX_P_LOG);
-			      break;
+				  switch_sleep(1000);
 		      } else {
 			      ERRORA("len=%d\n", SKYPIAX_P_LOG, len);
 			      exit = 1;
 			      break;
 		      }
 		      /****************************************************************/
-	      } else if (SAMPLERATE == 16000) {
+	      } else if (SAMPLERATE_SKYPIAX == 16000) {
 
 
 		      /****************************************************************/
 		      if (len > 0) {
 			      if (len == SAMPLES_PER_FRAME * sizeof(short)) {
 				      unsigned int howmany;
-				      DEBUGA_SKYPE("SRV recv %d\n", SKYPIAX_P_LOG, len);
 				      howmany = len;
 
+						WARNINGA("SRV recv %d\n", SKYPIAX_P_LOG, len);
+
 				      switch_file_write(p->audiopipe[1], srv_in, &howmany);
 				      p->audiobuf_is_loaded = 0;
-				      DEBUGA_SKYPE("SRV PIPE WRITE=====> req=%d recv=%d to sent=%d sent=%d\n", SKYPIAX_P_LOG, sizeof(short)*SAMPLES_PER_FRAME, len, len, howmany);
+				      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) {
-				      unsigned int howmany;
-				      DEBUGA_SKYPE("SRV recv %d\n", SKYPIAX_P_LOG, len);
+
+#if 1
+
+
 				      if (!p->audiobuf_is_loaded) {
 					      for (i = 0; i < (len / sizeof(short)); i++) {
 						      p->audiobuf[i] = srv_in[i];
@@ -206,19 +209,25 @@
 
 					      switch_file_write(p->audiopipe[1], totalbuf, &howmany);
 					      p->audiobuf_is_loaded = 0;
-					      DEBUGA_SKYPE("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);
+					      //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);
 				      }
+#endif
+
+
+
+
 			      } else {
 
-			      ERRORA("len=%d\n", SKYPIAX_P_LOG, len);
+			      ERRORA("SRV len=%d\n", SKYPIAX_P_LOG, len);
 
 				}
 
 		      } else if (len == 0) {
 			      DEBUGA_SKYPE("Skype client GONE\n", SKYPIAX_P_LOG);
-			      break;
+				  switch_sleep(1000);
+			      //break;
 		      } else {
-			      ERRORA("len=%d\n", SKYPIAX_P_LOG, len);
+			      ERRORA("SRV len=%d\n", SKYPIAX_P_LOG, len);
 			      exit = 1;
 			      break;
 		      }
@@ -228,9 +237,12 @@
 
 	      } else {
 
-		      ERRORA("SAMPLERATE can only be 8000 or 16000\n", SKYPIAX_P_LOG);
+		      ERRORA("SAMPLERATE_SKYPIAX can only be 8000 or 16000\n", SKYPIAX_P_LOG);
 	      }
-      }
+      } else {
+
+		 ERRORA("SRV rt=%d\n", SKYPIAX_P_LOG, rt);
+	  }
     }
 
     kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
@@ -274,20 +286,18 @@
   struct sockaddr_in my_addr;
   struct sockaddr_in remote_addr;
   unsigned int got;
+  short cli_in[SAMPLES_PER_FRAME];
+  short cli_out[SAMPLES_PER_FRAME * 2];
 #ifdef WIN32
   unsigned int len;
   unsigned int i;
   unsigned int a;
-  short cli_in[SAMPLES_PER_FRAME];
-  short cli_out[SAMPLES_PER_FRAME];
   int sin_size;
   unsigned int fd;
 #else
   int len;
   int i;
   int a;
-  short cli_in[SAMPLES_PER_FRAME];
-  short cli_out[SAMPLES_PER_FRAME];
   unsigned int sin_size;
   int fd;
 #endif /* WIN32 */
@@ -346,17 +356,20 @@
       fdselect = 1;
       FD_ZERO(&fs);
       FD_SET(fdselect, &fs);
-      to.tv_usec = 10000;
+      to.tv_usec = 100000; //100ms
       to.tv_sec = 0;
-      rt = select(fdselect + 1, &fs, NULL, NULL, &to);
-      //rt = 1;
+      //FIXME rt = select(fdselect + 1, &fs, NULL, NULL, &to);
+	  //switch_sleep(1000);//FIXME
+	  memset(cli_in, '\0', sizeof(cli_in));
+      rt = 1;
 	  if (rt > 0) {
 			  /*********************************************/
-		  if (SAMPLERATE == 8000) {
-			  got = (SAMPLES_PER_FRAME / 2) * sizeof(short);
+		  if ((SAMPLERATE_SKYPIAX - 8000) == 0) {
+			  got = SAMPLES_PER_FRAME * sizeof(short);
 			  switch_file_read(p->audioskypepipe[0], cli_in, &got);
 
 			  if (got > 0) {
+				  DEBUGA_SKYPE("CLI PIPE read %d\n", SKYPIAX_P_LOG, got);
 				  a = 0;
 				  for (i = 0; i < got / sizeof(short); i++) {
 					  cli_out[a] = cli_in[i];
@@ -366,6 +379,7 @@
 				  }
 
 				  len = send(fd, cli_out, got * 2, 0);
+				  DEBUGA_SKYPE("CLI PIPE send %d\n", SKYPIAX_P_LOG, len);
 
 				  if (len == 0) {
 					  ERRORA("Skype server GONE\n", SKYPIAX_P_LOG);
@@ -373,21 +387,24 @@
 				  }
 			  } else {
 				  switch_sleep(1000);
-				  //ERRORA("Audio skype pipe give us: %u\n", SKYPIAX_P_LOG, got);
+				  ERRORA("CLI PIPE give us: %u\n", SKYPIAX_P_LOG, got);
+				  //break;
 			  }
 		  }
 		  /*********************************************/
 			  /*********************************************/
-		  else if (SAMPLERATE == 16000) {
+		  else if (SAMPLERATE_SKYPIAX == 16000) {
 			  got = SAMPLES_PER_FRAME * sizeof(short);
 			  switch_file_read(p->audioskypepipe[0], cli_in, &got);
 
 			  if (got > 0) {
-				  //DEBUGA_SKYPE("CLI PIPE read %d\n", SKYPIAX_P_LOG, got);
+				  if(got != SAMPLES_PER_FRAME * sizeof(short) )
+					ERRORA("CLI PIPE read %d\n", SKYPIAX_P_LOG, got);
 
 				  len = send(fd, cli_in, got, 0);
 
-				  //DEBUGA_SKYPE("CLI PIPE send %d\n", SKYPIAX_P_LOG, len);
+				  if(len != got )
+					ERRORA("CLI PIPE send %d\n", SKYPIAX_P_LOG, len);
 
 				  if (len == 0) {
 					  ERRORA("Skype server GONE\n", SKYPIAX_P_LOG);
@@ -431,14 +448,14 @@
 
   rv =
     switch_file_pipe_create(&p->audiopipe[0], &p->audiopipe[1], skypiax_module_pool);
-  rv = switch_file_pipe_timeout_set(p->audiopipe[0], 100000);
+  //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];
 
   rv =
     switch_file_pipe_create(&p->audioskypepipe[0], &p->audioskypepipe[1], skypiax_module_pool);
-  rv = switch_file_pipe_timeout_set(p->audioskypepipe[0], 100000);
+  //rv = switch_file_pipe_timeout_set(p->audioskypepipe[0], 20000);
   if (option_debug > 10) {
     DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);
   }
@@ -465,12 +482,12 @@
 
     if (samples != SAMPLES_PER_FRAME * sizeof(short)) {
       if (samples)
-        DEBUGA_SKYPE("SRV PIPE READ=====> NOT GOOD samples=%d expected=%d\n", SKYPIAX_P_LOG,
+        ERRORA("SRV PIPE READ=====> NOT GOOD samples=%d expected=%d\n", SKYPIAX_P_LOG,
                      samples, SAMPLES_PER_FRAME * sizeof(short));
       //do nothing
     } else {
       tech_pvt->read_frame.datalen = samples;
-      //DEBUGA_SKYPE("read=====> GOOD samples=%d\n", SKYPIAX_P_LOG, samples);
+      //NOTICA("SRV PIPE READ=====> GOOD samples=%d\n", SKYPIAX_P_LOG, samples);
       /* A real frame */
     }
   } else {
@@ -678,7 +695,7 @@
   p = obj;
 
   switch_file_pipe_create(&p->AsteriskHandlesAst.fdesc[0], &p->AsteriskHandlesAst.fdesc[1], skypiax_module_pool);
-  switch_file_pipe_timeout_set(p->AsteriskHandlesAst.fdesc[0], 100000);
+  //switch_file_pipe_timeout_set(p->AsteriskHandlesAst.fdesc[0], 100);
 
   win32_AsteriskHandlesSkype = &p->AsteriskHandlesAst;
 
@@ -862,7 +879,7 @@
 
   switch_file_pipe_create(&p->AsteriskHandlesAst.fdesc[0], &p->AsteriskHandlesAst.fdesc[1], skypiax_module_pool);
 
-  switch_file_pipe_timeout_set(p->AsteriskHandlesAst.fdesc[0], 100000);
+  //switch_file_pipe_timeout_set(p->AsteriskHandlesAst.fdesc[0], 100);
   AsteriskHandlesAst = &p->AsteriskHandlesAst;
   //disp = XOpenDisplay(getenv("DISPLAY"));
   disp = XOpenDisplay(p->X11_display);
@@ -928,7 +945,7 @@
     b = buffer;
 
     while (1) {
-		usleep(1000);
+		//switch_sleep(10000);
       XNextEvent(disp, &an_event);
       if (!running)
         break;
@@ -1201,7 +1218,9 @@
             DEBUGA_SKYPE("Call %s received a DTMF: %s\n", SKYPIAX_P_LOG, id, value);
 
             tech_pvt = p->tech_pvt;
-            session = tech_pvt->session;
+			//if(tech_pvt)
+				session = tech_pvt->session;
+			//if(session)
             channel = switch_core_session_get_channel(session);
 
             if (channel) {
@@ -1288,7 +1307,6 @@
               DEBUGA_SKYPE("We missed skype_call %s\n", SKYPIAX_P_LOG, id);
 
             } else if (!strcasecmp(value, "FINISHED")) {
-              global_session = NULL;    //FIXME
               //p->skype_callflow = CALLFLOW_STATUS_FINISHED;
               if (option_debug)
                 DEBUGA_SKYPE("skype_call %s now is DOWN\n", SKYPIAX_P_LOG, id);



More information about the Freeswitch-svn mailing list