Hi guys, I've been having a uuid_bridge issue, its very easy to replicate the problem (sample C module included). All the C code does is play /tmp/hold.wav file on a loop. I use sofia and a voip provider , don't know if it has anything to do with it. All you have to do to make the bug occur is have 3 calls like these and note the uuids. Then just uuid_bridge any 2. I tried issuing "api break" commands to stop the music, or park the calls. Same problem. The call bridge is unusable after the bug occurs. 1) originate sofia/gateway/asterlink.com/12125551234 &stpAgent(); 2) originate sofia/gateway/asterlink.com/12125558888 &stpAgent(); 3) originate sofia/gateway/asterlink.com/12125559999 &stpAgent(); mod_stpAgent included: /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com> * * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * * The Initial Developer of the Original Code is * Anthony Minessale II <anthmct@yahoo.com> * Portions created by the Initial Developer are Copyright (C) * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Anthony Minessale II <anthmct@yahoo.com> * Neal Horman <neal at wanlink dot com> * * * mod_skel.c -- Framework Demo Module * */ #include <switch.h> //SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_stpAgent_shutdown); //SWITCH_MODULE_RUNTIME_FUNCTION(mod_stpAgent_runtime); SWITCH_MODULE_LOAD_FUNCTION(mod_stpAgent_load); SWITCH_MODULE_DEFINITION(mod_stpAgent, mod_stpAgent_load, NULL, NULL); /* dtmf handler function you can hook up to be executed when a digit is dialed during playback if you return anything but SWITCH_STATUS_SUCCESS the playback will stop. */ static switch_status_t on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { switch (itype) { case SWITCH_INPUT_TYPE_DTMF: { char *dtmf = (char *) input; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Digits %s\n", dtmf); switch_copy_string((char *)buf, dtmf, buflen); return SWITCH_STATUS_BREAK; } break; default: break; } return SWITCH_STATUS_SUCCESS; } static int wait_for_answer(switch_channel_t *channel) { switch_time_t started; unsigned int elapsed; switch_time_t timeout = 60000000; //2 mins assert(channel != NULL); started = switch_time_now(); for (;;) { if (((elapsed = (unsigned int) ((switch_time_now() - started) / 1000)) > (switch_time_t) timeout) || switch_channel_get_state(channel) >= CS_HANGUP) { printf("Timeout on wait_for_answer.\n"); return 0; break; } if (switch_channel_ready(channel) && switch_channel_test_flag(channel, CF_ANSWERED)) { return 1; break; } switch_yield(1000); } return 1; } //utility functions switch_status_t playFile(switch_core_session_t *session, char* sound_dir,char* file,char* buf){ switch_ivr_sleep (session,250); //file could be a single path or multiple like: stp-live/u_bcst_inf_how_01.gsm,stp-live/u_bcst_inf_how_02.gsm,stp-live/u_bcs t_inf_how_03.gsm char *str=strdup(file); char *p=NULL; switch_status_t s=SWITCH_STATUS_SUCCESS; while((p = strsep(&str,",")) != NULL){ char* soundName=malloc(strlen(p)+strlen(sound_dir)+3); sprintf(soundName,"%s/%s",sound_dir,p); switch_input_args_t args = { 0 }; args.input_callback = on_dtmf; args.buf = buf; args.buflen = sizeof(buf); memset(buf, 0, sizeof(buf)); s=switch_ivr_play_file(session, NULL, soundName, &args); if (soundName) free(soundName); soundName=NULL; } if (str) free(str); str=NULL; return s; } void logMsg(char* call_id,char* txt){ //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE,"[mod_stp_userAgent]:%s",txt); if (txt==NULL || call_id==NULL) return; printf("[mod_stp_userAgent][%s]:%s\n",call_id,txt); } void logMsg2(char* call_id,char* txt1,char* txt2){ if (txt1==NULL || txt2==NULL || call_id==NULL) return; printf("[mod_stp_userAgent][%s]:%s%s\n",call_id,txt1,txt2); } SWITCH_STANDARD_APP(stpAgent_function){ //passed in *data /// char* call_id=NULL; /// char *sound_dir=NULL; /// char *user_recordings_dir=NULL; /// char *ammt=NULL; /// char *appStr=NULL; /// int app=0; // App is the ivr script we are running. 0= User, 1=Merchant, 2=UserMatch /// char *call_id_outb=NULL; char buf[10] = ""; switch_channel_t *channel; //switch_status_t status = SWITCH_STATUS_SUCCESS; //switch_codec_t *codec; channel = switch_core_session_get_channel(session); assert(channel != NULL); //wait till the called party answers if (wait_for_answer(channel)==0) goto cleanup; //no answer //wait 1 secs switch_ivr_sleep (session,500); switch_channel_answer(channel); while (switch_channel_ready(channel)){ playFile(session,"/var/lib/freeswitch/","stp-live/p_hold.wav",buf); } //goto cleanup; cleanup: /// logMsg(app == 1 ? call_id_outb : call_id,"EXITING APP"); /// logMsg(app == 1 ? call_id_outb : call_id,"*** CLEANUP *****"); // if (args) free(args); // args=NULL; printf("stpAgent done!\n"); } #if 0 static switch_loadable_module_interface_t stpAgent_module_interface = { /*.module_name */ modname, /*.endpoint_interface */ NULL, /*.timer_interface */ NULL, /*.dialplan_interface */ NULL, /*.codec_interface */ NULL, /*.application_interface */ NULL, /*.api_interface */ NULL, /*.file_interface */ NULL, /*.speech_interface */ NULL, /*.directory_interface */ NULL }; #endif SWITCH_MODULE_LOAD_FUNCTION(mod_stpAgent_load) { switch_application_interface_t *app_interface; /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); SWITCH_ADD_APP(app_interface, "stpAgent", NULL, NULL, stpAgent_function, NULL, SAF_NONE); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "stpAgent loaded!\n"); /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; } /* Called when the system shuts down SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_stpAgent_shutdown); { return SWITCH_STATUS_SUCCESS; } */ /* If it exists, this is called in it's own thread when the module-load completes If it returns anything but SWITCH_STATUS_TERM it will be called again automaticly SWITCH_MODULE_RUNTIME_FUNCTION(mod_stpAgent_runtime); { while(looping) { switch_yield(1000); } return SWITCH_STATUS_TERM; } */ /* For Emacs: * Local Variables: * mode:c * indent-tabs-mode:nil * tab-width:4 * c-basic-offset:4 * End: * For VIM: * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab: */