mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-22 19:29:54 +00:00
missing crtp init in mod_freetdm.c -- start implementing media modify
This commit is contained in:
parent
f223b9a0bb
commit
898a183a0e
@ -178,6 +178,7 @@ static const char* channel_get_variable(switch_core_session_t *session, switch_e
|
|||||||
ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session_t **sp);
|
ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session_t **sp);
|
||||||
void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream);
|
void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream);
|
||||||
void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream);
|
void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream);
|
||||||
|
void ctdm_init(switch_loadable_module_interface_t *module_interface);
|
||||||
|
|
||||||
static switch_core_session_t *ftdm_channel_get_session(ftdm_channel_t *channel, int32_t id)
|
static switch_core_session_t *ftdm_channel_get_session(ftdm_channel_t *channel, int32_t id)
|
||||||
{
|
{
|
||||||
@ -5359,6 +5360,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load)
|
|||||||
SWITCH_ADD_APP(app_interface, "disable_dtmf", "Disable DTMF Detection", "Disable DTMF Detection", disable_dtmf_function, "", SAF_NONE);
|
SWITCH_ADD_APP(app_interface, "disable_dtmf", "Disable DTMF Detection", "Disable DTMF Detection", disable_dtmf_function, "", SAF_NONE);
|
||||||
SWITCH_ADD_APP(app_interface, "enable_dtmf", "Enable DTMF Detection", "Enable DTMF Detection", enable_dtmf_function, "", SAF_NONE);
|
SWITCH_ADD_APP(app_interface, "enable_dtmf", "Enable DTMF Detection", "Enable DTMF Detection", enable_dtmf_function, "", SAF_NONE);
|
||||||
|
|
||||||
|
ctdm_init(*module_interface);
|
||||||
|
|
||||||
/* indicate that the module should continue to be loaded */
|
/* indicate that the module should continue to be loaded */
|
||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -89,19 +89,6 @@ switch_status_t megaco_activate_termination(mg_termination_t *term)
|
|||||||
char dialstring[100];
|
char dialstring[100];
|
||||||
switch_call_cause_t cause;
|
switch_call_cause_t cause;
|
||||||
|
|
||||||
if (!zstr(term->uuid)) {
|
|
||||||
/* A UUID is present, check if the channel still exists */
|
|
||||||
switch_core_session_t *session;
|
|
||||||
if ((session = switch_core_session_locate(term->uuid))) {
|
|
||||||
switch_core_session_rwunlock(session);
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel [%s] already exists for termination [%s]\n", term->uuid, term->name);
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The referenced channel doesn't exist anymore, clear it */
|
|
||||||
term->uuid = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_event_create(&var_event, SWITCH_EVENT_CLONE);
|
switch_event_create(&var_event, SWITCH_EVENT_CLONE);
|
||||||
|
|
||||||
if (term->type == MG_TERM_RTP) {
|
if (term->type == MG_TERM_RTP) {
|
||||||
@ -127,6 +114,26 @@ switch_status_t megaco_activate_termination(mg_termination_t *term)
|
|||||||
/* Set common variables on the channel */
|
/* Set common variables on the channel */
|
||||||
switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, SWITCH_PARK_AFTER_BRIDGE_VARIABLE, "true");
|
switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, SWITCH_PARK_AFTER_BRIDGE_VARIABLE, "true");
|
||||||
|
|
||||||
|
if (!zstr(term->uuid)) {
|
||||||
|
/* A UUID is present, check if the channel still exists */
|
||||||
|
switch_core_session_t *session;
|
||||||
|
if ((session = switch_core_session_locate(term->uuid))) {
|
||||||
|
switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "command", "media_modify");
|
||||||
|
|
||||||
|
switch_core_session_receive_event(session, &var_event);
|
||||||
|
|
||||||
|
switch_core_session_rwunlock(session);
|
||||||
|
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sent refresh to channel [%s], for termination [%s]\n", term->uuid, term->name);
|
||||||
|
|
||||||
|
return SWITCH_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The referenced channel doesn't exist anymore, clear it */
|
||||||
|
term->uuid = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!zstr(term->uuid)) {
|
||||||
if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_CAUSE_SUCCESS) {
|
if (switch_ivr_originate(NULL, &session, &cause, dialstring, 0, NULL, NULL, NULL, NULL, var_event, 0, NULL) != SWITCH_CAUSE_SUCCESS) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to instanciate termination [%s]: %s\n", term->name, switch_channel_cause2str(cause));
|
||||||
status = SWITCH_STATUS_FALSE;
|
status = SWITCH_STATUS_FALSE;
|
||||||
@ -134,6 +141,7 @@ switch_status_t megaco_activate_termination(mg_termination_t *term)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Termination [%s] successfully instanciated as [%s] [%s]\n", term->name, dialstring, switch_core_session_get_uuid(session));
|
||||||
|
}
|
||||||
|
|
||||||
switch_set_flag(term, MGT_ACTIVE);
|
switch_set_flag(term, MGT_ACTIVE);
|
||||||
|
|
||||||
@ -162,7 +170,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha
|
|||||||
switch_snprintf(name, sizeof name, "%s/%d", profile->rtp_termination_id_prefix, term_id);
|
switch_snprintf(name, sizeof name, "%s/%d", profile->rtp_termination_id_prefix, term_id);
|
||||||
} else {
|
} else {
|
||||||
for (term = profile->physical_terminations; term; term = term->next) {
|
for (term = profile->physical_terminations; term; term = term->next) {
|
||||||
if (!strncasecmp(prefix, term->name, prefixlen) && !switch_test_flag(term, MGT_ALLOCATED)) {
|
if (!switch_test_flag(term, MGT_ALLOCATED) && !strncasecmp(prefix, term->name, prefixlen)) {
|
||||||
switch_set_flag(term, MGT_ALLOCATED);
|
switch_set_flag(term, MGT_ALLOCATED);
|
||||||
return term;
|
return term;
|
||||||
}
|
}
|
||||||
@ -185,6 +193,7 @@ mg_termination_t *megaco_choose_termination(megaco_profile_t *profile, const cha
|
|||||||
term->u.rtp.local_port = switch_rtp_request_port(term->u.rtp.local_addr);
|
term->u.rtp.local_port = switch_rtp_request_port(term->u.rtp.local_addr);
|
||||||
term->u.rtp.codec = megaco_codec_str(profile->default_codec);
|
term->u.rtp.codec = megaco_codec_str(profile->default_codec);
|
||||||
term->u.rtp.term_id = term_id;
|
term->u.rtp.term_id = term_id;
|
||||||
|
term->u.rtp.ptime = 20;
|
||||||
term->name = switch_core_strdup(term->pool, name);
|
term->name = switch_core_strdup(term->pool, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,6 +93,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
|
|||||||
static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id);
|
static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id);
|
||||||
static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg);
|
static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg);
|
||||||
static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf);
|
static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf);
|
||||||
|
static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event);
|
||||||
|
|
||||||
switch_state_handler_table_t crtp_state_handlers = {
|
switch_state_handler_table_t crtp_state_handlers = {
|
||||||
.on_init = channel_on_init,
|
.on_init = channel_on_init,
|
||||||
@ -104,6 +105,7 @@ switch_io_routines_t crtp_io_routines = {
|
|||||||
.read_frame = channel_read_frame,
|
.read_frame = channel_read_frame,
|
||||||
.write_frame = channel_write_frame,
|
.write_frame = channel_write_frame,
|
||||||
.receive_message = channel_receive_message,
|
.receive_message = channel_receive_message,
|
||||||
|
.receive_event = channel_receive_event,
|
||||||
.send_dtmf = channel_send_dtmf
|
.send_dtmf = channel_send_dtmf
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -395,6 +397,42 @@ static switch_status_t channel_send_dtmf(switch_core_session_t *session, const s
|
|||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static switch_bool_t compare_var(switch_event_t *event, switch_channel_t *channel, const char *varname)
|
||||||
|
{
|
||||||
|
const char *chan_val = switch_channel_get_variable_dup(channel, varname, SWITCH_FALSE, -1);
|
||||||
|
const char *event_val = switch_event_get_header(event, varname);
|
||||||
|
|
||||||
|
return strcasecmp(chan_val, event_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event)
|
||||||
|
{
|
||||||
|
const char *command = switch_event_get_header(event, "command");
|
||||||
|
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||||
|
|
||||||
|
if (!zstr(command) && !strcasecmp(command, "media_modify")) {
|
||||||
|
/* Compare parameters */
|
||||||
|
if (compare_var(event, channel, kREMOTEADDR) ||
|
||||||
|
compare_var(event, channel, kREMOTEPORT) ||
|
||||||
|
compare_var(event, channel, kLOCALADDR) ||
|
||||||
|
compare_var(event, channel, kLOCALPORT)) {
|
||||||
|
/* We need to reset the rtp session */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (compare_var(event, channel, kCODEC) ||
|
||||||
|
compare_var(event, channel, kPTIME) ||
|
||||||
|
compare_var(event, channel, kPT) ||
|
||||||
|
compare_var(event, channel, kRATE)) {
|
||||||
|
/* Reset codec */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Received unknown command [%s] in event.\n", !command ? "null" : command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg)
|
static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg)
|
||||||
{
|
{
|
||||||
crtp_private_t *tech_pvt = NULL;
|
crtp_private_t *tech_pvt = NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user