[commit] r14015 - in freeswitch/trunk/contrib: jmesquita/mod_khomp mod/endpoints/mod_khomp mod/endpoints/mod_khomp/include mod/endpoints/mod_khomp/src
Author: raulfragoso Date: Sat Jun 27 19:18:43 2009 New Revision: 14015 Log: - No more dynamic allocation of pvt objects; - Initial implementation of a function to find the first available channel; Modified: freeswitch/trunk/contrib/jmesquita/mod_khomp/mod_khomp.cpp freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h freeswitch/trunk/contrib/mod/endpoints/mod_khomp/mod_khomp.cpp freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp Modified: freeswitch/trunk/contrib/jmesquita/mod_khomp/mod_khomp.cpp ============================================================================== --- freeswitch/trunk/contrib/jmesquita/mod_khomp/mod_khomp.cpp (original) +++ freeswitch/trunk/contrib/jmesquita/mod_khomp/mod_khomp.cpp Sat Jun 27 19:18:43 2009 @@ -247,6 +247,8 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CHANNEL ON HANGUP\n"); + switch_channel_t *channel = NULL; private_t *tech_pvt = NULL; @@ -291,6 +293,8 @@ static switch_status_t channel_kill_channel(switch_core_session_t *session, int sig) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CHANNEL KILL, sig = %d\n", sig); + switch_channel_t *channel = NULL; private_t *tech_pvt = NULL; @@ -1282,7 +1286,7 @@ static void Kstdcall khomp_audio_listener (int32 deviceid, int32 mixer, byte * read_buffer, int32 read_size) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "New audio buffer for deviceid %d, mixer %d, with size %d\n", deviceid, mixer, read_size); + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "New audio buffer for deviceid %d, mixer %d, with size %d\n", deviceid, mixer, read_size); } /* For Emacs: Modified: freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h ============================================================================== --- freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h (original) +++ freeswitch/trunk/contrib/mod/endpoints/mod_khomp/include/khomp_pvt.h Sat Jun 27 19:18:43 2009 @@ -46,24 +46,34 @@ return _pvts[target.device][target.object]; } + static KhompPvt * find_channel(char* allocation_string, switch_core_session_t * new_session, switch_call_cause_t * cause); + static void initialize(void) { + switch_mutex_init(&_pvts_mutex, SWITCH_MUTEX_NESTED, Globals::_module_pool); + for (unsigned dev = 0; dev < Globals::_k3lapi.device_count(); dev++) { - // KhompPvt * tech_pvt; - //tech= (KhompPvt *) switch_core_session_alloc(*new_session, sizeof(KhompPvt)); _pvts.push_back(std::vector<KhompPvt*>()); for (unsigned obj = 0; obj < Globals::_k3lapi.channel_count(dev); obj++) { K3LAPI::target tgt(Globals::_k3lapi, K3LAPI::target::CHANNEL, dev, obj); KhompPvt * pvt = new KhompPvt(tgt); + pvt->_KDeviceId = dev; + pvt->_KChannelId = obj; + pvt->_session = NULL; _pvts.back().push_back(pvt); Globals::_k3lapi.command(dev, obj, CM_DISCONNECT, NULL); } } } + static void terminate() + { + + } + K3LAPI::target _target; switch_core_session_t * _session; @@ -74,6 +84,8 @@ switch_frame_t _read_frame; + switch_buffer_t * _audio_buffer; + unsigned char _databuf[SWITCH_RECOMMENDED_BUFFER_SIZE]; switch_caller_profile_t *_caller_profile; @@ -82,9 +94,11 @@ switch_mutex_t *flag_mutex; //TODO: Alterar o nome depois unsigned int _KDeviceId; // Represent de board we are making the call from - unsigned int _KChannel; // Represent the channel we are making the call from + unsigned int _KChannelId; // Represent the channel we are making the call from + + /* static stuff */ + static switch_mutex_t *_pvts_mutex; - /* static stuff */ static KhompPvtVector _pvts; }; Modified: freeswitch/trunk/contrib/mod/endpoints/mod_khomp/mod_khomp.cpp ============================================================================== --- freeswitch/trunk/contrib/mod/endpoints/mod_khomp/mod_khomp.cpp (original) +++ freeswitch/trunk/contrib/mod/endpoints/mod_khomp/mod_khomp.cpp Sat Jun 27 19:18:43 2009 @@ -53,7 +53,7 @@ switch_mutex_init(&tech_pvt->_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session)); switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session)); - + switch_core_session_set_private(session, tech_pvt); tech_pvt->_session = session; @@ -183,7 +183,7 @@ try { - Globals::_k3lapi.command(tech_pvt->_KDeviceId, tech_pvt->_KChannel, CM_DISCONNECT, NULL); + Globals::_k3lapi.command(tech_pvt->_KDeviceId, tech_pvt->_KChannelId, CM_DISCONNECT, NULL); } catch(K3LAPI::failed_command & e) { @@ -267,7 +267,6 @@ tech_pvt->_read_frame.flags = SFF_NONE; *frame = NULL; - while (switch_test_flag(tech_pvt, TFLAG_IO)) { if (switch_test_flag(tech_pvt, TFLAG_BREAK)) { @@ -385,79 +384,68 @@ char *argv[3] = { 0 }; int argc = 0; + KhompPvt *tech_pvt; + switch_call_cause_t cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; + /* We first need to find an available KhompPvt object to serve the session */ + if ((*new_session = switch_core_session_request(Globals::_khomp_endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, pool)) != 0) { - KhompPvt *tech_pvt; switch_channel_t *channel; switch_caller_profile_t *caller_profile; + char name[128]; - switch_core_session_add_stream(*new_session, NULL); - if ((tech_pvt = (KhompPvt *) switch_core_session_alloc(*new_session, sizeof(KhompPvt))) != 0) { - channel = switch_core_session_get_channel(*new_session); - tech_init(tech_pvt, *new_session); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Hey where is my memory pool?\n"); - switch_core_session_destroy(new_session); - return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; - } - - if (outbound_profile) { - char name[128]; - - snprintf(name, sizeof(name), "Khomp/%s", outbound_profile->destination_number); - switch_channel_set_name(channel, name); + if (outbound_profile) + { + tech_pvt = KhompPvt::find_channel(outbound_profile->destination_number, *new_session, &cause); - /* Let's setup our own vars on tech_pvt */ - if ((argc = switch_separate_string(outbound_profile->destination_number, '/', argv, (sizeof(argv) / sizeof(argv[0])))) < 3) + if(tech_pvt == NULL || cause != SWITCH_CAUSE_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid dial string. Should be on the format:[Khomp/BOARD/CHANNEL]\n"); - return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; + switch_core_session_destroy(new_session); + return cause; } - else - { - // usar algoritmo de busca de canais (spec.*). - tech_pvt->_KDeviceId = atoi(argv[0]); - tech_pvt->_KChannel = atoi(argv[1]); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Dialing to %s out from Board:%u, Channel:%u.\n", - argv[2], - tech_pvt->_KDeviceId, - tech_pvt->_KChannel); - - } - - caller_profile = switch_caller_profile_clone(*new_session, outbound_profile); - switch_channel_set_caller_profile(channel, caller_profile); - tech_pvt->_caller_profile = caller_profile; - } else { + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Dialing to %s out from Board:%u, Channel:%u.\n", + argv[2], + tech_pvt->_KDeviceId, + tech_pvt->_KChannelId); + } + else + { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Doh! no caller profile\n"); switch_core_session_destroy(new_session); - /* Destroy the channel session */ - KhompPvt::khompPvt(tech_pvt->_KDeviceId, tech_pvt->_KChannel)->session(NULL); return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; } + + switch_core_session_add_stream(*new_session, NULL); + channel = switch_core_session_get_channel(*new_session); + tech_init(tech_pvt, *new_session); - + snprintf(name, sizeof(name), "Khomp/%s", outbound_profile->destination_number); + switch_channel_set_name(channel, name); + + caller_profile = switch_caller_profile_clone(*new_session, outbound_profile); + switch_channel_set_caller_profile(channel, caller_profile); + tech_pvt->_caller_profile = caller_profile; switch_channel_set_flag(channel, CF_OUTBOUND); switch_set_flag_locked(tech_pvt, TFLAG_OUTBOUND); switch_channel_set_state(channel, CS_INIT); - try { + try + { /* Lets make the call! */ char params[ 255 ]; snprintf(params, sizeof(params), "dest_addr=\"%s\" orig_addr=\"%s\"", argv[2], outbound_profile->caller_id_number); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "We are calling with params: %s.\n", params); - Globals::_k3lapi.command(tech_pvt->_KDeviceId,tech_pvt->_KChannel, CM_MAKE_CALL, params); + Globals::_k3lapi.command(tech_pvt->_KDeviceId,tech_pvt->_KChannelId, CM_MAKE_CALL, params); } catch(K3LAPI::failed_command & e) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not place call! Cause: code%x and rc%d.\n", e.code, e.rc); + switch_core_session_destroy(new_session); return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; } - /* Add the new session the the channel's info */ - KhompPvt::khompPvt(tech_pvt->_KDeviceId, tech_pvt->_KChannel)->session(*new_session); - return SWITCH_CAUSE_SUCCESS; } @@ -1113,8 +1101,11 @@ return ksSuccess; } -static void Kstdcall khomp_audio_listener (int32 deviceid, int32 mixer, byte * read_buffer, int32 read_size) +static void Kstdcall khomp_audio_listener (int32 deviceid, int32 objectid, byte * read_buffer, int32 read_size) { + KhompPvt * pvt = KhompPvt::khompPvt(deviceid, objectid); + /*TODO: write to the switch_buffer_t member, which will be read by channel_read_frame */ + } /* For Emacs: Modified: freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp ============================================================================== --- freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp (original) +++ freeswitch/trunk/contrib/mod/endpoints/mod_khomp/src/khomp_pvt.cpp Sat Jun 27 19:18:43 2009 @@ -1,3 +1,132 @@ #include "khomp_pvt.h" KhompPvt::KhompPvtVector KhompPvt::_pvts; +switch_mutex_t * KhompPvt::_pvts_mutex; + +KhompPvt * KhompPvt::find_channel(char* allocation_string, switch_core_session_t * new_session, switch_call_cause_t * cause) +{ + /* For now we support only the 'first-free' mode */ + + char *argv[3] = { 0 }; + int argc = 0; + + int board_low = 0; + int board_high = 0; + + int channel_low = 0; + int channel_high = 0; + + bool first_channel_available = true; + + *cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; + + KhompPvt * pvt = NULL; + + /* Let's setup our own vars on tech_pvt */ + if ((argc = switch_separate_string(allocation_string, '/', argv, (sizeof(argv) / sizeof(argv[0])))) < 3) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid dial string (%s). Should be on the format:[Khomp/BoardID (or A for first free board)/CHANNEL (or A for first free channel)]\n", allocation_string); + return NULL; + } + + if(*argv[0] == 'A' || *argv[0] == 'a') + { + board_low = 0; + board_high = Globals::_k3lapi.device_count(); + } + else + { + board_low = atoi(argv[0]); + board_high = board_low; + } + + if(*argv[1] == 'A' || *argv[1] == 'a') + { + first_channel_available = true; + } + else + { + first_channel_available = false; + channel_low = atoi(argv[0]); + channel_high = board_low; + } + + /* Sanity checking */ + if(board_low < 0 || board_high > Globals::_k3lapi.device_count()) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid board selection (%d-%d) !\n", board_low, board_high); + return NULL; + } + + switch_mutex_lock(_pvts_mutex); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel selection: board (%d-%d), channel (%d-%d)!\n", board_low, board_high, channel_low, channel_high); + + for (int board = board_low ; board < board_high; board++) + { + if(pvt != NULL) + break; + + if(first_channel_available) + { + channel_low = 0; + channel_high = Globals::_k3lapi.channel_count(board); + } + else + { + if(channel_low < 0 || channel_high > Globals::_k3lapi.channel_count(board)) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel selection (%d-%d) !\n", channel_low, channel_high); + switch_mutex_unlock(_pvts_mutex); + return NULL; + } + } + + for (int channel = channel_low ; channel < channel_high ; channel++) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking if (%d-%d) is free\n", board, channel); + try + { + K3L_CHANNEL_CONFIG channelConfig; + channelConfig = Globals::_k3lapi.channel_config( board, channel ); + } + catch (...) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Exception while retrieving channel config for board %d, channel%d!\n", board, channel); + switch_mutex_unlock(_pvts_mutex); + return NULL; + } + K3L_CHANNEL_STATUS status; + if (k3lGetDeviceStatus( board, channel + ksoChannel, &status, sizeof(status) ) != ksSuccess) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "k3lGetDeviceStatus failed to retrieve channel config for board %d, channel%d!\n", board, channel); + switch_mutex_unlock(_pvts_mutex); + return NULL; + } + if(status.CallStatus == kcsFree) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel (%d-%d) is free, let's check if the session is available ...\n", board, channel); + pvt = KhompPvt::khompPvt(board, channel); + if(pvt != NULL && pvt->session() == NULL) + { + pvt->session(new_session); + break; + } + pvt = NULL; + } + } + } + + if(pvt != NULL) + { + *cause = SWITCH_CAUSE_SUCCESS; + } + else + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No channels available\n"); + *cause = SWITCH_CAUSE_NORMAL_CIRCUIT_CONGESTION; + } + + switch_mutex_unlock(_pvts_mutex); + return pvt; +} \ No newline at end of file
participants (1)
-
FreeSWITCH SVN