[Freeswitch-trunk] [commit] r3807 - in freeswitch/trunk/src: . include mod/say/mod_say_en
Freeswitch SVN
anthm at freeswitch.org
Fri Dec 22 17:33:49 EST 2006
Author: anthm
Date: Fri Dec 22 17:33:48 2006
New Revision: 3807
Modified:
freeswitch/trunk/src/include/switch_apr.h
freeswitch/trunk/src/mod/say/mod_say_en/mod_say_en.c
freeswitch/trunk/src/switch_ivr.c
Log:
say related stuff
Modified: freeswitch/trunk/src/include/switch_apr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_apr.h (original)
+++ freeswitch/trunk/src/include/switch_apr.h Fri Dec 22 17:33:48 2006
@@ -262,6 +262,9 @@
#define switch_thread_data_set apr_thread_data_set
#define switch_thread_data_get apr_thread_data_get
#define switch_thread_self apr_os_thread_current
+#define switch_time_make(sec, usec) ((apr_time_t)(sec) * APR_USEC_PER_SEC \
+ + (apr_time_t)(usec))
+
/**
* Put the active calling thread to sleep until signaled to wake up. Each
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 Fri Dec 22 17:33:48 2006
@@ -30,46 +30,84 @@
*/
#include <switch.h>
#include <math.h>
+#include <ctype.h>
static const char modname[] = "mod_say_en";
-typedef struct {
- switch_core_session_t *session;
- switch_input_callback_function_t input_callback;
- void *buf;
- uint32_t buflen;
-} common_args_t;
-static void play_group(int a, int b, int c, char *what, common_args_t *args)
+#define say_num(num) {\
+ char tmp[80];\
+ switch_status_t status;\
+ snprintf(tmp, sizeof(tmp), "%d", num);\
+ if ((status = en_say_general_count(session, tmp, SST_ITEMS, SSM_PRONOUNCED, input_callback, buf, buflen)) != SWITCH_STATUS_SUCCESS) {\
+ return status;\
+ }}\
+
+#define say_file(...) {\
+ char tmp[80];\
+ snprintf(tmp, sizeof(tmp), __VA_ARGS__);\
+ switch_ivr_play_file(session, NULL, tmp, NULL, input_callback, buf, buflen); \
+ if (!switch_channel_ready(switch_core_session_get_channel(session))) {\
+ return SWITCH_STATUS_FALSE;\
+ }}\
+
+
+
+static switch_status_t en_spell(switch_core_session_t *session,
+ char *tosay,
+ switch_say_type_t type,
+ switch_say_method_t method,
+ switch_input_callback_function_t input_callback,
+ void *buf,
+ uint32_t buflen)
{
- char tmp[80] = "";
+ char *p;
+ for(p = tosay; p && *p; p++) {
+ int a = tolower((int) *p);
+ if (type == SST_NAME_SPELLED) {
+ say_file("ascii/%d.wav", a);
+ } else if (type == SST_NAME_PHONETIC) {
+ say_file("phonetic-ascii/%d.wav", a);
+ }
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t play_group(int a,
+ int b,
+ int c,
+ char *what,
+ switch_core_session_t *session,
+ switch_input_callback_function_t input_callback,
+ void *buf,
+ uint32_t buflen)
+{
+
if (a) {
- snprintf(tmp, sizeof(tmp), "digits/%d.wav", a);
- switch_ivr_play_file(args->session, NULL, tmp, NULL, args->input_callback, args->buf, args->buflen);
- switch_ivr_play_file(args->session, NULL, "digits/hundred.wav", NULL, args->input_callback, args->buf, args->buflen);
+ say_file("digits/%d.wav", a);
+ say_file("digits/hundred.wav");
}
if (b) {
if (b > 1) {
- snprintf(tmp, sizeof(tmp), "digits/%d0.wav", b);
- switch_ivr_play_file(args->session, NULL, tmp, NULL, args->input_callback, args->buf, args->buflen);
+ say_file("digits/%d0.wav", b);
} else {
- snprintf(tmp, sizeof(tmp), "digits/%d%d.wav", b, c);
- switch_ivr_play_file(args->session, NULL, tmp, NULL, args->input_callback, args->buf, args->buflen);
+ say_file("digits/%d%d.wav", b, c);
c = 0;
}
}
if (c) {
- snprintf(tmp, sizeof(tmp), "digits/%d.wav", c);
- switch_ivr_play_file(args->session, NULL, tmp, NULL, args->input_callback, args->buf, args->buflen);
+ say_file("digits/%d.wav", c);
}
if (what && (a || b || c)) {
- switch_ivr_play_file(args->session, NULL, what, NULL, args->input_callback, args->buf, args->buflen);
+ say_file(what);
}
+ return SWITCH_STATUS_SUCCESS;
}
static char *strip_commas(char *in, char *out, switch_size_t len)
@@ -106,19 +144,13 @@
switch_channel_t *channel;
int in;
int x = 0, places[9] = {0};
- char tmp[80] = "";
char sbuf[13] = "";
- common_args_t args = {0};
-
+ switch_status_t status;
+
assert(session != NULL);
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
- args.session = session;
- args.input_callback = input_callback;
- args.buf = buf;
- args.buflen = buflen;
-
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;
@@ -135,15 +167,20 @@
switch (method) {
case SSM_PRONOUNCED:
- play_group(places[8], places[7], places[6], "digits/million.wav", &args);
- play_group(places[5], places[4], places[3], "digits/thousand.wav", &args);
- play_group(places[2], places[1], places[0], NULL, &args);
+ if ((status = play_group(places[8], places[7], places[6], "digits/million.wav", session, input_callback, buf, buflen)) != SWITCH_STATUS_SUCCESS) {
+ return status;
+ }
+ if ((status = play_group(places[5], places[4], places[3], "digits/thousand.wav", session, input_callback, buf, buflen)) != SWITCH_STATUS_SUCCESS) {
+ return status;
+ }
+ if ((status = play_group(places[2], places[1], places[0], NULL, session, input_callback, buf, buflen)) != SWITCH_STATUS_SUCCESS) {
+ return status;
+ }
break;
case SSM_ITERATED:
for(x = 8; x >= 0; x--) {
if (places[x]) {
- snprintf(tmp, sizeof(tmp), "digits/%d.wav", places[x]);
- switch_ivr_play_file(session, NULL, tmp, NULL, input_callback, buf, buflen);
+ say_file("digits/%d.wav", places[x]);
}
}
break;
@@ -153,6 +190,138 @@
return SWITCH_STATUS_SUCCESS;
}
+
+static switch_status_t en_say_time(switch_core_session_t *session,
+ char *tosay,
+ switch_say_type_t type,
+ switch_say_method_t method,
+ switch_input_callback_function_t input_callback,
+ void *buf,
+ uint32_t buflen)
+{
+ int32_t t;
+ switch_time_t target = 0;
+ switch_time_exp_t tm;
+ uint8_t say_date = 0, say_time = 0;
+
+ if (type == SST_TIME_MEASUREMENT) {
+ int32_t hours = 0;
+ int32_t minutes = 0;
+ int32_t seconds = 0;
+ int32_t r = 0;
+
+ if (strchr(tosay, ':')) {
+ char *tme = switch_core_session_strdup(session, tosay);
+ char *p;
+
+ if ((p = strrchr(tme, ':'))) {
+ *p++ = '\0';
+ seconds = atoi(p);
+ if ((p = strrchr(tme, ':'))) {
+ *p++ = '\0';
+ minutes = atoi(p);
+ if (tme) {
+ hours = atoi(tme);
+ }
+ }
+ }
+ } else {
+ if ((seconds = atoi(tosay)) <= 0) {
+ seconds = (time_t) time(NULL);
+ }
+
+ if (seconds >= 60) {
+ minutes = seconds / 60;
+ r = seconds % 60;
+ seconds = r;
+ }
+
+ if (minutes >= 60) {
+ hours = minutes / 60;
+ r = minutes % 60;
+ minutes = r;
+ }
+ }
+
+ if (hours) {
+ say_num(hours);
+ say_file("digits/hours.wav");
+ }
+
+ if (minutes) {
+ say_num(minutes);
+ say_file("digits/minutes.wav");
+ }
+
+ if (seconds) {
+ say_num(seconds);
+ say_file("digits/seconds.wav");
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ if ((t = atoi(tosay)) > 0) {
+ target = switch_time_make(t, 0);
+ } else {
+ target = switch_time_now();
+ }
+ switch_time_exp_lt(&tm, target);
+
+ switch(type) {
+ case SST_CURRENT_DATE_TIME:
+ say_date = say_time = 1;
+ break;
+ case SST_CURRENT_DATE:
+ say_date = 1;
+ break;
+ case SST_CURRENT_TIME:
+ say_time = 1;
+ break;
+ default:
+ break;
+ }
+
+ 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);
+ }
+
+ if (say_time) {
+ uint8_t hour = tm.tm_hour, pm = 0;
+
+ if (hour > 12) {
+ hour -= 12;
+ pm = 1;
+ } else if (hour == 12) {
+ pm = 1;
+ } else if (hour == 0) {
+ hour = 12;
+ pm = 0;
+ }
+
+ say_num(hour);
+
+ if (tm.tm_min > 9) {
+ say_num(tm.tm_min);
+ } else if (tm.tm_min) {
+ say_file("digits/oh.wav");
+ say_num(tm.tm_min);
+ } else {
+ say_file("digits/oclock.wav");
+ }
+
+ say_file("digits/%s.wav", pm ? "p-m" : "a-m");
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
+
+
static switch_status_t en_say(switch_core_session_t *session,
char *tosay,
switch_say_type_t type,
@@ -170,6 +339,16 @@
case SST_PERSONS:
case SST_MESSAGES:
say_cb = en_say_general_count;
+ break;
+ case SST_TIME_MEASUREMENT:
+ case SST_CURRENT_DATE:
+ case SST_CURRENT_TIME:
+ case SST_CURRENT_DATE_TIME:
+ say_cb = en_say_time;
+ break;
+ case SST_NAME_SPELLED:
+ case SST_NAME_PHONETIC:
+ say_cb = en_spell;
break;
default:
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Finish ME!\n");
Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c (original)
+++ freeswitch/trunk/src/switch_ivr.c Fri Dec 22 17:33:48 2006
@@ -4525,7 +4525,7 @@
odata = expanded;
}
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Handle %s:[%s] (%s)\n", func, odata, lang);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Handle %s:[%s] (%s)\n", func, odata, lang);
if (!strcasecmp(func, "play-file")) {
switch_ivr_play_file(session, NULL, odata, NULL, input_callback, buf, buflen);
More information about the Freeswitch-trunk
mailing list