diff --git a/main/audiohook.c b/main/audiohook.c
index bb510e333f55637cc9424a3b7dd6216fabc1e8b7..a1d658ce70e589841f038e3b254c5b0af2ee1eae 100644
--- a/main/audiohook.c
+++ b/main/audiohook.c
@@ -311,25 +311,26 @@ static struct ast_frame *audiohook_read_frame_both(struct ast_audiohook *audioho
 	ast_debug(1, "Failed to get %d samples from write factory %p\n", (int)samples, &audiohook->write_factory);
 
 	/* Basically we figure out which buffer to use... and if mixing can be done here */
-	if (!read_buf && !write_buf)
-		return NULL;
-
-	if (read_buf) {
-		final_buf = buf1;
-		frame.data.ptr = final_buf;
+	if (read_buf && read_reference) {
+		frame.data.ptr = buf1;
 		*read_reference = ast_frdup(&frame);
 	}
-
-	if (write_buf) {
-		final_buf = buf2;
-		frame.data.ptr = final_buf;
+	if (write_buf && write_reference) {
+		frame.data.ptr = buf2;
 		*write_reference = ast_frdup(&frame);
 	}
 
 	if (read_buf && write_buf) {
-		for (i = 0, data1 = read_buf, data2 = write_buf; i < samples; i++, data1++, data2++)
+		for (i = 0, data1 = read_buf, data2 = write_buf; i < samples; i++, data1++, data2++) {
 			ast_slinear_saturated_add(data1, data2);
+		}
+		final_buf = buf1;
+	} else if (read_buf) {
 		final_buf = buf1;
+	} else if (write_buf) {
+		final_buf = buf2;
+	} else {
+		return NULL;
 	}
 
 	/* Make the final buffer part of the frame, so it gets duplicated fine */