From f7bbb688471431baf59e3be4087d427d2245521b Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthony.minessale@gmail.com>
Date: Sat, 26 May 2007 03:27:31 +0000
Subject: [PATCH] analog update

git-svn-id: http://svn.openzap.org/svn/openzap/trunk@155 a93c3328-9c30-0410-af19-c9cd2b2d52af
---
 libs/openzap/src/zap_analog.c | 86 +++++++++++++++++------------------
 libs/openzap/src/zap_buffer.c |  1 +
 libs/openzap/src/zap_io.c     |  6 +--
 3 files changed, 47 insertions(+), 46 deletions(-)

diff --git a/libs/openzap/src/zap_analog.c b/libs/openzap/src/zap_analog.c
index 5852dd8a02..21702cafed 100644
--- a/libs/openzap/src/zap_analog.c
+++ b/libs/openzap/src/zap_analog.c
@@ -93,7 +93,8 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 	zap_channel_t *closed_chan;
 	uint32_t state_counter = 0, elapsed = 0, interval = 0, last_digit = 0, indicate = 0;
 	zap_sigmsg_t sig;
-	
+	zap_status_t status;
+
 	zap_log(ZAP_LOG_DEBUG, "ANALOG CHANNEL thread starting.\n");
 
 	if (zap_channel_open_chan(chan) != ZAP_SUCCESS) {
@@ -101,10 +102,12 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 	}
 
 	if (zap_buffer_create(&dt_buffer, 1024, 3192, 0) != ZAP_SUCCESS) {
+		snprintf(chan->last_error, sizeof(chan->last_error), "memory error!");
 		goto done;
 	}
 
 	if (zap_channel_command(chan, ZAP_COMMAND_ENABLE_TONE_DETECT, &tt) != ZAP_SUCCESS) {
+		snprintf(chan->last_error, sizeof(chan->last_error), "error initilizing tone detector!");
 		goto done;
 	}
 
@@ -143,18 +146,17 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 			case ZAP_CHANNEL_STATE_UP:
 			case ZAP_CHANNEL_STATE_IDLE:
 				{
-
 					zap_sleep(interval);
 					continue;
 				}
 				break;
 			default:
 				break;
-
 			}
 		} else {
-
 			zap_clear_flag_locked(chan, ZAP_CHANNEL_STATE_CHANGE);
+			indicate = 0;
+			state_counter = 0;
 			switch(chan->state) {
 			case ZAP_CHANNEL_STATE_UP:
 				{
@@ -191,7 +193,6 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 					indicate = 1;
 				}
 				break;
-
 			case ZAP_CHANNEL_STATE_RING:
 				{
 					zap_buffer_zero(dt_buffer);
@@ -199,7 +200,6 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 					indicate = 1;
 				}
 				break;
-				
 			case ZAP_CHANNEL_STATE_BUSY:
 				{
 					zap_buffer_zero(dt_buffer);
@@ -207,7 +207,6 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 					indicate = 1;
 				}
 				break;
-
 			case ZAP_CHANNEL_STATE_ATTN:
 				{
 					zap_buffer_zero(dt_buffer);
@@ -216,13 +215,9 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 				}
 				break;
 			default:
-				indicate = 0;
 				break;
 			}
-
-			state_counter = 0;
 		}
-		
 
 		if ((dlen = zap_channel_dequeue_dtmf(chan, dtmf + dtmf_offset, sizeof(dtmf) - strlen(dtmf)))) {
 			if (chan->state == ZAP_CHANNEL_STATE_DIALTONE || chan->state == ZAP_CHANNEL_STATE_COLLECT) {
@@ -241,55 +236,59 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 			last_digit = 0;
 		}
 		
-		if (zap_channel_wait(chan, &flags, -1) == ZAP_FAIL) {
+		if (zap_channel_wait(chan, &flags, interval * 2) == ZAP_FAIL) {
 			goto done;
 		}
 		
-		if (flags & ZAP_READ) {
-			if (zap_channel_read(chan, frame, &len) == ZAP_SUCCESS) {
-				if (chan->effective_codec != ZAP_CODEC_SLIN) {
-					len *= 2;
-				}
-				rlen = zap_buffer_read_loop(dt_buffer, frame, len);
-				
-				if (indicate) {		
-					zio_codec_t codec_func = NULL;
-					zap_status_t status;
-					
-					if (chan->effective_codec != ZAP_CODEC_SLIN) {
-						if (chan->native_codec == ZAP_CODEC_ULAW) {
-							codec_func = zio_slin2ulaw;
-						} else if (chan->native_codec == ZAP_CODEC_ALAW) {
-							codec_func = zio_slin2alaw;
-						}
-						
-						if (codec_func) {
-							status = codec_func(frame, sizeof(frame), &rlen);
-						} else {
-							snprintf(chan->last_error, sizeof(chan->last_error), "codec error!");
-							status = ZAP_FAIL;
-						}
-					}
+		if (!(flags & ZAP_READ)) {
+			continue;
+		}
 
-					zap_channel_write(chan, frame, &rlen);
-				}
+		if (zap_channel_read(chan, frame, &len) != ZAP_SUCCESS) {
+			goto done;
+		}
+		
+		if (!indicate) {
+			continue;
+		}
+
+		if (chan->effective_codec != ZAP_CODEC_SLIN) {
+			len *= 2;
+		}
+		
+		rlen = zap_buffer_read_loop(dt_buffer, frame, len);					
+		
+		if (chan->effective_codec != ZAP_CODEC_SLIN) {
+			zio_codec_t codec_func = NULL;
+
+			if (chan->native_codec == ZAP_CODEC_ULAW) {
+				codec_func = zio_slin2ulaw;
+			} else if (chan->native_codec == ZAP_CODEC_ALAW) {
+				codec_func = zio_slin2alaw;
+			}
+			
+			if (codec_func) {
+				status = codec_func(frame, sizeof(frame), &rlen);
 			} else {
+				snprintf(chan->last_error, sizeof(chan->last_error), "codec error!");
 				goto done;
 			}
 		}
-	}
-	
- done:
 
+		zap_channel_write(chan, frame, &rlen);
+	}
+
+ done:
 
 	closed_chan = chan;
 	zap_channel_close(&chan);
-
+	
 	zap_channel_command(closed_chan, ZAP_COMMAND_SET_NATIVE_CODEC, NULL);
 
 	if (ts.buffer) {
 		teletone_destroy_session(&ts);
 	}
+
 	if (dt_buffer) {
 		zap_buffer_destroy(&dt_buffer);
 	}
@@ -297,6 +296,7 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
 	zap_clear_flag(closed_chan, ZAP_CHANNEL_INTHREAD);
 	
 	zap_log(ZAP_LOG_DEBUG, "ANALOG CHANNEL thread ended.\n");
+
 	return NULL;
 }
 
diff --git a/libs/openzap/src/zap_buffer.c b/libs/openzap/src/zap_buffer.c
index 63ae360414..d4edbe6e29 100644
--- a/libs/openzap/src/zap_buffer.c
+++ b/libs/openzap/src/zap_buffer.c
@@ -242,6 +242,7 @@ void zap_buffer_zero(zap_buffer_t *buffer)
 	assert(buffer->data != NULL);
 
 	buffer->used = 0;
+	buffer->actually_used = 0;
 	buffer->head = buffer->data;
 }
 
diff --git a/libs/openzap/src/zap_io.c b/libs/openzap/src/zap_io.c
index a651b624a2..6041844a0e 100644
--- a/libs/openzap/src/zap_io.c
+++ b/libs/openzap/src/zap_io.c
@@ -1081,7 +1081,7 @@ zap_status_t zap_channel_read(zap_channel_t *zchan, void *data, zap_size_t *data
 	}
 
 	if (zap_test_flag(zchan, ZAP_CHANNEL_DTMF_DETECT)) {
-		uint8_t sln_buf[2048] = {0};
+		uint8_t sln_buf[1024] = {0};
 		int16_t *sln;
 		zap_size_t slen = 0;
 		char digit_str[80] = "";
@@ -1094,11 +1094,11 @@ zap_status_t zap_channel_read(zap_channel_t *zchan, void *data, zap_size_t *data
 			uint32_t i;
 			uint8_t *lp = data;
 
-			slen = sizeof(sln_buf);
+			slen = sizeof(sln_buf) / 2;
 			if (len > slen) {
 				len = slen;
 			}
-			
+
 			sln = (int16_t *) sln_buf;
 			for(i = 0; i < len; i++) {
 				if (zchan->effective_codec == ZAP_CODEC_ULAW) {