Index: channels/chan_sip.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v retrieving revision 1.781 diff -u -r1.781 chan_sip.c --- channels/chan_sip.c 15 Jul 2005 23:00:46 -0000 1.781 +++ channels/chan_sip.c 18 Jul 2005 17:57:41 -0000 @@ -3342,18 +3342,8 @@ /* We have a bridge */ /* Turn on/off music on hold if we are holding/unholding */ if (sin.sin_addr.s_addr && !sendonly) { - ast_moh_stop(bridgepeer); - /* Indicate UNHOLD status to the other channel */ - ast_indicate(bridgepeer, AST_CONTROL_UNHOLD); - append_history(p, "Unhold", req->data); - if (callevents && ast_test_flag(p, SIP_CALL_ONHOLD)) { - manager_event(EVENT_FLAG_CALL, "Unhold", - "Channel: %s\r\n" - "Uniqueid: %s\r\n", - p->owner->name, - p->owner->uniqueid); - } - ast_clear_flag(p, SIP_CALL_ONHOLD); + ast_moh_stop(bridgepeer); + /* Somehow, we need to check if we need to re-invite here */ /* If this call had a external native bridge, it's broken now and we need to start all over again. @@ -3369,22 +3359,39 @@ } else { /* No address for RTP, we're on hold */ - append_history(p, "Hold", req->data); - if (callevents && !ast_test_flag(p, SIP_CALL_ONHOLD)) { - manager_event(EVENT_FLAG_CALL, "Hold", - "Channel: %s\r\n" - "Uniqueid: %s\r\n", - p->owner->name, - p->owner->uniqueid); - } - ast_set_flag(p, SIP_CALL_ONHOLD); - /* Indicate HOLD status to the other channel */ - ast_indicate(bridgepeer, AST_CONTROL_HOLD); ast_moh_start(bridgepeer, NULL); if (sendonly) ast_rtp_stop(p->rtp); } } + + /* Manager Hold and Unhold events must be generated, if necessary */ + if (sin.sin_addr.s_addr && !sendonly) { + append_history(p, "Unhold", req->data); + + if (callevents && ast_test_flag(p, SIP_CALL_ONHOLD)) { + manager_event(EVENT_FLAG_CALL, "Unhold", + "Channel: %s\r\n" + "Uniqueid: %s\r\n", + p->owner->name, + p->owner->uniqueid); + + } + ast_clear_flag(p, SIP_CALL_ONHOLD); + } else { + /* No address for RTP, we're on hold */ + append_history(p, "Hold", req->data); + + if (callevents && !ast_test_flag(p, SIP_CALL_ONHOLD)) { + manager_event(EVENT_FLAG_CALL, "Hold", + "Channel: %s\r\n" + "Uniqueid: %s\r\n", + p->owner->name, + p->owner->uniqueid); + } + ast_set_flag(p, SIP_CALL_ONHOLD); + } + return 0; } Index: channels/chan_iax2.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v retrieving revision 1.320 diff -u -r1.320 chan_iax2.c --- channels/chan_iax2.c 15 Jul 2005 23:00:46 -0000 1.320 +++ channels/chan_iax2.c 18 Jul 2005 17:57:44 -0000 @@ -6556,6 +6556,15 @@ break; case IAX_COMMAND_QUELCH: if (iaxs[fr.callno]->state & IAX_STATE_STARTED) { + /* Generate Manager Hold event, if necessary*/ + if (iaxs[fr.callno]->owner) { + manager_event(EVENT_FLAG_CALL, "Hold", + "Channel: %s\r\n" + "Uniqueid: %s\r\n", + iaxs[fr.callno]->owner->name, + iaxs[fr.callno]->owner->uniqueid); + } + ast_set_flag(iaxs[fr.callno], IAX_QUELCH); if (ies.musiconhold) { if (iaxs[fr.callno]->owner && @@ -6564,8 +6573,17 @@ } } break; - case IAX_COMMAND_UNQUELCH: + case IAX_COMMAND_UNQUELCH: if (iaxs[fr.callno]->state & IAX_STATE_STARTED) { + /* Generate Manager Unhold event, if necessary*/ + if (iaxs[fr.callno]->owner && ast_test_flag(iaxs[fr.callno], IAX_QUELCH)) { + manager_event(EVENT_FLAG_CALL, "Unhold", + "Channel: %s\r\n" + "Uniqueid: %s\r\n", + iaxs[fr.callno]->owner->name, + iaxs[fr.callno]->owner->uniqueid); + } + ast_clear_flag(iaxs[fr.callno], IAX_QUELCH); if (iaxs[fr.callno]->owner && ast_bridged_channel(iaxs[fr.callno]->owner))