I have the necessity to hangup a channel inside a media bug callback in a my custom module.
Currently, what I do is:
static switch_bool_t my_media_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
{
struct my_custom_helper * my_helper = (struct my_custom_helper *) user_data;
switch (type) {
case SWITCH_ABC_TYPE_READ_REPLACE:
case SWITCH_ABC_TYPE_WRITE_REPLACE:
{
switch_frame_t *frame;
if (sth->read) {
frame = switch_core_media_bug_get_read_replace_frame(bug);
} else {
frame = switch_core_media_bug_get_write_replace_frame(bug);
}
/*
....
media analysis
....
*/
if (to_hangup) {
switch_channel_t *channel = switch_core_session_get_channel(my_helper->session);
if (channel) {
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
}
}
}
return SWITCH_TRUE;
}
The dropped channel is a b-leg, previously bridged with an a-leg (incoming call).
Probably in my code there is an error because the code works fine and the channel is correctly dropped but inside Freeswitch remain some "zombies" calls.
If I issue a fs_cli "show channels" I see that there are some calls dropped by my module showed in "ACTIVE" state.
What is wrong with my channel hangup?
Thanks in advance
Stephen