diff --git a/bridges/bridge_softmix.c b/bridges/bridge_softmix.c
index 850e3982cef917e3167d6880dc4632b624dc8557..bad3e43c442f6503749e79feb7e8f31525102219 100644
--- a/bridges/bridge_softmix.c
+++ b/bridges/bridge_softmix.c
@@ -357,6 +357,7 @@ static void set_softmix_bridge_data(int rate, int interval, struct ast_bridge_ch
 {
 	struct softmix_channel *sc = bridge_channel->tech_pvt;
 	struct ast_format *slin_format;
+	int setup_fail;
 
 	slin_format = ast_format_cache_get_slin_by_rate(rate);
 
@@ -386,17 +387,24 @@ static void set_softmix_bridge_data(int rate, int interval, struct ast_bridge_ch
 	sc->read_slin_format = slin_format;
 
 	/* Setup smoother */
-	ast_slinfactory_init_with_format(&sc->factory, slin_format);
+	setup_fail = ast_slinfactory_init_with_format(&sc->factory, slin_format);
 
 	/* set new read and write formats on channel. */
 	ast_channel_lock(bridge_channel->chan);
-	ast_set_read_format_path(bridge_channel->chan,
+	setup_fail |= ast_set_read_format_path(bridge_channel->chan,
 		ast_channel_rawreadformat(bridge_channel->chan), slin_format);
 	ast_channel_unlock(bridge_channel->chan);
-	ast_set_write_format(bridge_channel->chan, slin_format);
+	setup_fail |= ast_set_write_format(bridge_channel->chan, slin_format);
 
 	/* set up new DSP.  This is on the read side only right before the read frame enters the smoother.  */
 	sc->dsp = ast_dsp_new_with_rate(rate);
+	if (setup_fail || !sc->dsp) {
+		/* Bad news.  Could not setup the channel for softmix. */
+		ast_mutex_unlock(&sc->lock);
+		ast_bridge_channel_leave_bridge(bridge_channel, BRIDGE_CHANNEL_STATE_END, 0);
+		return;
+	}
+
 	/* we want to aggressively detect silence to avoid feedback */
 	if (bridge_channel->tech_args.talking_threshold) {
 		ast_dsp_set_threshold(sc->dsp, bridge_channel->tech_args.talking_threshold);
@@ -616,7 +624,10 @@ static void softmix_bridge_write_voice(struct ast_bridge *bridge, struct ast_bri
 		ast_channel_unlock(bridge_channel->chan);
 	}
 
-	ast_dsp_silence_with_energy(sc->dsp, frame, &totalsilence, &cur_energy);
+	/* The channel will be leaving soon if there is no dsp. */
+	if (sc->dsp) {
+		ast_dsp_silence_with_energy(sc->dsp, frame, &totalsilence, &cur_energy);
+	}
 
 	if (bridge->softmix.video_mode.mode == AST_BRIDGE_VIDEO_MODE_TALKER_SRC) {
 		int cur_slot = sc->video_talker.energy_history_cur_slot;