@@ -2546,10 +2546,21 @@ void ast_channel_clear_softhangup(struct ast_channel *chan, int flag) /*! \brief Softly hangup a channel, don't lock */ int ast_softhangup_nolock(struct ast_channel *chan, int cause) { ast_debug(1, "Soft-Hanging (%#04x) up channel '%s'\n", (unsigned)cause, ast_channel_name(chan)); + + /* Stop monitoring */ + if (ast_channel_monitor(chan)) { + ast_channel_monitor(chan)->stop(chan, 0); + } + + /* If there is native format music-on-hold state, free it */ + if (ast_channel_music_state(chan)) { + ast_moh_cleanup(chan); + } + /* Inform channel driver that we need to be hung up, if it cares */ ast_channel_softhangup_internal_flag_add(chan, cause); ast_queue_frame(chan, &ast_null_frame); /* Interrupt any poll call or such */ if (ast_test_flag(ast_channel_flags(chan), AST_FLAG_BLOCKING))