diff --git a/apps/app_mixmonitor.c b/apps/app_mixmonitor.c index 9f147768dd..022df02b61 100644 --- a/apps/app_mixmonitor.c +++ b/apps/app_mixmonitor.c @@ -319,6 +319,8 @@ struct mixmonitor { char *name; unsigned int flags; struct ast_autochan *autochan; + struct ast_channel *last_chan; + int last_chan_is_bridged; struct mixmonitor_ds *mixmonitor_ds; /* the below string fields describe data used for creating voicemails from the recording */ @@ -638,13 +640,28 @@ static void mixmonitor_save_prep(struct mixmonitor *mixmonitor, char *filename, } } -static int mixmonitor_autochan_is_bridged(struct ast_autochan *autochan) +static int mixmonitor_autochan_is_bridged(struct mixmonitor *mixmonitor) { + struct ast_autochan *autochan = mixmonitor->autochan; int is_bridged; + if (autochan->chan != mixmonitor->last_chan) { + mixmonitor->last_chan = NULL; + mixmonitor->last_chan_is_bridged = 0; + } + + /* Shortcut that assumes that once a channel is bridged it never + * becomes unbridged. */ + if (mixmonitor->last_chan_is_bridged) { + return 1; + } + ast_autochan_channel_lock(autochan); is_bridged = ast_channel_is_bridged(autochan->chan); + mixmonitor->last_chan = autochan->chan; + mixmonitor->last_chan_is_bridged = is_bridged; ast_autochan_channel_unlock(autochan); + return is_bridged; } @@ -705,7 +722,7 @@ static void *mixmonitor_thread(void *obj) ast_audiohook_unlock(&mixmonitor->audiohook); if (!ast_test_flag(mixmonitor, MUXFLAG_BRIDGED) - || mixmonitor_autochan_is_bridged(mixmonitor->autochan)) { + || mixmonitor_autochan_is_bridged(mixmonitor)) { ast_mutex_lock(&mixmonitor->mixmonitor_ds->lock); /* Write out the frame(s) */