diff --git a/src/channels/chan_voicemngr.c b/src/channels/chan_voicemngr.c index d51d5cdfc0ae6267e08f07863c84f6210be64f6f..81f5184acd03a8ca08354ae896a92deac402a638 100644 --- a/src/channels/chan_voicemngr.c +++ b/src/channels/chan_voicemngr.c @@ -772,6 +772,7 @@ static void chan_voicemngr_modify_codec(struct chan_voicemngr_subchannel *sub) { if(bridge){ AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) { if ( strcmp(ast_channel_name(bridge_channel->chan), ast_channel_name(sub->owner)) ){ + ast_channel_unlock(bridge_channel->chan); bridged_chan = ast_channel_get_by_name(ast_channel_name(bridge_channel->chan)); break; } @@ -870,9 +871,11 @@ static int chan_voicemngr_indicate(struct ast_channel *ast, int condition, const switch(condition) { case AST_CONTROL_UNHOLD: - pvt_lock(sub->parent, "indicate"); + ast_channel_unlock(ast); + chan_voicemngr_lock_pvts(); chan_voicemngr_stop_dialtone(sub->parent); // Play a beep when unholding. + ast_channel_lock(ast); play_bridge_channel = ast_channel_get_bridge_channel(ast); ast_bridge_channel_queue_playfile(play_bridge_channel, NULL, "beep", NULL); ao2_ref(play_bridge_channel, -1); @@ -889,13 +892,14 @@ static int chan_voicemngr_indicate(struct ast_channel *ast, int condition, const astFrame.subclass.integer = AST_CONTROL_SRCUPDATE; ast_bridge_queue_everyone_else(myBridge, NULL, &astFrame); */ - pvt_unlock(sub->parent); + chan_voicemngr_unlock_pvts(); break; case AST_CONTROL_UPDATE_RTP_PEER: case AST_CONTROL_SRCUPDATE: case AST_CONTROL_SRCCHANGE: - pvt_lock(sub->parent, "indicate"); + ast_channel_unlock(sub->owner); + chan_voicemngr_lock_pvts(); sub->codec = -1; if (sub->channel_state == RINGBACK) endpt_signal(sub->parent->line_id, "ringback", "off", NULL); @@ -906,9 +910,11 @@ static int chan_voicemngr_indicate(struct ast_channel *ast, int condition, const // do not re-sync if the call has already been established sub->updated_codec = 1; } + pvt_unlock(sub->parent); ast_log(LOG_NOTICE, "SRC update: sub->sip_client_id: %d, sub->updated_codec: %d\n", sub->sip_client_id, sub->updated_codec); chan_voicemngr_modify_codec(sub); + chan_voicemngr_unlock_pvts(); break; case AST_CONTROL_RINGING: pvt_lock(sub->parent, "indicate");