[Freeswitch-branches] [commit] r10977 - freeswitch/branches/gmaruzz/src/mod/endpoints/mod_skypiax
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);
participants (1)
-
FreeSWITCH SVN