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