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);