[Freeswitch-svn] [commit] r3897 - in freeswitch/trunk/src: . include mod/say/mod_say_en

Freeswitch SVN anthm at freeswitch.org
Tue Jan 2 18:08:26 EST 2007


Author: anthm
Date: Tue Jan  2 18:08:26 2007
New Revision: 3897

Modified:
   freeswitch/trunk/src/include/switch_types.h
   freeswitch/trunk/src/mod/say/mod_say_en/mod_say_en.c
   freeswitch/trunk/src/switch_ivr.c

Log:
say update

Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h	(original)
+++ freeswitch/trunk/src/include/switch_types.h	Tue Jan  2 18:08:26 2007
@@ -96,7 +96,8 @@
 typedef enum {
 	SSM_NA,
 	SSM_PRONOUNCED,
-	SSM_ITERATED
+	SSM_ITERATED,
+    SSM_COUNTED
 } switch_say_method_t;
 
 typedef enum {
@@ -112,6 +113,7 @@
 	SST_TELEPHONE_NUMBER,
 	SST_TELEPHONE_EXTENSION,
 	SST_URL,
+	SST_IP_ADDRESS,
 	SST_EMAIL_ADDRESS,
 	SST_POSTAL_ADDRESS,
 	SST_ACCOUNT_NUMBER,

Modified: freeswitch/trunk/src/mod/say/mod_say_en/mod_say_en.c
==============================================================================
--- freeswitch/trunk/src/mod/say/mod_say_en/mod_say_en.c	(original)
+++ freeswitch/trunk/src/mod/say/mod_say_en/mod_say_en.c	Tue Jan  2 18:08:26 2007
@@ -35,11 +35,11 @@
 static const char modname[] = "mod_say_en";
 
 
-#define say_num(num) {\
+#define say_num(num, t) {							\
 		char tmp[80];\
 		switch_status_t status;\
 		snprintf(tmp, sizeof(tmp), "%u", (unsigned)num);				\
-	if ((status = en_say_general_count(session, tmp, SST_ITEMS, SSM_PRONOUNCED, args)) != SWITCH_STATUS_SUCCESS) {\
+	if ((status = en_say_general_count(session, tmp, SST_ITEMS, t, args)) != SWITCH_STATUS_SUCCESS) {\
 		return status;\
 	}}\
 
@@ -52,7 +52,6 @@
 		}}\
 
 
-
 static switch_status_t en_spell(switch_core_session_t *session,
 								char *tosay,
 								switch_say_type_t type,
@@ -73,7 +72,8 @@
 	return SWITCH_STATUS_SUCCESS;
 }
 
-static switch_status_t play_group(int a,
+static switch_status_t play_group(switch_say_method_t method,
+								  int a,
 								  int b,
 								  int c,
 								  char *what,
@@ -96,7 +96,11 @@
 	}
 
 	if (c) {
-		say_file("digits/%d.wav", c);
+		if (method == SSM_COUNTED) {
+			say_file("digits/h-%d.wav", c);
+		} else {
+			say_file("digits/%d.wav", c);
+		}
 	}
 
 	if (what && (a || b || c)) {
@@ -144,7 +148,7 @@
 	assert(session != NULL);
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
-			
+
 	if (!(tosay = strip_commas(tosay, sbuf, sizeof(sbuf))) || strlen(tosay) > 9) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Parse Error!\n");
 		return SWITCH_STATUS_GENERR;
@@ -160,21 +164,25 @@
 	}
 
 	switch (method) {
+	case SSM_COUNTED:
 	case SSM_PRONOUNCED:
-		if ((status = play_group(places[8], places[7], places[6], "digits/million.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
+		if ((status = play_group(SSM_PRONOUNCED, places[8], places[7], places[6], "digits/million.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
 			return status;
 		}
-		if ((status = play_group(places[5], places[4], places[3], "digits/thousand.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
+		if ((status = play_group(SSM_PRONOUNCED, places[5], places[4], places[3], "digits/thousand.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
 			return status;
 		}
-		if ((status = play_group(places[2], places[1], places[0], NULL, session, args)) != SWITCH_STATUS_SUCCESS) {
+		if ((status = play_group(method, places[2], places[1], places[0], NULL, session, args)) != SWITCH_STATUS_SUCCESS) {
 			return status;
 		}
 		break;
 	case SSM_ITERATED:
-		for(x = 8; x >= 0; x--) {
-			if (places[x]) {
-				say_file("digits/%d.wav", places[x]);
+		{
+			char *p;
+			for (p = tosay; p && *p; p++) {
+				if (places[x] > -1) {
+					say_file("digits/%c.wav", *p);
+				}
 			}
 		}
 		break;
@@ -185,6 +193,53 @@
 }
 
 
+static switch_status_t en_ip(switch_core_session_t *session,
+								char *tosay,
+								switch_say_type_t type,
+								switch_say_method_t method,
+								switch_input_args_t *args)
+{
+	char *a, *b, *c, *d;
+	switch_status_t status = SWITCH_STATUS_SUCCESS;
+	if (!(a = strdup(tosay))) {
+		return SWITCH_STATUS_FALSE;
+	}
+
+	if (!(b = strchr(a, '.'))) {
+		status = SWITCH_STATUS_FALSE;
+		goto done;
+	}
+
+	*b++ = '\0';
+
+	if (!(c = strchr(b, '.'))) {
+		status = SWITCH_STATUS_FALSE;
+		goto done;
+	}
+
+	*c++ = '\0';
+
+	if (!(d = strchr(c, '.'))) {
+		status = SWITCH_STATUS_FALSE;
+		goto done;
+	}
+
+	*d++ = '\0';
+
+	say_num(atoi(a), method);
+	say_file("digits/dot.wav");
+	say_num(atoi(b), method);
+	say_file("digits/dot.wav");
+	say_num(atoi(c), method);
+	say_file("digits/dot.wav");
+	say_num(atoi(d), method);
+
+ done:
+	switch_safe_free(a);
+	return status;
+}
+
+
 static switch_status_t en_say_time(switch_core_session_t *session,
 								   char *tosay,
 								   switch_say_type_t type,
@@ -236,17 +291,17 @@
 		}
 
 		if (hours) {
-			say_num(hours);
+			say_num(hours, SSM_PRONOUNCED);
 			say_file("digits/hours.wav");
 		}
 
 		if (minutes) {
-			say_num(minutes);
+			say_num(minutes, SSM_PRONOUNCED);
 			say_file("digits/minutes.wav");
 		}
 
 		if (seconds) {
-			say_num(seconds);
+			say_num(seconds, SSM_PRONOUNCED);
 			say_file("digits/seconds.wav");
 		}
 
@@ -277,8 +332,8 @@
 	if (say_date) {
 		say_file("digits/day-%d.wav", tm.tm_wday);
 		say_file("digits/mon-%d.wav", tm.tm_mon);
-		say_num(tm.tm_mday);
-		say_num(tm.tm_year + 1900);
+		say_num(tm.tm_mday, SSM_COUNTED);
+		say_num(tm.tm_year + 1900, SSM_PRONOUNCED);
 	}
 
 	if (say_time) {
@@ -294,13 +349,13 @@
 			pm = 0;
 		}
 
-		say_num(hour);
+		say_num(hour, SSM_PRONOUNCED);
 
 		if (tm.tm_min > 9) {
-			say_num(tm.tm_min);
+			say_num(tm.tm_min, SSM_PRONOUNCED);
 		} else if (tm.tm_min) {
 			say_file("digits/oh.wav");
-			say_num(tm.tm_min);
+			say_num(tm.tm_min, SSM_PRONOUNCED);
 		} else {
 			say_file("digits/oclock.wav");
 		}
@@ -336,6 +391,9 @@
 	case SST_CURRENT_DATE_TIME:
 		say_cb = en_say_time;
 		break;
+	case SST_IP_ADDRESS:
+		say_cb = en_ip;
+		break;
 	case SST_NAME_SPELLED:
 	case SST_NAME_PHONETIC:
 		say_cb = en_spell;

Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c	(original)
+++ freeswitch/trunk/src/switch_ivr.c	Tue Jan  2 18:08:26 2007
@@ -960,7 +960,7 @@
 	char dtmf[128];
 	uint32_t interval = 0, samples = 0, framelen, sample_start = 0;
 	uint32_t ilen = 0;
-	switch_size_t olen = 0;
+	switch_size_t olen = 0, llen = 0;
 	switch_frame_t write_frame = {0};
 	switch_timer_t timer;
 	switch_core_thread_session_t thread_session;
@@ -1264,11 +1264,16 @@
 			last_speed = fh->speed;
 			continue;
 		}
-		
+		if (olen < llen) {
+            uint8_t *dp = (uint8_t *) write_frame.data;
+            memset(dp + (int)olen, 0, (int)(llen - olen));
+            olen = llen;
+        }
+
 		write_frame.datalen = (uint32_t)(olen * (asis ? 1 : 2));
 		write_frame.samples = (uint32_t)olen;
 
-		
+		llen = olen;
 
 
 #ifndef WIN32
@@ -4345,6 +4350,7 @@
     "N/A",
     "PRONOUNCED",
     "ITERATED",
+    "COUNTED",
     NULL
 };
 
@@ -4361,6 +4367,7 @@
 	"TELEPHONE_NUMBER",
 	"TELEPHONE_EXTENSION",
 	"URL",
+    "IP_ADDRESS",
 	"EMAIL_ADDRESS",
 	"POSTAL_ADDRESS",
 	"ACCOUNT_NUMBER",



More information about the Freeswitch-svn mailing list