]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
say update
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 2 Jan 2007 23:08:26 +0000 (23:08 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 2 Jan 2007 23:08:26 +0000 (23:08 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@3897 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_types.h
src/mod/say/mod_say_en/mod_say_en.c
src/switch_ivr.c

index 3a4330fd307b2990acd65d259b838e948f30c568..1fc29680ea804a137b1fea458932c03f90768fca 100644 (file)
@@ -96,7 +96,8 @@ typedef uint8_t switch_byte_t;
 typedef enum {
        SSM_NA,
        SSM_PRONOUNCED,
-       SSM_ITERATED
+       SSM_ITERATED,
+    SSM_COUNTED
 } switch_say_method_t;
 
 typedef enum {
@@ -112,6 +113,7 @@ typedef enum {
        SST_TELEPHONE_NUMBER,
        SST_TELEPHONE_EXTENSION,
        SST_URL,
+       SST_IP_ADDRESS,
        SST_EMAIL_ADDRESS,
        SST_POSTAL_ADDRESS,
        SST_ACCOUNT_NUMBER,
index 756ebe232eb611a3b78f8d358cea9f070f235b14..bdae061e05f0002e97cd37ef26902936211101ad 100644 (file)
 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 const char modname[] = "mod_say_en";
                }}\
 
 
-
 static switch_status_t en_spell(switch_core_session_t *session,
                                                                char *tosay,
                                                                switch_say_type_t type,
@@ -73,7 +72,8 @@ static switch_status_t en_spell(switch_core_session_t *session,
        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 @@ static switch_status_t play_group(int a,
        }
 
        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 @@ static switch_status_t en_say_general_count(switch_core_session_t *session,
        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 @@ static switch_status_t en_say_general_count(switch_core_session_t *session,
        }
 
        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_say_general_count(switch_core_session_t *session,
 }
 
 
+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 @@ static switch_status_t en_say_time(switch_core_session_t *session,
                }
 
                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 @@ static switch_status_t en_say_time(switch_core_session_t *session,
        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 @@ static switch_status_t en_say_time(switch_core_session_t *session,
                        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 @@ static switch_status_t en_say(switch_core_session_t *session,
        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;
index fbc65ebaa361521c4c0ddeb5a26552dfe8cecc24..05786e9b6fd8091b0eca71d431af84d05acb0dab 100644 (file)
@@ -960,7 +960,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
        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 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_play_file(switch_core_session_t *sess
                        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 @@ static char *SAY_METHOD_NAMES[] = {
     "N/A",
     "PRONOUNCED",
     "ITERATED",
+    "COUNTED",
     NULL
 };
 
@@ -4361,6 +4367,7 @@ static char *SAY_TYPE_NAMES[] = {
        "TELEPHONE_NUMBER",
        "TELEPHONE_EXTENSION",
        "URL",
+    "IP_ADDRESS",
        "EMAIL_ADDRESS",
        "POSTAL_ADDRESS",
        "ACCOUNT_NUMBER",