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

FreeSWITCH SVN gmaruzz at freeswitch.org
Fri Nov 21 07:44:47 PST 2008


Author: gmaruzz
Date: Fri Nov 21 10:44:46 2008
New Revision: 10491

Log:
skypiax: now it can be used for multiple consecutive calls, incoming and outbound. Time to begin a general rewriting.

Modified:
   freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax/mod_skypiax.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 Nov 21 10:44:46 2008
@@ -194,8 +194,8 @@
 	int control_to_send;
 	int audiopipe[2];
 	int audioskypepipe[2];
-	pthread_t tcp_srv_thread;
-	pthread_t tcp_cli_thread;
+	switch_thread_t *tcp_srv_thread;
+	switch_thread_t *tcp_cli_thread;
 	short audiobuf[160];
 	int audiobuf_is_loaded;
 
@@ -436,7 +436,28 @@
   sin_size = sizeof(remote_addr);
   while ((fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
     DEBUGA_SKYPE("ACCEPTED\n", SKYPIAX_P_LOG);
-    while (1) {
+    while (p->interface_state != SKYPIAX_STATE_DOWN && (p->skype_callflow == CALLFLOW_STATUS_INPROGRESS ||p->skype_callflow == SKYPIAX_STATE_UP)) {
+
+  int fdselect;
+  int rt;
+  fd_set fs;
+  struct timeval to;
+
+		exit=1;
+
+
+
+
+
+
+  fdselect = fd;
+  FD_ZERO(&fs);
+  FD_SET(fdselect, &fs);
+  to.tv_usec = 100;
+  to.tv_sec = 0;
+  rt = select(fdselect + 1, &fs, NULL, NULL, &to);
+  if (rt > 0) {
+
       len = recv(fd, in, sizeof(short) * GG, 0);
     //DEBUGA_SKYPE("recv %d\n", SKYPIAX_P_LOG, len);
       if (len > 0) {
@@ -467,6 +488,7 @@
         exit = 1;
         break;
       }
+  }
     }
     DEBUGA_SKYPE("Skype client GONE\n", SKYPIAX_P_LOG);
     close(fd);
@@ -494,6 +516,7 @@
   int a;
   int i;
   int got;
+  int exit=0;
 
   if (option_debug > 10) {
     DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG);
@@ -517,6 +540,7 @@
     if (option_debug > 10) {
       DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);
     }
+  close(s);
     return NULL;
   }
   DEBUGA_SKYPE("started tcp_cli_thread thread.\n", SKYPIAX_P_LOG);
@@ -527,7 +551,27 @@
   while ((fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
     ERRORA("ACCEPTED\n", SKYPIAX_P_LOG);
     //while (1 && p->owner && p->owner->_state == SKYPIAX_STATE_UP)  FIXME FIXME FIXME
-    while (1) {
+    while (p->interface_state != SKYPIAX_STATE_DOWN && (p->skype_callflow == CALLFLOW_STATUS_INPROGRESS ||p->skype_callflow == SKYPIAX_STATE_UP)) {
+  int fdselect;
+  int rt;
+  fd_set fs;
+  struct timeval to;
+
+		exit=1;
+
+
+
+
+
+
+  fdselect = p->audioskypepipe[0];
+  FD_ZERO(&fs);
+  FD_SET(fdselect, &fs);
+  to.tv_usec = 100;
+  to.tv_sec = 0;
+  rt = select(fdselect + 1, &fs, NULL, NULL, &to);
+  if (rt > 0) {
+
 
       got = read(p->audioskypepipe[0], in, (NN / 2) * sizeof(short));
     //ERRORA("got %d\n", SKYPIAX_P_LOG, got);
@@ -550,10 +594,13 @@
       } else {
         usleep(1000);
       }
+  }
 
     }
     DEBUGA_SKYPE("Skype server GONE\n", SKYPIAX_P_LOG);
     close(fd);
+    if (exit)
+      break;
   }
 
   DEBUGA_SKYPE("client (I am it) GONE\n", SKYPIAX_P_LOG);
@@ -614,6 +661,10 @@
 	struct skypiax_interface *p;
   short buf[640];
   int samples;
+  int fd;
+  int rt;
+  fd_set fs;
+  struct timeval to;
 
 	p = tech_pvt->p;
 
@@ -622,6 +673,14 @@
 
   memset(buf, '\0', sizeof(buf));
 
+  fd = p->audiopipe[0];
+  FD_ZERO(&fs);
+  FD_SET(fd, &fs);
+  to.tv_usec = 100000;
+  to.tv_sec = 0;
+  rt = select(fd + 1, &fs, NULL, NULL, &to);
+  if (rt > 0) {
+
 
   //if ((samples = read(p->audiopipe[0], buf, SAMPLES_PER_FRAME * sizeof(short))) != 320) 
   if ((samples = read(p->audiopipe[0], tech_pvt->read_frame.data, SAMPLES_PER_FRAME * sizeof(short))) != 320) {
@@ -634,6 +693,11 @@
     //DEBUGA_SKYPE("read=====> GOOD samples=%d\n", SKYPIAX_P_LOG, samples);
     /* A real frame */
   }
+  } else {
+    DEBUGA_SKYPE("select returned %d\n", SKYPIAX_P_LOG, rt);
+
+
+  }
 
     //DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);
 
@@ -794,12 +858,16 @@
 
 	switch (sig) {
 	case SWITCH_SIG_KILL:
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s CHANNEL got SWITCH_SIG_KILL\n", switch_channel_get_name(channel));
 		switch_clear_flag_locked(tech_pvt, TFLAG_IO);
 		switch_clear_flag_locked(tech_pvt, TFLAG_VOICE);
-		switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+		switch_set_flag_locked(tech_pvt, TFLAG_HANGUP);
+		//switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+	//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "CHANNEL after TFLAG_HUP\n");
 		//switch_thread_cond_signal(tech_pvt->cond);
 		break;
 	case SWITCH_SIG_BREAK:
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s CHANNEL got SWITCH_SIG_BREAK\n", switch_channel_get_name(channel));
 		switch_set_flag_locked(tech_pvt, TFLAG_BREAK);
 		break;
 	default:
@@ -852,7 +920,8 @@
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "skypiax_skypeaudio_read ERROR\n");
 
 } else {
-			//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "skypiax_skypeaudio_read SUCCESS\n");
+			switch_set_flag_locked(tech_pvt, TFLAG_VOICE);
+			//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "skypiax_skypeaudio_read SUCCESS\n");
 
 }
 
@@ -888,8 +957,8 @@
   }
 #endif
 
+				//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "============>\n");
 
-			switch_set_flag_locked(tech_pvt, TFLAG_VOICE); //FIXME
 
 		if (switch_test_flag(tech_pvt, TFLAG_IO) && switch_test_flag(tech_pvt, TFLAG_VOICE)) {
 			switch_clear_flag_locked(tech_pvt, TFLAG_VOICE);
@@ -904,9 +973,11 @@
 			}
 #endif
 			return SWITCH_STATUS_SUCCESS;
-		}
+		} 
+
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CHANNEL READ no TFLAG_IO\n");
+	return SWITCH_STATUS_FALSE;
 
-		switch_yield(1000);
 	}
 
 
@@ -1831,52 +1902,50 @@
 
 
 
+#if 0
 				  if (!p->tcp_srv_thread) {
 					  if(1)
 					  {
-						  switch_thread_t *thread;
+#endif
+						  //switch_thread_t *thread;
+						  if(1){
 						  switch_threadattr_t *thd_attr = NULL;
 
 						  switch_threadattr_create(&thd_attr, module_pool);
 						  switch_threadattr_detach_set(thd_attr, 1);
 						  switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
-						  switch_thread_create(&thread, thd_attr, skypiax_do_tcp_srv_thread, p, module_pool);
+						  switch_thread_create(&p->tcp_srv_thread, thd_attr, skypiax_do_tcp_srv_thread, p, module_pool);
 						  DEBUGA_SKYPE("started tcp_srv_thread thread.\n", SKYPIAX_P_LOG);
+#if 0
 					  }
 				  }
+#endif
 
 
 
 
 
 
+#if 0
 				  if (!p->tcp_cli_thread) {
 					  if(1)
 					  {
-						  switch_thread_t *thread;
-						  switch_threadattr_t *thd_attr = NULL;
+#endif
+						  //switch_thread_t *thread;
+						  //switch_threadattr_t *thd_attr = NULL;
 
 						  switch_threadattr_create(&thd_attr, module_pool);
 						  switch_threadattr_detach_set(thd_attr, 1);
 						  switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
-						  switch_thread_create(&thread, thd_attr, skypiax_do_tcp_cli_thread, p, module_pool);
+						  switch_thread_create(&p->tcp_cli_thread, thd_attr, skypiax_do_tcp_cli_thread, p, module_pool);
 						  DEBUGA_SKYPE("started tcp_cli_thread thread.\n", SKYPIAX_P_LOG);
 					  }
+#if 0
+					  }
 
 
-#ifdef NOTDEF
-					  if (ast_pthread_create
-							  (&p->tcp_cli_thread, NULL, skypiax_do_tcp_cli_thread, p) < 0) {
-						  ERRORA("Unable to start tcp_cli_thread thread.\n", SKYPIAX_P_LOG);
-						  if (option_debug > 100) {
-							  DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);
-						  }
-						  return -1;
-					  } else {
-						  DEBUGA_SKYPE("started tcp_cli_thread thread.\n", SKYPIAX_P_LOG);
-					  }
-#endif //NOTDEF
 				  }
+#endif
 
 				  usleep(100000);
 				  sprintf(msg_to_skype, "ALTER CALL %s SET_OUTPUT PORT=\"5556\"", id);
@@ -2134,14 +2203,30 @@
   while (1) {
     usleep(1000);
     res = skypiax_skype_read(p);
-#if 0
+#if 1
+      //if (res == CALLFLOW_INCOMING_HANGUP && p->interface_state != SKYPIAX_STATE_DOWN) 
       if (res == CALLFLOW_INCOMING_HANGUP) {
+			switch_core_session_t *session = NULL;
+			private_t *tech_pvt;
+			switch_channel_t *channel;
+
+
+			p->interface_state=SKYPIAX_STATE_DOWN;
         //if (option_debug)
           DEBUGA_SKYPE("skype call ended\n", SKYPIAX_P_LOG);
-        if (p->owner) {
-          pthread_testcancel();
-          ast_queue_control(p->owner, SKYPIAX_CONTROL_HANGUP);
-        }
+
+		  tech_pvt = p->tech_pvt;
+		  session = tech_pvt->session;
+ 
+	channel = switch_core_session_get_channel(session);
+          DEBUGA_SKYPE("before channel_on_hangup\n", SKYPIAX_P_LOG);
+
+							//switch_channel_set_state(channel, CS_HANGUP);
+
+		  switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
+          DEBUGA_SKYPE("after channel_on_hangup\n", SKYPIAX_P_LOG);
+
+          //DEBUGA_SKYPE("set state to CS_HANGUP\n", SKYPIAX_P_LOG);
       }
 #endif
   }
@@ -2440,11 +2525,15 @@
 
 	switch_clear_flag_locked(tech_pvt, TFLAG_IO);
 	switch_clear_flag_locked(tech_pvt, TFLAG_VOICE);
-	//switch_thread_cond_signal(tech_pvt->cond);
-    WARNINGA("hanging up skype call: %s\n", SKYPIAX_P_LOG, p->skype_call_id);
-    //sprintf(msg_to_skype, "SET CALL %s STATUS FINISHED", p->skype_call_id);
-    sprintf(msg_to_skype, "ALTER CALL %s HANGUP", p->skype_call_id);
-    skypiax_skype_write(p, msg_to_skype);
+	//switch_set_flag_locked(tech_pvt, TFLAG_HANGUP);
+
+	if(strlen(p->skype_call_id)) {
+		//switch_thread_cond_signal(tech_pvt->cond);
+		WARNINGA("hanging up skype call: %s\n", SKYPIAX_P_LOG, p->skype_call_id);
+		//sprintf(msg_to_skype, "SET CALL %s STATUS FINISHED", p->skype_call_id);
+		sprintf(msg_to_skype, "ALTER CALL %s HANGUP", p->skype_call_id);
+		skypiax_skype_write(p, msg_to_skype);
+	}
  
 	if (tech_pvt->read_codec.implementation) {
 		switch_core_codec_destroy(&tech_pvt->read_codec);



More information about the Freeswitch-svn mailing list