diff --git a/src/mod/formats/mod_shout/mod_shout.c b/src/mod/formats/mod_shout/mod_shout.c
index ff8ff12c46..a817fad148 100644
--- a/src/mod/formats/mod_shout/mod_shout.c
+++ b/src/mod/formats/mod_shout/mod_shout.c
@@ -248,6 +248,7 @@ static size_t decode_fd(shout_context_t *context, void *data, size_t bytes)
 		x = 0;
 
 		if (inlen < bytes) {
+			bytes = inlen;
 			done = 1;
 		}
 
diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c
index 5182f4c39c..2bd6039862 100644
--- a/src/switch_ivr_play_say.c
+++ b/src/switch_ivr_play_say.c
@@ -729,6 +729,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 	const char *timer_name;
 	const char *prebuf;
 	const char *alt = NULL;
+	int eof = 0;
+	switch_size_t bread = 0;
 
 	switch_channel_pre_answer(channel);
 
@@ -953,13 +955,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 
 		if (!switch_channel_ready(channel)) {
 			status = SWITCH_STATUS_FALSE;
-			break;
+			break; 
 		}
 
 		if (switch_channel_test_flag(channel, CF_BREAK)) {
 			switch_channel_clear_flag(channel, CF_BREAK);
 			status = SWITCH_STATUS_BREAK;
-			break;
+			break; 
 		}
 
 		if (switch_core_session_private_event_count(session)) {
@@ -975,7 +977,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 				if (!args->input_callback && !args->buf) {
 					status = SWITCH_STATUS_BREAK;
 					done = 1;
-					break;
+					break; 
 				}
 				switch_channel_dequeue_dtmf(channel, &dtmf);
 				if (args->input_callback) {
@@ -997,7 +999,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 
 			if (status != SWITCH_STATUS_SUCCESS) {
 				done = 1;
-				break;
+				break; 
 			}
 		}
 
@@ -1008,20 +1010,28 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 			memset(abuf, 0, framelen);
 			olen = ilen;
 			do_speed = 0;
-		} else if (fh->sp_audio_buffer && (switch_buffer_inuse(fh->sp_audio_buffer) > (switch_size_t) (framelen))) {
-			switch_buffer_read(fh->sp_audio_buffer, abuf, framelen);
-			olen = asis ? framelen : ilen;
+		} else if (fh->sp_audio_buffer && (eof || (switch_buffer_inuse(fh->sp_audio_buffer) > (switch_size_t) (framelen)))) {
+			if (!(bread = switch_buffer_read(fh->sp_audio_buffer, abuf, framelen))) {
+				break; 
+			}
+			olen = asis ? bread : bread / 2;
 			do_speed = 0;
-		} else if (fh->audio_buffer && (switch_buffer_inuse(fh->audio_buffer) > (switch_size_t) (framelen))) {
-			switch_buffer_read(fh->audio_buffer, abuf, framelen);
-			olen = asis ? framelen : ilen;
+		} else if (fh->audio_buffer && (eof || (switch_buffer_inuse(fh->audio_buffer) > (switch_size_t) (framelen)))) {
+			if (!(bread = switch_buffer_read(fh->audio_buffer, abuf, framelen))) {
+				break; 
+			}
+			olen = asis ? bread : bread / 2;
 		} else {
+			if (eof) {
+				break;
+			}
 			olen = FILE_STARTSAMPLES;
 			if (!asis) {
 				olen /= 2;
 			}
 			if (switch_core_file_read(fh, abuf, &olen) != SWITCH_STATUS_SUCCESS) {
-				break;
+				eof++;
+				continue;
 			}
 			switch_buffer_write(fh->audio_buffer, abuf, asis ? olen : olen * 2);
 			olen = switch_buffer_read(fh->audio_buffer, abuf, framelen);
@@ -1031,7 +1041,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 		}
 
 		if (done || olen <= 0) {
-			break;
+			break; 
 		}
 
 		if (!asis) {
@@ -1134,16 +1144,16 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 			continue;
 		} else if (status != SWITCH_STATUS_SUCCESS) {
 			done = 1;
-			break;
+			break; 
 		}
 
 		if (done) {
-			break;
+			break; 
 		}
 
 		if (timer_name) {
 			if (switch_core_timer_next(&timer) != SWITCH_STATUS_SUCCESS) {
-				break;
+				break; 
 			}
 		} else {				/* time off the channel (if you must) */
 			switch_frame_t *read_frame;
@@ -1155,7 +1165,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 			tstatus = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
 
 			if (!SWITCH_READ_ACCEPTABLE(tstatus)) {
-				break;
+				break; 
 			}
 
 			if (args && (args->read_frame_callback)) {
@@ -1166,7 +1176,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 				}
 				switch_clear_flag(fh, SWITCH_FILE_CALLBACK);
 				if (!ok) {
-					break;
+					break; 
 				}
 			}
 		}