diff --git a/main/audiohook.c b/main/audiohook.c
index 8a0055e4b46be389278323a9baccdcd3a629ca17..836ae0496fd617cb36a47bc159cb33c4d46f74df 100644
--- a/main/audiohook.c
+++ b/main/audiohook.c
@@ -156,6 +156,11 @@ int ast_audiohook_destroy(struct ast_audiohook *audiohook)
 	return 0;
 }
 
+#define SHOULD_MUTE(hook, dir) \
+	((ast_test_flag(hook, AST_AUDIOHOOK_MUTE_READ) && (dir == AST_AUDIOHOOK_DIRECTION_READ)) || \
+	(ast_test_flag(hook, AST_AUDIOHOOK_MUTE_WRITE) && (dir == AST_AUDIOHOOK_DIRECTION_WRITE)) || \
+	(ast_test_flag(hook, AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE) == (AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE)))
+
 /*! \brief Writes a frame into the audiohook structure
  * \param audiohook Audiohook structure
  * \param direction Direction the audio frame came from
@@ -171,7 +176,6 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo
 	int our_factory_ms;
 	int other_factory_samples;
 	int other_factory_ms;
-	int muteme = 0;
 
 	/* Update last feeding time to be current */
 	*rwtime = ast_tvnow();
@@ -197,17 +201,6 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo
 		ast_slinfactory_flush(other_factory);
 	}
 
-	/* swap frame data for zeros if mute is required */
-	if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_READ) && (direction == AST_AUDIOHOOK_DIRECTION_READ)) ||
-		(ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE) && (direction == AST_AUDIOHOOK_DIRECTION_WRITE)) ||
-		(ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE) == (AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE))) {
-			muteme = 1;
-	}
-
-	if (muteme && frame->datalen > 0) {
-		ast_frame_clear(frame);
-	}
-
 	/* Write frame out to respective factory */
 	ast_slinfactory_feed(factory, frame);
 
@@ -246,8 +239,11 @@ static struct ast_frame *audiohook_read_frame_single(struct ast_audiohook *audio
 		return NULL;
 	}
 
-	/* If a volume adjustment needs to be applied apply it */
-	if (vol) {
+	if (SHOULD_MUTE(audiohook, direction)) {
+		/* Swap frame data for zeros if mute is required */
+		ast_frame_clear(&frame);
+	} else if (vol) {
+		/* If a volume adjustment needs to be applied apply it */
 		ast_frame_adjust_volume(&frame, vol);
 	}
 
@@ -296,8 +292,12 @@ static struct ast_frame *audiohook_read_frame_both(struct ast_audiohook *audioho
 	if (usable_read) {
 		if (ast_slinfactory_read(&audiohook->read_factory, buf1, samples)) {
 			read_buf = buf1;
-			/* Adjust read volume if need be */
-			if (audiohook->options.read_volume) {
+
+			if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_READ))) {
+				/* Clear the frame data if we are muting */
+				memset(buf1, 0, sizeof(buf1));
+			} else if (audiohook->options.read_volume) {
+				/* Adjust read volume if need be */
 				adjust_value = abs(audiohook->options.read_volume);
 				for (count = 0; count < samples; count++) {
 					if (audiohook->options.read_volume > 0) {
@@ -316,8 +316,12 @@ static struct ast_frame *audiohook_read_frame_both(struct ast_audiohook *audioho
 	if (usable_write) {
 		if (ast_slinfactory_read(&audiohook->write_factory, buf2, samples)) {
 			write_buf = buf2;
-			/* Adjust write volume if need be */
-			if (audiohook->options.write_volume) {
+
+			if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE))) {
+				/* Clear the frame data if we are muting */
+				memset(buf2, 0, sizeof(buf2));
+			} else if (audiohook->options.write_volume) {
+				/* Adjust write volume if need be */
 				adjust_value = abs(audiohook->options.write_volume);
 				for (count = 0; count < samples; count++) {
 					if (audiohook->options.write_volume > 0) {