skypiax: no more pipes for audio samples exchange between threads. Let's hope it does not breaks things around. Only other possible cause of audio delay is socket buffering. We'll check that too.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15541 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Giovanni Maruzzelli 2009-11-19 14:20:53 +00:00
parent a0e2b9a4fe
commit 8e40f02891
3 changed files with 106 additions and 39 deletions

View File

@ -741,10 +741,22 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
sent = frame->datalen; sent = frame->datalen;
#ifdef WIN32 #ifdef WIN32
switch_file_write(tech_pvt->audioskypepipe[1], frame->data, &sent); //switch_file_write(tech_pvt->audiopipe_cli[1], frame->data, &sent);
#else /* WIN32 */ #else /* WIN32 */
sent = write(tech_pvt->audioskypepipe[1], frame->data, sent); //sent = write(tech_pvt->audiopipe_cli[1], frame->data, sent);
#endif /* WIN32 */ #endif /* WIN32 */
while(tech_pvt->flag_audio_cli == 1){
switch_sleep(100); //1 millisec
//NOTICA("write \n", SKYPIAX_P_LOG);
}
//WARNINGA("write \n", SKYPIAX_P_LOG);
//memcpy(tech_pvt->audiobuf_cli, frame->data, frame->datalen);
memcpy(tech_pvt->audiobuf_cli, frame->data, frame->datalen);
tech_pvt->flag_audio_cli = 1;
//NOTICA("write \n", SKYPIAX_P_LOG);
if (sent != frame->datalen && sent != -1) { if (sent != frame->datalen && sent != -1) {
DEBUGA_SKYPE("CLI PIPE write %d\n", SKYPIAX_P_LOG, sent); DEBUGA_SKYPE("CLI PIPE write %d\n", SKYPIAX_P_LOG, sent);
} }
@ -1420,7 +1432,7 @@ static switch_status_t load_config(int reload_type)
static switch_status_t chat_send(const char *proto, const char *from, const char *to, const char *subject, const char *body, const char *type, const char *hint) static switch_status_t chat_send(const char *proto, const char *from, const char *to, const char *subject, const char *body, const char *type, const char *hint)
{ {
//char *user, *host, *f_user = NULL, *ffrom = NULL, *f_host = NULL, *f_resource = NULL; //char *user, *host, *f_user = NULL, *ffrom = NULL, *f_host = NULL, *f_resource = NULL;
char *user, *host, *f_user = NULL, *f_host = NULL, *f_resource = NULL; char *user=NULL, *host, *f_user = NULL, *f_host = NULL, *f_resource = NULL;
//mdl_profile_t *profile = NULL; //mdl_profile_t *profile = NULL;
private_t * tech_pvt=NULL; private_t * tech_pvt=NULL;
int i=0, found=0, tried=0; int i=0, found=0, tried=0;
@ -1629,14 +1641,14 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_skypiax_shutdown)
} }
#ifndef WIN32 #ifndef WIN32
WARNINGA("SHUTDOWN interface_id=%d\n", SKYPIAX_P_LOG, interface_id); WARNINGA("SHUTDOWN interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
shutdown(tech_pvt->audioskypepipe[0], 2); shutdown(tech_pvt->audiopipe_cli[0], 2);
close(tech_pvt->audioskypepipe[0]); close(tech_pvt->audiopipe_cli[0]);
shutdown(tech_pvt->audioskypepipe[1], 2); shutdown(tech_pvt->audiopipe_cli[1], 2);
close(tech_pvt->audioskypepipe[1]); close(tech_pvt->audiopipe_cli[1]);
shutdown(tech_pvt->audiopipe[0], 2); shutdown(tech_pvt->audiopipe_srv[0], 2);
close(tech_pvt->audiopipe[0]); close(tech_pvt->audiopipe_srv[0]);
shutdown(tech_pvt->audiopipe[1], 2); shutdown(tech_pvt->audiopipe_srv[1], 2);
close(tech_pvt->audiopipe[1]); close(tech_pvt->audiopipe_srv[1]);
shutdown(tech_pvt->SkypiaxHandles.fdesc[0], 2); shutdown(tech_pvt->SkypiaxHandles.fdesc[0], 2);
close(tech_pvt->SkypiaxHandles.fdesc[0]); close(tech_pvt->SkypiaxHandles.fdesc[0]);
shutdown(tech_pvt->SkypiaxHandles.fdesc[1], 2); shutdown(tech_pvt->SkypiaxHandles.fdesc[1], 2);

View File

@ -229,12 +229,12 @@ struct private_object {
int skype; /*!< \brief config flag, bool, Skype support on this interface (0 if false, -1 if true) */ int skype; /*!< \brief config flag, bool, Skype support on this interface (0 if false, -1 if true) */
int control_to_send; int control_to_send;
#ifdef WIN32 #ifdef WIN32
switch_file_t *audiopipe[2]; switch_file_t *audiopipe_srv[2];
switch_file_t *audioskypepipe[2]; switch_file_t *audiopipe_cli[2];
switch_file_t *skypiax_sound_capt_fd; /*!< \brief file descriptor for sound capture dev */ switch_file_t *skypiax_sound_capt_fd; /*!< \brief file descriptor for sound capture dev */
#else /* WIN32 */ #else /* WIN32 */
int audiopipe[2]; int audiopipe_srv[2];
int audioskypepipe[2]; int audiopipe_cli[2];
int skypiax_sound_capt_fd; /*!< \brief file descriptor for sound capture dev */ int skypiax_sound_capt_fd; /*!< \brief file descriptor for sound capture dev */
#endif /* WIN32 */ #endif /* WIN32 */
switch_thread_t *tcp_srv_thread; switch_thread_t *tcp_srv_thread;
@ -243,6 +243,12 @@ struct private_object {
switch_thread_t *skypiax_api_thread; switch_thread_t *skypiax_api_thread;
short audiobuf[SAMPLES_PER_FRAME]; short audiobuf[SAMPLES_PER_FRAME];
int audiobuf_is_loaded; int audiobuf_is_loaded;
short audiobuf_cli[SAMPLES_PER_FRAME];
switch_mutex_t *mutex_audio_cli;
int flag_audio_cli;
short audiobuf_srv[SAMPLES_PER_FRAME];
switch_mutex_t *mutex_audio_srv;
int flag_audio_srv;
//int phonebook_listing; //int phonebook_listing;
//int phonebook_querying; //int phonebook_querying;

View File

@ -786,7 +786,18 @@ void *skypiax_do_tcp_srv_thread_func(void *obj)
i++; i++;
} }
/* send the complete frame through the pipe to our code waiting for incoming audio */ /* send the complete frame through the pipe to our code waiting for incoming audio */
howmany = skypiax_pipe_write(tech_pvt->audiopipe[1], totalbuf, SAMPLES_PER_FRAME * sizeof(short)); //howmany = skypiax_pipe_write(tech_pvt->audiopipe_srv[1], totalbuf, SAMPLES_PER_FRAME * sizeof(short));
while(tech_pvt->flag_audio_srv == 1){
switch_sleep(100); //1 millisec
//NOTICA("write \n", SKYPIAX_P_LOG);
}
//WARNINGA("read \n", SKYPIAX_P_LOG);
howmany = SAMPLES_PER_FRAME * sizeof(short);
memcpy(tech_pvt->audiobuf_srv, totalbuf, SAMPLES_PER_FRAME * sizeof(short));
tech_pvt->flag_audio_srv = 1;
//NOTICA("read \n", SKYPIAX_P_LOG);
if (howmany != SAMPLES_PER_FRAME * sizeof(short)) { if (howmany != SAMPLES_PER_FRAME * sizeof(short)) {
ERRORA("howmany is %d, but was expected to be %d\n", SKYPIAX_P_LOG, ERRORA("howmany is %d, but was expected to be %d\n", SKYPIAX_P_LOG,
howmany, (int) (SAMPLES_PER_FRAME * sizeof(short))); howmany, (int) (SAMPLES_PER_FRAME * sizeof(short)));
@ -811,15 +822,24 @@ void *skypiax_do_tcp_srv_thread_func(void *obj)
/* let's send some frame in the pipes, so both tcp_cli and tcp_srv will have an occasion to die */ /* let's send some frame in the pipes, so both tcp_cli and tcp_srv will have an occasion to die */
kill_cli_size = SAMPLES_PER_FRAME * sizeof(short); kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
len = skypiax_pipe_write(tech_pvt->audiopipe[1], kill_cli_buff, kill_cli_size); len = skypiax_pipe_write(tech_pvt->audiopipe_srv[1], kill_cli_buff, kill_cli_size);
kill_cli_size = SAMPLES_PER_FRAME * sizeof(short); kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
len = skypiax_pipe_write(tech_pvt->audioskypepipe[1], kill_cli_buff, kill_cli_size); len = skypiax_pipe_write(tech_pvt->audiopipe_cli[1], kill_cli_buff, kill_cli_size);
tech_pvt->interface_state = SKYPIAX_STATE_DOWN; //tech_pvt->interface_state = SKYPIAX_STATE_DOWN;
kill_cli_size = SAMPLES_PER_FRAME * sizeof(short); kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
len = skypiax_pipe_write(tech_pvt->audiopipe[1], kill_cli_buff, kill_cli_size); len = skypiax_pipe_write(tech_pvt->audiopipe_srv[1], kill_cli_buff, kill_cli_size);
kill_cli_size = SAMPLES_PER_FRAME * sizeof(short); kill_cli_size = SAMPLES_PER_FRAME * sizeof(short);
len = skypiax_pipe_write(tech_pvt->audioskypepipe[1], kill_cli_buff, kill_cli_size); len = skypiax_pipe_write(tech_pvt->audiopipe_cli[1], kill_cli_buff, kill_cli_size);
tech_pvt->flag_audio_cli = 1; //let's send some frame in the pipes, so both tcp_cli and tcp_srv will have an occasion to die
skypiax_sleep(200);
tech_pvt->flag_audio_srv = 1; //let's send some frame in the pipes, so both tcp_cli and tcp_srv will have an occasion to die
skypiax_sleep(200);
tech_pvt->interface_state = SKYPIAX_STATE_DOWN;
tech_pvt->flag_audio_cli = 1; //let's send some frame in the pipes, so both tcp_cli and tcp_srv will have an occasion to die
skypiax_sleep(200);
tech_pvt->flag_audio_srv = 1; //let's send some frame in the pipes, so both tcp_cli and tcp_srv will have an occasion to die
skypiax_sleep(200);
DEBUGA_SKYPE("Skype incoming audio GONE\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("Skype incoming audio GONE\n", SKYPIAX_P_LOG);
skypiax_close_socket(fd); skypiax_close_socket(fd);
} }
@ -893,8 +913,8 @@ void *skypiax_do_tcp_cli_thread_func(void *obj)
while (s > 0 && (fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) { while (s > 0 && (fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
DEBUGA_SKYPE("ACCEPTED here you send me %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_cli_port); DEBUGA_SKYPE("ACCEPTED here you send me %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_cli_port);
#ifndef WIN32 #ifndef WIN32
fcntl(tech_pvt->audioskypepipe[0], F_SETFL, O_NONBLOCK); fcntl(tech_pvt->audiopipe_cli[0], F_SETFL, O_NONBLOCK);
fcntl(tech_pvt->audioskypepipe[1], F_SETFL, O_NONBLOCK); fcntl(tech_pvt->audiopipe_cli[1], F_SETFL, O_NONBLOCK);
#endif //WIN32 #endif //WIN32
if (!(running && tech_pvt->running)) if (!(running && tech_pvt->running))
@ -918,22 +938,43 @@ void *skypiax_do_tcp_cli_thread_func(void *obj)
fdselect = fd; fdselect = fd;
FD_SET(fdselect, &fs); FD_SET(fdselect, &fs);
rt = select(fdselect + 1, NULL, &fs, NULL, &to); //rt = select(fdselect + 1, NULL, &fs, NULL, &to);
#else #else
/* on *unix and cygwin we select from the real pipe */ /* on *unix and cygwin we select from the real pipe */
fdselect = tech_pvt->audioskypepipe[0]; //XXX fdselect = tech_pvt->audiopipe_cli[0];
//XXX FD_SET(fdselect, &fs);
//rt = select(fdselect + 1, &fs, NULL, NULL, &to);
#endif
fdselect = fd;
FD_SET(fdselect, &fs); FD_SET(fdselect, &fs);
rt = select(fdselect + 1, &fs, NULL, NULL, &to); //XXX rt = select(fdselect + 1, NULL, &fs, NULL, &to);
#endif while(tech_pvt->flag_audio_cli == 0){
skypiax_sleep(100); //1 millisec
//NOTICA("write \n", SKYPIAX_P_LOG);
}
//ERRORA("write \n", SKYPIAX_P_LOG);
rt = 1;
if (rt > 0) { if (rt > 0) {
int counter; int counter;
/* until we drained the pipe to empty */ /* until we drained the pipe to empty */
for (counter = 0; counter < 10; counter++) { //for (counter = 0; counter < 10; counter++) {
for (counter = 0; counter < 1; counter++) {
/* read from the pipe the audio frame we are supposed to send out */ /* read from the pipe the audio frame we are supposed to send out */
got = skypiax_pipe_read(tech_pvt->audioskypepipe[0], cli_in, SAMPLES_PER_FRAME * sizeof(short)); //got = skypiax_pipe_read(tech_pvt->audiopipe_cli[0], cli_in, SAMPLES_PER_FRAME * sizeof(short));
got = SAMPLES_PER_FRAME * sizeof(short);
memcpy(cli_in, tech_pvt->audiobuf_cli, SAMPLES_PER_FRAME * sizeof(short));
tech_pvt->flag_audio_cli = 0;
if (got == -1) if (got == -1)
break; break;
@ -1015,7 +1056,15 @@ int skypiax_audio_read(private_t * tech_pvt)
{ {
unsigned int samples; unsigned int samples;
samples = skypiax_pipe_read(tech_pvt->audiopipe[0], tech_pvt->read_frame.data, SAMPLES_PER_FRAME * sizeof(short)); while(tech_pvt->flag_audio_srv == 0){
skypiax_sleep(100); //1 millisec
//NOTICA("read \n", SKYPIAX_P_LOG);
}
//ERRORA("read \n", SKYPIAX_P_LOG);
//samples = skypiax_pipe_read(tech_pvt->audiopipe_srv[0], tech_pvt->read_frame.data, SAMPLES_PER_FRAME * sizeof(short));
samples = SAMPLES_PER_FRAME * sizeof(short);
memcpy(tech_pvt->read_frame.data, tech_pvt->audiobuf_srv, SAMPLES_PER_FRAME * sizeof(short));
tech_pvt->flag_audio_srv = 0;
if (samples != SAMPLES_PER_FRAME * sizeof(short)) { if (samples != SAMPLES_PER_FRAME * sizeof(short)) {
if (samples) if (samples)
@ -1100,8 +1149,8 @@ int skypiax_close_socket(unsigned int fd)
int skypiax_audio_init(private_t * tech_pvt) int skypiax_audio_init(private_t * tech_pvt)
{ {
switch_status_t rv; switch_status_t rv;
rv = switch_file_pipe_create(&tech_pvt->audiopipe[0], &tech_pvt->audiopipe[1], skypiax_module_pool); rv = switch_file_pipe_create(&tech_pvt->audiopipe_srv[0], &tech_pvt->audiopipe_srv[1], skypiax_module_pool);
rv = switch_file_pipe_create(&tech_pvt->audioskypepipe[0], &tech_pvt->audioskypepipe[1], skypiax_module_pool); rv = switch_file_pipe_create(&tech_pvt->audiopipe_cli[0], &tech_pvt->audiopipe_cli[1], skypiax_module_pool);
return 0; return 0;
} }
#else /* WIN32 */ #else /* WIN32 */
@ -1132,17 +1181,17 @@ int skypiax_close_socket(unsigned int fd)
int skypiax_audio_init(private_t * tech_pvt) int skypiax_audio_init(private_t * tech_pvt)
{ {
if (pipe(tech_pvt->audiopipe)) { if (pipe(tech_pvt->audiopipe_srv)) {
fcntl(tech_pvt->audiopipe[0], F_SETFL, O_NONBLOCK); fcntl(tech_pvt->audiopipe_srv[0], F_SETFL, O_NONBLOCK);
fcntl(tech_pvt->audiopipe[1], F_SETFL, O_NONBLOCK); fcntl(tech_pvt->audiopipe_srv[1], F_SETFL, O_NONBLOCK);
} }
if (pipe(tech_pvt->audioskypepipe)) { if (pipe(tech_pvt->audiopipe_cli)) {
fcntl(tech_pvt->audioskypepipe[0], F_SETFL, O_NONBLOCK); fcntl(tech_pvt->audiopipe_cli[0], F_SETFL, O_NONBLOCK);
fcntl(tech_pvt->audioskypepipe[1], F_SETFL, O_NONBLOCK); fcntl(tech_pvt->audiopipe_cli[1], F_SETFL, O_NONBLOCK);
} }
/* this pipe is the audio fd for asterisk to poll on during a call. FS do not use it */ /* this pipe is the audio fd for asterisk to poll on during a call. FS do not use it */
tech_pvt->skypiax_sound_capt_fd = tech_pvt->audiopipe[0]; tech_pvt->skypiax_sound_capt_fd = tech_pvt->audiopipe_srv[0];
return 0; return 0;
} }