Revision
14128
Author
anthm
Date
2009-07-03 16:55:50 -0500 (Fri, 03 Jul 2009)

Log Message

fix recording timing issue

Modified Paths

Diff

Modified: freeswitch/trunk/src/switch_core_media_bug.c (14127 => 14128)


--- freeswitch/trunk/src/switch_core_media_bug.c	2009-07-03 18:47:19 UTC (rev 14127)
+++ freeswitch/trunk/src/switch_core_media_bug.c	2009-07-03 21:55:50 UTC (rev 14128)
@@ -104,7 +104,7 @@
 
 SWITCH_DECLARE(switch_status_t) switch_core_media_bug_read(switch_media_bug_t *bug, switch_frame_t *frame, switch_bool_t fill)
 {
-	switch_size_t bytes = 0, datalen = 0;
+	switch_size_t bytes = 0, datalen = 0, ttl = 0;
 	int16_t *dp, *fp;
 	uint32_t x;
 	size_t rlen = 0;
@@ -126,11 +126,13 @@
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s Buffer Error\n", switch_channel_get_name(bug->session->channel));
 		return SWITCH_STATUS_FALSE;
 	}
-	
+
+	frame->flags = 0;
 	frame->datalen = 0;
 	
 	switch_mutex_lock(bug->read_mutex);
 	frame->datalen = (uint32_t) switch_buffer_read(bug->raw_read_buffer, frame->data, bytes);
+	ttl += frame->datalen;
 	if (fill && frame->datalen < bytes) {
 		memset(((unsigned char *)frame->data) + frame->datalen, 0, bytes - frame->datalen);
 		frame->datalen = bytes;
@@ -141,6 +143,7 @@
 		switch_assert(bug->raw_write_buffer);
 		switch_mutex_lock(bug->write_mutex);
 		datalen = (uint32_t) switch_buffer_read(bug->raw_write_buffer, bug->data, bytes);
+		ttl += datalen;
 		if (fill && datalen < bytes) {
 			memset(((unsigned char *)bug->data) + datalen, 0, bytes - datalen);
 			datalen = bytes;
@@ -192,6 +195,10 @@
 		}
 	}
 
+	if (!ttl) {
+		switch_set_flag(frame, SFF_CNG);
+	}
+
 	frame->datalen = bytes;
 	frame->samples = bytes / sizeof(int16_t);
 	frame->rate = read_impl.actual_samples_per_second;

Modified: freeswitch/trunk/src/switch_ivr_async.c (14127 => 14128)


--- freeswitch/trunk/src/switch_ivr_async.c	2009-07-03 18:47:19 UTC (rev 14127)
+++ freeswitch/trunk/src/switch_ivr_async.c	2009-07-03 21:55:50 UTC (rev 14128)
@@ -486,11 +486,12 @@
 			frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
 
 			if (switch_channel_test_flag(channel, CF_ANSWERED) || !switch_core_media_bug_test_flag(bug, SMBF_RECORD_ANSWER_REQ)) {
-				int loops = LEAD_IN;
 				while (switch_core_media_bug_read(bug, &frame, SWITCH_TRUE) == SWITCH_STATUS_SUCCESS && frame.datalen) {
 					len = (switch_size_t) frame.datalen / 2;
 					switch_core_file_write(rh->fh, data, &len);
-					if (!--loops) break;
+					if (switch_test_flag((&frame), SFF_CNG)) {
+						break;
+					}
 				}
 			}
 			rh->lead_in = LEAD_IN;