From 785a5851d00996e1ae8680a47a19074885559e0f Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthm@freeswitch.org>
Date: Tue, 20 Oct 2015 11:00:12 -0500
Subject: [PATCH] FS-8338 a few regressions that were relying on this bug to
 function properly in stereo situations

---
 src/switch_ivr_play_say.c | 10 ++++++----
 src/switch_pcm.c          |  2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/switch_ivr_play_say.c b/src/switch_ivr_play_say.c
index 27a40f537c..968c7d031d 100644
--- a/src/switch_ivr_play_say.c
+++ b/src/switch_ivr_play_say.c
@@ -1047,7 +1047,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 	switch_channel_t *channel = switch_core_session_get_channel(session);
 	int16_t *abuf = NULL;
 	switch_dtmf_t dtmf = { 0 };
-	uint32_t interval = 0, samples = 0, framelen, sample_start = 0;
+	uint32_t interval = 0, samples = 0, framelen, sample_start = 0, channels = 1;
 	uint32_t ilen = 0;
 	switch_size_t olen = 0, llen = 0;
 	switch_frame_t write_frame = { 0 };
@@ -1388,6 +1388,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 			write_frame.codec = switch_core_session_get_read_codec(session);
 			samples = read_impl.samples_per_packet;
 			framelen = read_impl.encoded_bytes_per_packet;
+			channels = read_impl.number_of_channels;
 			if (framelen == 0) {
 				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "%s cannot play or record native files with variable length data\n", switch_channel_get_name(channel));
 				
@@ -1410,6 +1411,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 			write_frame.codec = &codec;
 			samples = codec.implementation->samples_per_packet;
 			framelen = codec.implementation->decoded_bytes_per_packet;
+			channels = codec.implementation->number_of_channels;
 		}
 
 		last_native = test_native;
@@ -1417,8 +1419,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 		if (timer_name && !timer.samplecount) {
 			uint32_t len;
 
-			len = samples * 2;
-			if (switch_core_timer_init(&timer, timer_name, interval, samples / codec.implementation->number_of_channels, pool) != SWITCH_STATUS_SUCCESS) {
+			len = samples * 2 * channels;
+			if (switch_core_timer_init(&timer, timer_name, interval, samples, pool) != SWITCH_STATUS_SUCCESS) {
 				switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Setup timer failed!\n");
 				switch_core_codec_destroy(&codec);
 				switch_core_session_io_write_lock(session);
@@ -1444,7 +1446,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
 			switch_core_service_session(session);
 		}
 
-		ilen = samples;
+		ilen = samples * channels;
 
 		if (switch_event_create(&event, SWITCH_EVENT_PLAYBACK_START) == SWITCH_STATUS_SUCCESS) {
 			switch_channel_event_set_data(channel, event);
diff --git a/src/switch_pcm.c b/src/switch_pcm.c
index 12a9218371..cc034b6be7 100644
--- a/src/switch_pcm.c
+++ b/src/switch_pcm.c
@@ -321,7 +321,7 @@ static void mod_g711_load(switch_loadable_module_interface_t ** module_interface
 											 48000,	/* actual samples transferred per second */
 											 64000 * 6 * 2,	/* bits transferred per second */
 											 mpf * count,	/* number of microseconds per frame */
-											 spf * count * 6 * 2,	/* number of samples per frame */
+											 spf * count * 6,	/* number of samples per frame */
 											 bpf * count * 6 * 2,	/* number of bytes per frame decompressed */
 											 ebpf * count * 6 * 2,	/* number of bytes per frame compressed */
 											 2,	/* number of channels represented */