aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xMakefile18
-rwxr-xr-xapps/app_agi.c27
-rwxr-xr-xasterisk.c1
-rwxr-xr-xconfigs/logger.conf.sample5
-rwxr-xr-xinclude/asterisk/say.h4
-rwxr-xr-xpbx.c26
-rwxr-xr-xsay.c314
-rwxr-xr-xsounds.txt134
-rwxr-xr-xsounds/letters/a.gsmbin0 -> 825 bytes
-rwxr-xr-xsounds/letters/at.gsmbin0 -> 858 bytes
-rwxr-xr-xsounds/letters/b.gsmbin0 -> 990 bytes
-rwxr-xr-xsounds/letters/c.gsmbin0 -> 1023 bytes
-rwxr-xr-xsounds/letters/d.gsmbin0 -> 1122 bytes
-rwxr-xr-xsounds/letters/dash.gsmbin0 -> 1221 bytes
-rwxr-xr-xsounds/letters/dollar.gsmbin0 -> 1122 bytes
-rwxr-xr-xsounds/letters/dot.gsmbin0 -> 990 bytes
-rwxr-xr-xsounds/letters/e.gsmbin0 -> 990 bytes
-rwxr-xr-xsounds/letters/equals.gsmbin0 -> 1386 bytes
-rwxr-xr-xsounds/letters/exclaimation-point.gsmbin0 -> 2442 bytes
-rwxr-xr-xsounds/letters/f.gsmbin0 -> 957 bytes
-rwxr-xr-xsounds/letters/g.gsmbin0 -> 1155 bytes
-rwxr-xr-xsounds/letters/h.gsmbin0 -> 1122 bytes
-rwxr-xr-xsounds/letters/i.gsmbin0 -> 990 bytes
-rwxr-xr-xsounds/letters/j.gsmbin0 -> 1155 bytes
-rwxr-xr-xsounds/letters/k.gsmbin0 -> 1056 bytes
-rwxr-xr-xsounds/letters/l.gsmbin0 -> 924 bytes
-rwxr-xr-xsounds/letters/m.gsmbin0 -> 825 bytes
-rwxr-xr-xsounds/letters/n.gsmbin0 -> 792 bytes
-rwxr-xr-xsounds/letters/o.gsmbin0 -> 891 bytes
-rwxr-xr-xsounds/letters/p.gsmbin0 -> 891 bytes
-rwxr-xr-xsounds/letters/plus.gsmbin0 -> 957 bytes
-rwxr-xr-xsounds/letters/q.gsmbin0 -> 957 bytes
-rwxr-xr-xsounds/letters/r.gsmbin0 -> 924 bytes
-rwxr-xr-xsounds/letters/s.gsmbin0 -> 825 bytes
-rwxr-xr-xsounds/letters/slash.gsmbin0 -> 1353 bytes
-rwxr-xr-xsounds/letters/space.gsmbin0 -> 1320 bytes
-rwxr-xr-xsounds/letters/t.gsmbin0 -> 792 bytes
-rwxr-xr-xsounds/letters/u.gsmbin0 -> 1023 bytes
-rwxr-xr-xsounds/letters/v.gsmbin0 -> 1089 bytes
-rwxr-xr-xsounds/letters/w.gsmbin0 -> 1419 bytes
-rwxr-xr-xsounds/letters/x.gsmbin0 -> 924 bytes
-rwxr-xr-xsounds/letters/y.gsmbin0 -> 1155 bytes
-rwxr-xr-xsounds/letters/z.gsmbin0 -> 1023 bytes
-rwxr-xr-xsounds/letters/zed.gsmbin0 -> 1056 bytes
-rwxr-xr-xsounds/phonetic/9_p.gsmbin0 -> 1155 bytes
-rwxr-xr-xsounds/phonetic/a_p.gsmbin0 -> 1089 bytes
-rwxr-xr-xsounds/phonetic/b_p.gsmbin0 -> 1188 bytes
-rwxr-xr-xsounds/phonetic/c_p.gsmbin0 -> 1089 bytes
-rwxr-xr-xsounds/phonetic/d_p.gsmbin0 -> 1254 bytes
-rwxr-xr-xsounds/phonetic/e_p.gsmbin0 -> 1056 bytes
-rwxr-xr-xsounds/phonetic/f_p.gsmbin0 -> 1320 bytes
-rwxr-xr-xsounds/phonetic/g_p.gsmbin0 -> 990 bytes
-rwxr-xr-xsounds/phonetic/h_p.gsmbin0 -> 1287 bytes
-rwxr-xr-xsounds/phonetic/i_p.gsmbin0 -> 1089 bytes
-rwxr-xr-xsounds/phonetic/j_p.gsmbin0 -> 1353 bytes
-rwxr-xr-xsounds/phonetic/k_p.gsmbin0 -> 1056 bytes
-rwxr-xr-xsounds/phonetic/l_p.gsmbin0 -> 1122 bytes
-rwxr-xr-xsounds/phonetic/m_p.gsmbin0 -> 858 bytes
-rwxr-xr-xsounds/phonetic/n_p.gsmbin0 -> 1254 bytes
-rwxr-xr-xsounds/phonetic/o_p.gsm2
-rwxr-xr-xsounds/phonetic/p_p.gsmbin0 -> 924 bytes
-rwxr-xr-xsounds/phonetic/q_p.gsmbin0 -> 1122 bytes
-rwxr-xr-xsounds/phonetic/r_p.gsmbin0 -> 1188 bytes
-rwxr-xr-xsounds/phonetic/s_p.gsmbin0 -> 1221 bytes
-rwxr-xr-xsounds/phonetic/t_p.gsmbin0 -> 1155 bytes
-rwxr-xr-xsounds/phonetic/u_p.gsmbin0 -> 1452 bytes
-rwxr-xr-xsounds/phonetic/v_p.gsmbin0 -> 1122 bytes
-rwxr-xr-xsounds/phonetic/w_p.gsmbin0 -> 1089 bytes
-rwxr-xr-xsounds/phonetic/x_p.gsmbin0 -> 1089 bytes
-rwxr-xr-xsounds/phonetic/y_p.gsmbin0 -> 1188 bytes
-rwxr-xr-xsounds/phonetic/z_p.gsmbin0 -> 1188 bytes
71 files changed, 527 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index d5003c27e..ba3c1c355 100755
--- a/Makefile
+++ b/Makefile
@@ -273,6 +273,24 @@ datafiles: all
exit 1; \
fi; \
done
+ mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters
+ for x in sounds/letters/*.gsm; do \
+ if grep -q "^%`basename $$x`%" sounds.txt; then \
+ install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters ; \
+ else \
+ echo "No description for $$x"; \
+ exit 1; \
+ fi; \
+ done
+ mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic
+ for x in sounds/phonetic/*.gsm; do \
+ if grep -q "^%`basename $$x`%" sounds.txt; then \
+ install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic ; \
+ else \
+ echo "No description for $$x"; \
+ exit 1; \
+ fi; \
+ done
for x in sounds/vm-* sounds/transfer* sounds/pbx-* sounds/ss-* sounds/beep* sounds/dir-* sounds/conf-* sounds/agent-* sounds/invalid* sounds/tt-* sounds/auth-* sounds/privacy-* sounds/queue-*; do \
if grep -q "^%`basename $$x`%" sounds.txt; then \
install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
diff --git a/apps/app_agi.c b/apps/app_agi.c
index 98021fecf..14fa27e49 100755
--- a/apps/app_agi.c
+++ b/apps/app_agi.c
@@ -385,10 +385,12 @@ static int handle_saydigits(struct ast_channel *chan, AGI *agi, int argc, char *
{
int res;
int num;
+
if (argc != 4)
return RESULT_SHOWUSAGE;
if (sscanf(argv[2], "%i", &num) != 1)
return RESULT_SHOWUSAGE;
+
res = ast_say_digit_str_full(chan, argv[2], argv[3], chan->language, agi->audio, agi->ctrl);
if (res == 1) /* New command */
return RESULT_SUCCESS;
@@ -417,6 +419,23 @@ static int handle_saytime(struct ast_channel *chan, AGI *agi, int argc, char *ar
return RESULT_FAILURE;
}
+static int handle_sayphonetic(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
+{
+ int res;
+
+ if (argc != 4)
+ return RESULT_SHOWUSAGE;
+
+ res = ast_say_phonetic_str_full(chan, argv[2], argv[3], chan->language, agi->audio, agi->ctrl);
+ if (res == 1) /* New command */
+ return RESULT_SUCCESS;
+ fdprintf(agi->fd, "200 result=%d\n", res);
+ if (res >= 0)
+ return RESULT_SUCCESS;
+ else
+ return RESULT_FAILURE;
+}
+
static int handle_getdata(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
{
int res;
@@ -1031,6 +1050,13 @@ static char usage_saytime[] =
" completes without a digit being pressed, or the ASCII numerical value of the\n"
" digit if one was pressed or -1 on error/hangup.\n";
+static char usage_sayphonetic[] =
+" Usage: SAY PHONETIC <string> <escape digits>\n"
+" Say a given character string with phonetics, returning early if any of the given DTMF digits\n"
+" are received on the channel. Returns 0 if playback completes without a digit\n"
+" being pressed, or the ASCII numerical value of the digit if one was pressed or\n"
+" -1 on error/hangup.\n";
+
static char usage_getdata[] =
" Usage: GET DATA <file to be streamed> [timeout] [max digits]\n"
" Stream the given file, and recieve DTMF data. Returns the digits recieved\n"
@@ -1080,6 +1106,7 @@ static agi_command commands[] = {
{ { "send", "image", NULL }, handle_sendimage, "Sends images to channels supporting it", usage_sendimage },
{ { "say", "digits", NULL }, handle_saydigits, "Says a given digit string", usage_saydigits },
{ { "say", "number", NULL }, handle_saynumber, "Says a given number", usage_saynumber },
+ { { "say", "phonetic", NULL }, handle_sayphonetic, "Says a given character string with phonetics", usage_sayphonetic },
{ { "say", "time", NULL }, handle_saytime, "Says a given time", usage_saytime },
{ { "get", "data", NULL }, handle_getdata, "Gets data on a channel", usage_getdata },
{ { "set", "context", NULL }, handle_setcontext, "Sets channel context", usage_setcontext },
diff --git a/asterisk.c b/asterisk.c
index f7abea070..d1b0dad3c 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -896,7 +896,6 @@ static char *cli_prompt(EditLine *el)
int i;
struct timeval tv;
struct tm tm;
- time_t curtime;
FILE *LOADAVG;
int fgcolor = COLOR_WHITE, bgcolor = COLOR_BLACK;
diff --git a/configs/logger.conf.sample b/configs/logger.conf.sample
index dd3a5bd9e..66f0613ac 100755
--- a/configs/logger.conf.sample
+++ b/configs/logger.conf.sample
@@ -29,6 +29,11 @@ console => notice,warning,error
;console => notice,warning,error,debug
messages => notice,warning,error
;full => notice,warning,error,debug,verbose
+;
+; Uncomment the following line (with *no* events) if you want the
+; queue log to automatically rotate.
+;
+;queue_log =>
;syslog keyword : This special keyword logs to syslog facility
;
diff --git a/include/asterisk/say.h b/include/asterisk/say.h
index 019d7cc76..cc691bd5e 100755
--- a/include/asterisk/say.h
+++ b/include/asterisk/say.h
@@ -61,6 +61,10 @@ int ast_say_digits_full(struct ast_channel *chan, int num, char *ints, char *lan
*/
int ast_say_digit_str(struct ast_channel *chan, char *num, char *ints, char *lang);
int ast_say_digit_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
+int ast_say_character_str(struct ast_channel *chan, char *num, char *ints, char *lang);
+int ast_say_character_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
+int ast_say_phonetic_str(struct ast_channel *chan, char *num, char *ints, char *lang);
+int ast_say_phonetic_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
int ast_say_datetime(struct ast_channel *chan, time_t t, char *ints, char *lang);
diff --git a/pbx.c b/pbx.c
index 85e5e0103..4a5fd82d6 100755
--- a/pbx.c
+++ b/pbx.c
@@ -169,6 +169,8 @@ static int pbx_builtin_gotoif(struct ast_channel *, void *);
static int pbx_builtin_gotoiftime(struct ast_channel *, void *);
static int pbx_builtin_saynumber(struct ast_channel *, void *);
static int pbx_builtin_saydigits(struct ast_channel *, void *);
+static int pbx_builtin_saycharacters(struct ast_channel *, void *);
+static int pbx_builtin_sayphonetic(struct ast_channel *, void *);
int pbx_builtin_setvar(struct ast_channel *, void *);
void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
@@ -293,6 +295,14 @@ static struct pbx_builtin {
"Say Digits",
" SayDigits(digits): Says the passed digits\n" },
+ { "SayAlpha", pbx_builtin_saycharacters,
+"Say Alpha",
+" SayAlpha(string): Spells the passed string\n" },
+
+ { "SayPhonetic", pbx_builtin_sayphonetic,
+"Say Phonetic",
+" SayPhonetic(string): Spells the passed string with phonetic alphabet\n" },
+
{ "SetAccount", pbx_builtin_setaccount,
"Sets account code",
" SetAccount([account]): Set the channel account code for billing\n"
@@ -4601,6 +4611,22 @@ static int pbx_builtin_saydigits(struct ast_channel *chan, void *data)
return res;
}
+static int pbx_builtin_saycharacters(struct ast_channel *chan, void *data)
+{
+ int res = 0;
+ if (data)
+ res = ast_say_character_str(chan, (char *)data, "", chan->language);
+ return res;
+}
+
+static int pbx_builtin_sayphonetic(struct ast_channel *chan, void *data)
+{
+ int res = 0;
+ if (data)
+ res = ast_say_phonetic_str(chan, (char *)data, "", chan->language);
+ return res;
+}
+
int load_pbx(void)
{
int x;
diff --git a/say.c b/say.c
index 010734627..5a318e8c0 100755
--- a/say.c
+++ b/say.c
@@ -16,6 +16,7 @@
#include <stdlib.h>
#include <netinet/in.h>
#include <time.h>
+#include <ctype.h>
#include <asterisk/file.h>
#include <asterisk/channel.h>
#include <asterisk/logger.h>
@@ -45,13 +46,13 @@ int ast_say_digit_str(struct ast_channel *chan, char *fn2, char *ints, char *lan
snprintf(fn, sizeof(fn), "digits/pound");
break;
default:
- if((fn2[num] >= '0') && (fn2[num] <= '9')){ /* Must be in {0-9} */
+ if((fn2[num] >= '0') && (fn2[num] <= '9')){ /* Must be in {0-9} */
snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
}
- }
+ }
if(strlen(fn)){ /* if length == 0, then skip this digit as it is invalid */
res = ast_streamfile(chan, fn, lang);
- if (!res)
+ if (!res)
res = ast_waitstream(chan, ints);
ast_stopstream(chan);
}
@@ -60,6 +61,178 @@ int ast_say_digit_str(struct ast_channel *chan, char *fn2, char *ints, char *lan
return res;
}
+int ast_say_character_str(struct ast_channel *chan, char *fn2, char *ints, char *lang)
+{
+ /* XXX Merge with full version? XXX */
+ char fn[256] = "";
+ char ltr;
+ int num = 0;
+ int res = 0;
+ while(fn2[num] && !res) {
+ fn[0] = '\0';
+ switch (fn2[num]) {
+ case ('*'):
+ snprintf(fn, sizeof(fn), "digits/star");
+ break;
+ case ('#'):
+ snprintf(fn, sizeof(fn), "digits/pound");
+ break;
+ case ('0'):
+ case ('1'):
+ case ('2'):
+ case ('3'):
+ case ('4'):
+ case ('5'):
+ case ('6'):
+ case ('7'):
+ case ('8'):
+ case ('9'):
+ snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
+ break;
+ case ('!'):
+ strncpy(fn, "letters/exclaimation-point", sizeof(fn));
+ break;
+ case ('@'):
+ strncpy(fn, "letters/at", sizeof(fn));
+ break;
+ case ('$'):
+ strncpy(fn, "letters/dollar", sizeof(fn));
+ break;
+ case ('-'):
+ strncpy(fn, "letters/dash", sizeof(fn));
+ break;
+ case ('.'):
+ strncpy(fn, "letters/dot", sizeof(fn));
+ break;
+ case ('='):
+ strncpy(fn, "letters/equals", sizeof(fn));
+ break;
+ case ('+'):
+ strncpy(fn, "letters/plus", sizeof(fn));
+ break;
+ case ('/'):
+ strncpy(fn, "letters/slash", sizeof(fn));
+ break;
+ case (' '):
+ strncpy(fn, "letters/space", sizeof(fn));
+ break;
+ default:
+ ltr = fn2[num];
+ if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
+ snprintf(fn, sizeof(fn), "letters/%c", ltr);
+ }
+ if(strlen(fn)){ /* if length == 0, then skip this digit as it is invalid */
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ } ast_stopstream(chan);
+ num++;
+ }
+ return res;
+}
+
+int ast_say_phonetic_str(struct ast_channel *chan, char *fn2, char *ints, char *lang)
+{
+ /* XXX Merge with full version? XXX */
+ char fn[256] = "";
+ char ltr;
+ int num = 0;
+ int res = 0;
+ int temp;
+ int play;
+ char hex[3];
+/* while(fn2[num] && !res) { */
+ while(fn2[num]) {
+ play=1;
+ switch (fn2[num]) {
+ case ('*'):
+ snprintf(fn, sizeof(fn), "digits/star");
+ break;
+ case ('#'):
+ snprintf(fn, sizeof(fn), "digits/pound");
+ break;
+ case ('0'):
+ case ('1'):
+ case ('2'):
+ case ('3'):
+ case ('4'):
+ case ('5'):
+ case ('6'):
+ case ('7'):
+ case ('8'):
+ snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
+ break;
+ case ('!'):
+ strncpy(fn, "exclaimation-point", sizeof(fn));
+ break;
+ case ('@'):
+ strncpy(fn, "at", sizeof(fn));
+ break;
+ case ('$'):
+ strncpy(fn, "dollar", sizeof(fn));
+ break;
+ case ('-'):
+ strncpy(fn, "dash", sizeof(fn));
+ break;
+ case ('.'):
+ strncpy(fn, "dot", sizeof(fn));
+ break;
+ case ('='):
+ strncpy(fn, "equals", sizeof(fn));
+ break;
+ case ('+'):
+ strncpy(fn, "plus", sizeof(fn));
+ break;
+ case ('/'):
+ strncpy(fn, "slash", sizeof(fn));
+ break;
+ case (' '):
+ strncpy(fn, "space", sizeof(fn));
+ break;
+ case ('%'):
+ play=0;
+ /* check if we have 2 chars after the % */
+ if (strlen(fn2)>num+2)
+ {
+ hex[0]=fn2[num+1];
+ hex[1]=fn2[num+2];
+ hex[2]='\0';
+ if (sscanf(hex,"%x", &temp))
+ { /* Hex to char convertion successfull */
+ fn2[num+2]=temp;
+ num++;
+ if (temp==37)
+ { /* If it is a percent, play it now */
+ strncpy(fn, "percent", sizeof(fn));
+ num++;
+ play=1;
+ }
+ /* check for invalid characters */
+ if ((temp<32) || (temp>126))
+ {
+ num++;
+ }
+ }
+ }
+ else
+ num++;
+ break;
+ default: /* '9' falls through to here, too */
+ ltr = tolower(fn2[num]);
+ snprintf(fn, sizeof(fn), "phonetic/%c_p", ltr);
+ }
+ if (play)
+ {
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream(chan, ints);
+ ast_stopstream(chan);
+ }
+ num++;
+ }
+ return res;
+}
+
int ast_say_digit_str_full(struct ast_channel *chan, char *fn2, char *ints, char *lang, int audiofd, int ctrlfd)
{
char fn[256] = "";
@@ -76,6 +249,141 @@ int ast_say_digit_str_full(struct ast_channel *chan, char *fn2, char *ints, char
return res;
}
+int ast_say_character_str_full(struct ast_channel *chan, char *fn2, char *ints, char *lang, int audiofd, int ctrlfd)
+{
+ char fn[256] = "";
+ char ltr;
+ int num = 0;
+ int res = 0;
+ while(fn2[num] && !res) {
+ switch (fn2[num]) {
+ case ('*'):
+ snprintf(fn, sizeof(fn), "digits/star");
+ break;
+ case ('#'):
+ snprintf(fn, sizeof(fn), "digits/pound");
+ break;
+ case ('0'):
+ case ('1'):
+ case ('2'):
+ case ('3'):
+ case ('4'):
+ case ('5'):
+ case ('6'):
+ case ('7'):
+ case ('8'):
+ case ('9'):
+ snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
+ break;
+ case ('!'):
+ strncpy(fn, "exclaimation-point", sizeof(fn));
+ break;
+ case ('@'):
+ strncpy(fn, "at", sizeof(fn));
+ break;
+ case ('$'):
+ strncpy(fn, "dollar", sizeof(fn));
+ break;
+ case ('-'):
+ strncpy(fn, "dash", sizeof(fn));
+ break;
+ case ('.'):
+ strncpy(fn, "dot", sizeof(fn));
+ break;
+ case ('='):
+ strncpy(fn, "equals", sizeof(fn));
+ break;
+ case ('+'):
+ strncpy(fn, "plus", sizeof(fn));
+ break;
+ case ('/'):
+ strncpy(fn, "slash", sizeof(fn));
+ break;
+ case (' '):
+ strncpy(fn, "space", sizeof(fn));
+ break;
+ default:
+ ltr = fn2[num];
+ if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
+ snprintf(fn, sizeof(fn), "letters/%c", ltr);
+ }
+ /* snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); */
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
+ ast_stopstream(chan);
+ num++;
+ }
+ return res;
+}
+
+int ast_say_phonetic_str_full(struct ast_channel *chan, char *fn2, char *ints, char *lang, int audiofd, int ctrlfd)
+{
+ char fn[256] = "";
+ char ltr;
+ int num = 0;
+ int res = 0;
+ while(fn2[num] && !res) {
+ switch (fn2[num]) {
+ case ('*'):
+ snprintf(fn, sizeof(fn), "digits/star");
+ break;
+ case ('#'):
+ snprintf(fn, sizeof(fn), "digits/pound");
+ break;
+ case ('0'):
+ case ('1'):
+ case ('2'):
+ case ('3'):
+ case ('4'):
+ case ('5'):
+ case ('6'):
+ case ('7'):
+ case ('8'):
+ snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
+ break;
+ case ('!'):
+ strncpy(fn, "exclaimation-point", sizeof(fn));
+ break;
+ case ('@'):
+ strncpy(fn, "at", sizeof(fn));
+ break;
+ case ('$'):
+ strncpy(fn, "dollar", sizeof(fn));
+ break;
+ case ('-'):
+ strncpy(fn, "dash", sizeof(fn));
+ break;
+ case ('.'):
+ strncpy(fn, "dot", sizeof(fn));
+ break;
+ case ('='):
+ strncpy(fn, "equals", sizeof(fn));
+ break;
+ case ('+'):
+ strncpy(fn, "plus", sizeof(fn));
+ break;
+ case ('/'):
+ strncpy(fn, "slash", sizeof(fn));
+ break;
+ case (' '):
+ strncpy(fn, "space", sizeof(fn));
+ break;
+ default: /* '9' falls here... */
+ ltr = fn2[num];
+ if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
+ snprintf(fn, sizeof(fn), "phonetic/%c", ltr);
+ }
+ /* snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); */
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
+ ast_stopstream(chan);
+ num++;
+ }
+ return res;
+}
+
int ast_say_digits(struct ast_channel *chan, int num, char *ints, char *lang)
{
/* XXX Should I be merged with say_digits_full XXX */
diff --git a/sounds.txt b/sounds.txt
index cd7b0f7bc..419497c71 100755
--- a/sounds.txt
+++ b/sounds.txt
@@ -478,3 +478,137 @@
%vm-reachoper.gsm%press 0 to reach an operator
%vm-tooshort.gsm%your message is too short
+
+%9_p.gsm%niner
+
+%a.gsm%a
+
+%b.gsm%b
+
+%c.gsm%c
+
+%d.gsm%d
+
+%e.gsm%e
+
+%f.gsm%f
+
+%g.gsm%g
+
+%h.gsm%h
+
+%i.gsm%i
+
+%j.gsm%j
+
+%k.gsm%k
+
+%l.gsm%l
+
+%m.gsm%m
+
+%n.gsm%n
+
+%o.gsm%o
+
+%p.gsm%p
+
+%q.gsm%q
+
+%r.gsm%r
+
+%s.gsm%s
+
+%t.gsm%t
+
+%u.gsm%u
+
+%v.gsm%v
+
+%w.gsm%w
+
+%x.gsm%x
+
+%y.gsm%y
+
+%z.gsm%z
+
+%zed.gsm%zed
+
+%a_p.gsm%alpha
+
+%b_p.gsm%bravo
+
+%c_p.gsm%charlie
+
+%d_p.gsm%delta
+
+%e_p.gsm%echo
+
+%f_p.gsm%foxtrot
+
+%g_p.gsm%golf
+
+%h_p.gsm%hotel
+
+%i_p.gsm%india
+
+%j_p.gsm%juliet
+
+%k_p.gsm%kilo
+
+%l_p.gsm%lima
+
+%m_p.gsm%mike
+
+%n_p.gsm%november
+
+%o_p.gsm%oscar
+
+%p_p.gsm%papa
+
+%q_p.gsm%quebec
+
+%r_p.gsm%romeo
+
+%s_p.gsm%sierra
+
+%t_p.gsm%tango
+
+%u_p.gsm%uniform
+
+%v_p.gsm%victor
+
+%w_p.gsm%wiskey
+
+%x_p.gsm%xray
+
+%y_p.gsm%yankee
+
+%z_p.gsm%zulu
+
+%niner.gsm%niner
+
+; Misc
+
+%percent.gsm%percent [%]
+
+%plus.gsm%plus [+]
+
+%exclaimation-point.gsm%exclaimation-point [!]
+
+%at.gsm%at [@]
+
+%dollar.gsm%dollar [$]
+
+%dash.gsm%dash [-]
+
+%dot.gsm%dot [.]
+
+%slash.gsm%slash [/]
+
+%space.gsm%space [ ]
+
+%plus.gsm%plus [+]
+
+%equals.gsm%equals [=]
diff --git a/sounds/letters/a.gsm b/sounds/letters/a.gsm
new file mode 100755
index 000000000..88171a2d8
--- /dev/null
+++ b/sounds/letters/a.gsm
Binary files differ
diff --git a/sounds/letters/at.gsm b/sounds/letters/at.gsm
new file mode 100755
index 000000000..76227229b
--- /dev/null
+++ b/sounds/letters/at.gsm
Binary files differ
diff --git a/sounds/letters/b.gsm b/sounds/letters/b.gsm
new file mode 100755
index 000000000..d97f14fd7
--- /dev/null
+++ b/sounds/letters/b.gsm
Binary files differ
diff --git a/sounds/letters/c.gsm b/sounds/letters/c.gsm
new file mode 100755
index 000000000..e631c3e8c
--- /dev/null
+++ b/sounds/letters/c.gsm
Binary files differ
diff --git a/sounds/letters/d.gsm b/sounds/letters/d.gsm
new file mode 100755
index 000000000..9d26a00ee
--- /dev/null
+++ b/sounds/letters/d.gsm
Binary files differ
diff --git a/sounds/letters/dash.gsm b/sounds/letters/dash.gsm
new file mode 100755
index 000000000..b3649e38d
--- /dev/null
+++ b/sounds/letters/dash.gsm
Binary files differ
diff --git a/sounds/letters/dollar.gsm b/sounds/letters/dollar.gsm
new file mode 100755
index 000000000..1d515d166
--- /dev/null
+++ b/sounds/letters/dollar.gsm
Binary files differ
diff --git a/sounds/letters/dot.gsm b/sounds/letters/dot.gsm
new file mode 100755
index 000000000..0fca6d9cb
--- /dev/null
+++ b/sounds/letters/dot.gsm
Binary files differ
diff --git a/sounds/letters/e.gsm b/sounds/letters/e.gsm
new file mode 100755
index 000000000..bedfb456e
--- /dev/null
+++ b/sounds/letters/e.gsm
Binary files differ
diff --git a/sounds/letters/equals.gsm b/sounds/letters/equals.gsm
new file mode 100755
index 000000000..4822469ce
--- /dev/null
+++ b/sounds/letters/equals.gsm
Binary files differ
diff --git a/sounds/letters/exclaimation-point.gsm b/sounds/letters/exclaimation-point.gsm
new file mode 100755
index 000000000..87e49f2ed
--- /dev/null
+++ b/sounds/letters/exclaimation-point.gsm
Binary files differ
diff --git a/sounds/letters/f.gsm b/sounds/letters/f.gsm
new file mode 100755
index 000000000..27fba4507
--- /dev/null
+++ b/sounds/letters/f.gsm
Binary files differ
diff --git a/sounds/letters/g.gsm b/sounds/letters/g.gsm
new file mode 100755
index 000000000..42b9e60b9
--- /dev/null
+++ b/sounds/letters/g.gsm
Binary files differ
diff --git a/sounds/letters/h.gsm b/sounds/letters/h.gsm
new file mode 100755
index 000000000..c64b2f9c9
--- /dev/null
+++ b/sounds/letters/h.gsm
Binary files differ
diff --git a/sounds/letters/i.gsm b/sounds/letters/i.gsm
new file mode 100755
index 000000000..7f80d8ca7
--- /dev/null
+++ b/sounds/letters/i.gsm
Binary files differ
diff --git a/sounds/letters/j.gsm b/sounds/letters/j.gsm
new file mode 100755
index 000000000..45057ea96
--- /dev/null
+++ b/sounds/letters/j.gsm
Binary files differ
diff --git a/sounds/letters/k.gsm b/sounds/letters/k.gsm
new file mode 100755
index 000000000..104dae10e
--- /dev/null
+++ b/sounds/letters/k.gsm
Binary files differ
diff --git a/sounds/letters/l.gsm b/sounds/letters/l.gsm
new file mode 100755
index 000000000..df4957f16
--- /dev/null
+++ b/sounds/letters/l.gsm
Binary files differ
diff --git a/sounds/letters/m.gsm b/sounds/letters/m.gsm
new file mode 100755
index 000000000..97643d131
--- /dev/null
+++ b/sounds/letters/m.gsm
Binary files differ
diff --git a/sounds/letters/n.gsm b/sounds/letters/n.gsm
new file mode 100755
index 000000000..92d853406
--- /dev/null
+++ b/sounds/letters/n.gsm
Binary files differ
diff --git a/sounds/letters/o.gsm b/sounds/letters/o.gsm
new file mode 100755
index 000000000..4d1235051
--- /dev/null
+++ b/sounds/letters/o.gsm
Binary files differ
diff --git a/sounds/letters/p.gsm b/sounds/letters/p.gsm
new file mode 100755
index 000000000..d0851e768
--- /dev/null
+++ b/sounds/letters/p.gsm
Binary files differ
diff --git a/sounds/letters/plus.gsm b/sounds/letters/plus.gsm
new file mode 100755
index 000000000..f4d72d637
--- /dev/null
+++ b/sounds/letters/plus.gsm
Binary files differ
diff --git a/sounds/letters/q.gsm b/sounds/letters/q.gsm
new file mode 100755
index 000000000..a86ed189c
--- /dev/null
+++ b/sounds/letters/q.gsm
Binary files differ
diff --git a/sounds/letters/r.gsm b/sounds/letters/r.gsm
new file mode 100755
index 000000000..6ac4db989
--- /dev/null
+++ b/sounds/letters/r.gsm
Binary files differ
diff --git a/sounds/letters/s.gsm b/sounds/letters/s.gsm
new file mode 100755
index 000000000..6f9cdc367
--- /dev/null
+++ b/sounds/letters/s.gsm
Binary files differ
diff --git a/sounds/letters/slash.gsm b/sounds/letters/slash.gsm
new file mode 100755
index 000000000..51138a4a6
--- /dev/null
+++ b/sounds/letters/slash.gsm
Binary files differ
diff --git a/sounds/letters/space.gsm b/sounds/letters/space.gsm
new file mode 100755
index 000000000..46b281d91
--- /dev/null
+++ b/sounds/letters/space.gsm
Binary files differ
diff --git a/sounds/letters/t.gsm b/sounds/letters/t.gsm
new file mode 100755
index 000000000..3f8904d28
--- /dev/null
+++ b/sounds/letters/t.gsm
Binary files differ
diff --git a/sounds/letters/u.gsm b/sounds/letters/u.gsm
new file mode 100755
index 000000000..9fdc9a851
--- /dev/null
+++ b/sounds/letters/u.gsm
Binary files differ
diff --git a/sounds/letters/v.gsm b/sounds/letters/v.gsm
new file mode 100755
index 000000000..e7ded5bd0
--- /dev/null
+++ b/sounds/letters/v.gsm
Binary files differ
diff --git a/sounds/letters/w.gsm b/sounds/letters/w.gsm
new file mode 100755
index 000000000..6b0df9169
--- /dev/null
+++ b/sounds/letters/w.gsm
Binary files differ
diff --git a/sounds/letters/x.gsm b/sounds/letters/x.gsm
new file mode 100755
index 000000000..70c47e521
--- /dev/null
+++ b/sounds/letters/x.gsm
Binary files differ
diff --git a/sounds/letters/y.gsm b/sounds/letters/y.gsm
new file mode 100755
index 000000000..19ffa007e
--- /dev/null
+++ b/sounds/letters/y.gsm
Binary files differ
diff --git a/sounds/letters/z.gsm b/sounds/letters/z.gsm
new file mode 100755
index 000000000..919382337
--- /dev/null
+++ b/sounds/letters/z.gsm
Binary files differ
diff --git a/sounds/letters/zed.gsm b/sounds/letters/zed.gsm
new file mode 100755
index 000000000..39782f734
--- /dev/null
+++ b/sounds/letters/zed.gsm
Binary files differ
diff --git a/sounds/phonetic/9_p.gsm b/sounds/phonetic/9_p.gsm
new file mode 100755
index 000000000..d42bec688
--- /dev/null
+++ b/sounds/phonetic/9_p.gsm
Binary files differ
diff --git a/sounds/phonetic/a_p.gsm b/sounds/phonetic/a_p.gsm
new file mode 100755
index 000000000..fa6edfe8f
--- /dev/null
+++ b/sounds/phonetic/a_p.gsm
Binary files differ
diff --git a/sounds/phonetic/b_p.gsm b/sounds/phonetic/b_p.gsm
new file mode 100755
index 000000000..187f0dd1b
--- /dev/null
+++ b/sounds/phonetic/b_p.gsm
Binary files differ
diff --git a/sounds/phonetic/c_p.gsm b/sounds/phonetic/c_p.gsm
new file mode 100755
index 000000000..2c168ec55
--- /dev/null
+++ b/sounds/phonetic/c_p.gsm
Binary files differ
diff --git a/sounds/phonetic/d_p.gsm b/sounds/phonetic/d_p.gsm
new file mode 100755
index 000000000..5550bfc1b
--- /dev/null
+++ b/sounds/phonetic/d_p.gsm
Binary files differ
diff --git a/sounds/phonetic/e_p.gsm b/sounds/phonetic/e_p.gsm
new file mode 100755
index 000000000..46ae8b6f5
--- /dev/null
+++ b/sounds/phonetic/e_p.gsm
Binary files differ
diff --git a/sounds/phonetic/f_p.gsm b/sounds/phonetic/f_p.gsm
new file mode 100755
index 000000000..6b4f30dca
--- /dev/null
+++ b/sounds/phonetic/f_p.gsm
Binary files differ
diff --git a/sounds/phonetic/g_p.gsm b/sounds/phonetic/g_p.gsm
new file mode 100755
index 000000000..38aae4fdb
--- /dev/null
+++ b/sounds/phonetic/g_p.gsm
Binary files differ
diff --git a/sounds/phonetic/h_p.gsm b/sounds/phonetic/h_p.gsm
new file mode 100755
index 000000000..fea0828b4
--- /dev/null
+++ b/sounds/phonetic/h_p.gsm
Binary files differ
diff --git a/sounds/phonetic/i_p.gsm b/sounds/phonetic/i_p.gsm
new file mode 100755
index 000000000..24abc33f9
--- /dev/null
+++ b/sounds/phonetic/i_p.gsm
Binary files differ
diff --git a/sounds/phonetic/j_p.gsm b/sounds/phonetic/j_p.gsm
new file mode 100755
index 000000000..32c1311ee
--- /dev/null
+++ b/sounds/phonetic/j_p.gsm
Binary files differ
diff --git a/sounds/phonetic/k_p.gsm b/sounds/phonetic/k_p.gsm
new file mode 100755
index 000000000..c26d96685
--- /dev/null
+++ b/sounds/phonetic/k_p.gsm
Binary files differ
diff --git a/sounds/phonetic/l_p.gsm b/sounds/phonetic/l_p.gsm
new file mode 100755
index 000000000..0775e96e3
--- /dev/null
+++ b/sounds/phonetic/l_p.gsm
Binary files differ
diff --git a/sounds/phonetic/m_p.gsm b/sounds/phonetic/m_p.gsm
new file mode 100755
index 000000000..7d3c66f03
--- /dev/null
+++ b/sounds/phonetic/m_p.gsm
Binary files differ
diff --git a/sounds/phonetic/n_p.gsm b/sounds/phonetic/n_p.gsm
new file mode 100755
index 000000000..f399f3702
--- /dev/null
+++ b/sounds/phonetic/n_p.gsm
Binary files differ
diff --git a/sounds/phonetic/o_p.gsm b/sounds/phonetic/o_p.gsm
new file mode 100755
index 000000000..d9de39c73
--- /dev/null
+++ b/sounds/phonetic/o_p.gsm
@@ -0,0 +1,2 @@
+sP VeU$dyeVѹ[#[#PJB#x\zIܘFVT 6rԷjI"v.՛*{uL3:Ij1]7ZIdkQFEz:#Զ<,H1Q=ܡ#!]i^[TC
+C򼡣fϑQDZ-=ӱKeCdY#DLQ3YISD0;K%ӭRiSe5S2pSd\fй*j^U(8]JSF[Ԩ Vt&Oj֙ǏKXձQW^NufF)ûֵdI ڏ'SV.DqyS0 BS"snzٯJ(MNZ´i>*dIS`qD1]řh㎣V[}/͹q&_iG24bqJײ͒ae6">1A 2A6ao,@|=.l@m@HfBբQٸ J܉bZQ% I3<@7cn&سmqƒ}4hIr#$𤌢שbE'Br.dykzĴ ]Yj")$P62H[E! hsԢUYIxc-d]dmB]'qT.9+Ea(8ucHFL& )ƨ[œEȇbNgzǦomh)"(KkdFSkńlG"o'Mfmo2ժ:el LmG52IDpcs\Į۩4P4axq"#hrcm*5bnS,D+yCXJwB6vx3zHk:vؒM cTQ$D:v ί֫B!ª۾Ckz(4bw2N&-x؈Y k6q3MFӉD~T|%7m4״Ki'^؁5%rWn(Q:ؠZԸBR׵sP@r#`ePl @$+ v@' \ No newline at end of file
diff --git a/sounds/phonetic/p_p.gsm b/sounds/phonetic/p_p.gsm
new file mode 100755
index 000000000..bb5ce8631
--- /dev/null
+++ b/sounds/phonetic/p_p.gsm
Binary files differ
diff --git a/sounds/phonetic/q_p.gsm b/sounds/phonetic/q_p.gsm
new file mode 100755
index 000000000..8dfdb5e05
--- /dev/null
+++ b/sounds/phonetic/q_p.gsm
Binary files differ
diff --git a/sounds/phonetic/r_p.gsm b/sounds/phonetic/r_p.gsm
new file mode 100755
index 000000000..47d554651
--- /dev/null
+++ b/sounds/phonetic/r_p.gsm
Binary files differ
diff --git a/sounds/phonetic/s_p.gsm b/sounds/phonetic/s_p.gsm
new file mode 100755
index 000000000..8a85860a5
--- /dev/null
+++ b/sounds/phonetic/s_p.gsm
Binary files differ
diff --git a/sounds/phonetic/t_p.gsm b/sounds/phonetic/t_p.gsm
new file mode 100755
index 000000000..3701e08c6
--- /dev/null
+++ b/sounds/phonetic/t_p.gsm
Binary files differ
diff --git a/sounds/phonetic/u_p.gsm b/sounds/phonetic/u_p.gsm
new file mode 100755
index 000000000..39b388834
--- /dev/null
+++ b/sounds/phonetic/u_p.gsm
Binary files differ
diff --git a/sounds/phonetic/v_p.gsm b/sounds/phonetic/v_p.gsm
new file mode 100755
index 000000000..ad9073501
--- /dev/null
+++ b/sounds/phonetic/v_p.gsm
Binary files differ
diff --git a/sounds/phonetic/w_p.gsm b/sounds/phonetic/w_p.gsm
new file mode 100755
index 000000000..9d2199c10
--- /dev/null
+++ b/sounds/phonetic/w_p.gsm
Binary files differ
diff --git a/sounds/phonetic/x_p.gsm b/sounds/phonetic/x_p.gsm
new file mode 100755
index 000000000..86269a9be
--- /dev/null
+++ b/sounds/phonetic/x_p.gsm
Binary files differ
diff --git a/sounds/phonetic/y_p.gsm b/sounds/phonetic/y_p.gsm
new file mode 100755
index 000000000..ce70b0609
--- /dev/null
+++ b/sounds/phonetic/y_p.gsm
Binary files differ
diff --git a/sounds/phonetic/z_p.gsm b/sounds/phonetic/z_p.gsm
new file mode 100755
index 000000000..e7165c1e9
--- /dev/null
+++ b/sounds/phonetic/z_p.gsm
Binary files differ