diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 9e5493d07892e2edeb0dce1a6d93d62017ce24c6..33758d3d37e90c4d99a48f6fb6f0c2308cc83b72 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -4926,29 +4926,21 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) bridgepeer = ast_bridged_channel(p->owner); /* Turn on/off music on hold if we are holding/unholding */ - if (sin.sin_addr.s_addr && !sendonly) { - /* Update peer state */ - sip_peer_hold(p, 0); - if (bridgepeer) + if ((bridgepeer = ast_bridged_channel(p->owner))) { + if (sin.sin_addr.s_addr && !sendonly) { ast_queue_control(p->owner, AST_CONTROL_UNHOLD); - - /* Activate a re-invite */ - ast_queue_frame(p->owner, &ast_null_frame); - } else if (!sin.sin_addr.s_addr || sendonly) { - /* Update peer state */ - sip_peer_hold(p, 1); - /* No address for RTP, we're on hold */ - if (bridgepeer) + /* Activate a re-invite */ + ast_queue_frame(p->owner, &ast_null_frame); + } else if (!sin.sin_addr.s_addr || sendonly) { ast_queue_control_data(p->owner, AST_CONTROL_HOLD, S_OR(p->mohsuggest, NULL), !ast_strlen_zero(p->mohsuggest) ? strlen(p->mohsuggest) + 1 : 0); - - if (sendonly) - ast_rtp_stop(p->rtp); - /* RTCP needs to go ahead, even if we're on hold!!! */ - - /* Activate a re-invite */ - ast_queue_frame(p->owner, &ast_null_frame); + if (sendonly) + ast_rtp_stop(p->rtp); + /* RTCP needs to go ahead, even if we're on hold!!! */ + /* Activate a re-invite */ + ast_queue_frame(p->owner, &ast_null_frame); + } } /* Manager Hold and Unhold events must be generated, if necessary */ @@ -4961,7 +4953,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) "Uniqueid: %s\r\n", p->owner->name, p->owner->uniqueid); - + sip_peer_hold(p, 0); } ast_clear_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD); /* Clear both flags */ } else if (!sin.sin_addr.s_addr || sendonly ) { @@ -4979,6 +4971,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_ONEDIR); else if (sendonly == 2) /* Inactive stream */ ast_set_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD_INACTIVE); + sip_peer_hold(p, 1); } return 0; @@ -7800,7 +7793,7 @@ static void sip_peer_hold(struct sip_pvt *p, int hold) /* If they put someone on hold, increment the value... otherwise decrement it */ if (hold) peer->onHold++; - else + else if (hold > 0) peer->onHold--; /* Request device state update */