diff --git a/apps/Makefile b/apps/Makefile index 773eb535fe15bbd9e02f5b905539f9cf6903bc8d..fd5eaac36566c9a81afef6adab30308caf710d05 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -11,7 +11,7 @@ # the GNU General Public License # -APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so +APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so app_system.so app_echo.so CFLAGS+= diff --git a/apps/app_echo.c b/apps/app_echo.c new file mode 100755 index 0000000000000000000000000000000000000000..370dc68636e6b7d183f038d3f37dfee0c0394df3 --- /dev/null +++ b/apps/app_echo.c @@ -0,0 +1,80 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Echo application -- play back what you hear to evaluate latency + * + * Copyright (C) 1999, Mark Spencer + * + * Mark Spencer <markster@linux-support.net> + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include <asterisk/file.h> +#include <asterisk/logger.h> +#include <asterisk/channel.h> +#include <asterisk/pbx.h> +#include <asterisk/module.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <stdlib.h> + +#include <pthread.h> + + +static char *tdesc = "Simple Echo Application"; + +static char *app = "Echo"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +static int skel_exec(struct ast_channel *chan, void *data) +{ + int res=-1; + struct localuser *u; + struct ast_frame *f; + LOCAL_USER_ADD(u); + /* Do our thing here */ + while((f = ast_read(chan))) { + if (f->frametype == AST_FRAME_VOICE) { + if (ast_write(chan, f)) + break; + } else if (f->frametype == AST_FRAME_DTMF) { + if (f->subclass == '#') { + res = 0; + break; + } else + if (ast_write(chan, f)) + break; + } + } + LOCAL_USER_REMOVE(u); + return res; +} + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app); +} + +int load_module(void) +{ + return ast_register_application(app, skel_exec); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} diff --git a/apps/app_skel.c b/apps/app_skel.c index e766d1142bd7b3a3d93317b9004ac978d06c6e09..419b8f40a0587d578b0cc939461f89fca526ce17 100755 --- a/apps/app_skel.c +++ b/apps/app_skel.c @@ -15,6 +15,7 @@ #include <asterisk/logger.h> #include <asterisk/channel.h> #include <asterisk/pbx.h> +#include <asterisk/module.h> #include <stdlib.h> #include <unistd.h> #include <string.h> @@ -22,63 +23,32 @@ #include <pthread.h> -static pthread_mutex_t skellock = PTHREAD_MUTEX_INITIALIZER; - -static int usecnt=0; static char *tdesc = "Trivial skeleton Application"; static char *app = "skel"; -struct skeluser { - struct ast_channel *chan; - struct skeluser *next; -} *users = NULL; +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; static int skel_exec(struct ast_channel *chan, void *data) { int res=0; - struct skeluser *u, *ul=NULL; + struct localuser *u; if (!data) { ast_log(LOG_WARNING, "skel requires an argument (filename)\n"); return -1; } - if (!(u=malloc(sizeof(struct skeluser)))) { - ast_log(LOG_WARNING, "Out of memory\n"); - return -1; - } - pthread_mutex_lock(&skellock); - u->chan = chan; - u->next = users; - users = u; - usecnt++; - pthread_mutex_unlock(&skellock); + LOCAL_USER_ADD(u); /* Do our thing here */ - pthread_mutex_lock(&skellock); - u = users; - while(u) { - if (ul) - ul->next = u->next; - else - users = u->next; - u = u->next; - } - usecnt--; - pthread_mutex_unlock(&skellock); + LOCAL_USER_REMOVE(u); return res; } int unload_module(void) { - struct skeluser *u; - pthread_mutex_lock(&skellock); - u = users; - while(u) { - /* Hang up anybody who is using us */ - ast_softhangup(u->chan); - u = u->next; - } - pthread_mutex_unlock(&skellock); + STANDARD_HANGUP_LOCALUSERS; return ast_unregister_application(app); } @@ -95,8 +65,6 @@ char *description(void) int usecount(void) { int res; - pthread_mutex_lock(&skellock); - res = usecnt; - pthread_mutex_unlock(&skellock); + STANDARD_USECOUNT(res); return res; } diff --git a/apps/app_system.c b/apps/app_system.c new file mode 100755 index 0000000000000000000000000000000000000000..7e140a427833c0a922ac6ef08548e59aea0aace6 --- /dev/null +++ b/apps/app_system.c @@ -0,0 +1,82 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Execute arbitrary system commands + * + * Copyright (C) 1999, Mark Spencer + * + * Mark Spencer <markster@linux-support.net> + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include <asterisk/file.h> +#include <asterisk/logger.h> +#include <asterisk/channel.h> +#include <asterisk/pbx.h> +#include <asterisk/module.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <stdlib.h> + +#include <pthread.h> + + +static char *tdesc = "Generic System() application"; + +static char *app = "System"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +static int skel_exec(struct ast_channel *chan, void *data) +{ + int res=0; + struct localuser *u; + if (!data) { + ast_log(LOG_WARNING, "System requires an argument(command)\n"); + return -1; + } + LOCAL_USER_ADD(u); + /* Do our thing here */ + res = system((char *)data); + if (res < 0) { + ast_log(LOG_WARNING, "Unable to execute '%s'\n", data); + res = -1; + } else if (res == 127) { + ast_log(LOG_WARNING, "Unable to execute '%s'\n", data); + res = -1; + } else { + if (res && ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101)) + chan->priority+=100; + res = 0; + } + LOCAL_USER_REMOVE(u); + return res; +} + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app); +} + +int load_module(void) +{ + return ast_register_application(app, skel_exec); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index f2893b3f62bae1e9fed4b07a13bb81a04fd070c5..8fc6f500ff58e117e4e4beb4d72a5d3880637620 100755 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -141,7 +141,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent) struct ast_config *cfg; char *copy, *name, *passwd, *email, *dir, *fmt, *fmts, *fn=NULL; char comment[256]; - struct ast_filestream *writer, *others[MAX_OTHER_FORMATS]; + struct ast_filestream *writer=NULL, *others[MAX_OTHER_FORMATS]; char *sfmt[MAX_OTHER_FORMATS]; int res = -1, fmtcnt=0, x; int msgnum; @@ -182,8 +182,12 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent) snprintf(comment, sizeof(comment), "Voicemail from %s to %s (%s) on %s\n", (chan->callerid ? chan->callerid : "Unknown"), name, ext, chan->name); + if (ast_fileexists(fn, NULL) > 0) { + msgnum++; + continue; + } writer = ast_writefile(fn, fmt, comment, O_EXCL, 1 /* check for other formats */, 0700); - if (!writer && (errno != EEXIST)) + if (!writer) break; msgnum++; } while(!writer && (msgnum < MAXMSG)); @@ -221,9 +225,14 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent) if (f->frametype == AST_FRAME_VOICE) { /* Write the primary format */ res = ast_writestream(writer, f); + if (res) { + ast_log(LOG_WARNING, "Error writing primary frame\n"); + break; + } /* And each of the others */ - for (x=0;x<fmtcnt;x++) + for (x=0;x<fmtcnt;x++) { res |= ast_writestream(others[x], f); + } ast_frfree(f); /* Exit on any error */ if (res) { @@ -314,20 +323,30 @@ static int vm_execmain(struct ast_channel *chan, void *data) ast_log(LOG_WARNING, "No voicemail configuration\n"); goto out; } - if (ast_streamfile(chan, "vm-login")) + if (ast_streamfile(chan, "vm-login")) { + ast_log(LOG_WARNING, "Couldn't stream login file\n"); goto out; + } do { /* Prompt for, and read in the username */ - if (ast_readstring(chan, username, sizeof(username), 2000, 5000, "#")) + if (ast_readstring(chan, username, sizeof(username), 2000, 5000, "#")) { + ast_log(LOG_WARNING, "Couldn't read username\n"); goto out; + } if (!strlen(username)) { + if (option_verbose > 2) + ast_verbose(VERBOSE_PREFIX_3 "Username not entered\n"); res = 0; goto out; } - if (ast_streamfile(chan, "vm-password")) + if (ast_streamfile(chan, "vm-password")) { + ast_log(LOG_WARNING, "Unable to stream password file\n"); goto out; - if (ast_readstring(chan, password, sizeof(password), 2000, 5000, "#")) + } + if (ast_readstring(chan, password, sizeof(password), 2000, 5000, "#")) { + ast_log(LOG_WARNING, "Unable to read password\n"); goto out; + } copy = ast_variable_retrieve(cfg, NULL, username); if (copy) { copy = strdup(copy); diff --git a/asterisk.c b/asterisk.c index a79474077bd9c913fd7613c8f2a9b5b13151b326..bec0894aee19d07b8f4f38bcaa2e7f2e86116bcc 100755 --- a/asterisk.c +++ b/asterisk.c @@ -28,7 +28,9 @@ int option_verbose=0; int option_debug=0; int option_nofork=0; int option_quiet=0; +int option_console=0; int option_highpriority=0; +int fully_booted = 0; #define HIGH_PRIORITY 1 #define HIGH_PRIORITY_SCHED SCHED_RR @@ -39,6 +41,7 @@ static void urg_handler(int num) system call. We don't actually need to do anything though. */ if (option_debug) ast_log(LOG_DEBUG, "Urgent handler\n"); + signal(num, urg_handler); return; } @@ -89,6 +92,7 @@ static void console_verboser(char *s, int pos, int replace, int complete) if (!pos) fprintf(stdout, "\r"); fprintf(stdout, s + pos); + fflush(stdout); if (complete) /* Wake up a select()ing console */ pthread_kill(consolethread, SIGURG); @@ -99,8 +103,19 @@ static void consolehandler(char *s) /* Called when readline data is available */ if (s && strlen(s)) add_history(s); - if (s) + /* Give the console access to the shell */ + if (s) { + if (s[0] == '!') { + if (s[1]) + system(s+1); + else + system(getenv("SHELL") ? getenv("SHELL") : "/bin/sh"); + } else ast_cli_command(STDOUT_FILENO, s); + if (!strcasecmp(s, "help")) + fprintf(stdout, " !<command> Executes a given shell command\n"); + } else + fprintf(stdout, "\nUse \"quit\" to exit\n"); } static char quit_help[] = @@ -138,17 +153,21 @@ int main(int argc, char *argv[]) exit(1); } /* Check for options */ - while((c=getopt(argc, argv, "dvqp")) != EOF) { + while((c=getopt(argc, argv, "dvqpc")) != EOF) { switch(c) { case 'd': option_debug++; option_nofork++; break; + case 'c': + option_console++; + option_nofork++; case 'p': option_highpriority++; break; case 'v': option_verbose++; + option_nofork++; break; case 'q': option_quiet++; @@ -157,12 +176,15 @@ int main(int argc, char *argv[]) exit(1); } } + ast_register_verbose(console_verboser); /* Print a welcome message if desired */ - if (option_verbose) { + if (option_verbose || option_console) { ast_verbose( "Asterisk, Copyright (C) 1999 Mark Spencer\n"); ast_verbose( "Written by Mark Spencer <markster@linux-support.net>\n"); ast_verbose( "=========================================================================\n"); } + if (option_console && !option_verbose) + ast_verbose("[ Booting..."); signal(SIGURG, urg_handler); signal(SIGINT, quit_handler); signal(SIGTERM, quit_handler); @@ -177,28 +199,34 @@ int main(int argc, char *argv[]) exit(1); /* We might have the option of showing a console, but for now just do nothing... */ - - /* Console stuff now... */ - /* Register our quit function */ - ast_cli_register(&quit); - consolethread = pthread_self(); - ast_register_verbose(console_verboser); - if (option_verbose) + if (option_console && !option_verbose) + ast_verbose(" ]\n"); + if (option_verbose || option_console) ast_verbose( "Asterisk Ready.\n"); - if (strlen(filename)) - read_history(filename); - rl_callback_handler_install(ASTERISK_PROMPT, consolehandler); - rl_completion_entry_function = (Function *)cli_generator; - for(;;) { - FD_ZERO(&rfds); - FD_SET(STDIN_FILENO, &rfds); - res = select(STDIN_FILENO + 1, &rfds, NULL, NULL, NULL); - if (res > 0) { - rl_callback_read_char(); - } else if (res < 1) { - rl_forced_update_display(); - } - - } + fully_booted = 1; + if (option_console) { + /* Console stuff now... */ + /* Register our quit function */ + ast_cli_register(&quit); + consolethread = pthread_self(); + if (strlen(filename)) + read_history(filename); + rl_callback_handler_install(ASTERISK_PROMPT, consolehandler); + rl_completion_entry_function = (Function *)cli_generator; + for(;;) { + FD_ZERO(&rfds); + FD_SET(STDIN_FILENO, &rfds); + res = select(STDIN_FILENO + 1, &rfds, NULL, NULL, NULL); + if (res > 0) { + rl_callback_read_char(); + } else if (res < 1) { + rl_forced_update_display(); + } + + } + } else { + /* Do nothing */ + select(0,NULL,NULL,NULL,NULL); + } return 0; } diff --git a/channel.c b/channel.c index 0a18b28187e209c942f68230f87ca9ca4419d4d8..881e291cf6e4abec959482a46d33f8550923f0ea 100755 --- a/channel.c +++ b/channel.c @@ -18,6 +18,7 @@ #include <sys/time.h> #include <signal.h> #include <errno.h> +#include <unistd.h> #include <asterisk/sched.h> #include <asterisk/options.h> #include <asterisk/channel.h> @@ -26,6 +27,27 @@ #include <asterisk/file.h> #include <asterisk/translate.h> + + +#ifdef DEBUG_MUTEX +/* Convenient mutex debugging functions */ +#define PTHREAD_MUTEX_LOCK(a) __PTHREAD_MUTEX_LOCK(__FUNCTION__, a) +#define PTHREAD_MUTEX_UNLOCK(a) __PTHREAD_MUTEX_UNLOCK(__FUNCTION__, a) + +static int __PTHREAD_MUTEX_LOCK(char *f, pthread_mutex_t *a) { + ast_log(LOG_DEBUG, "Locking %p (%s)\n", a, f); + return pthread_mutex_lock(a); +} + +static int __PTHREAD_MUTEX_UNLOCK(char *f, pthread_mutex_t *a) { + ast_log(LOG_DEBUG, "Unlocking %p (%s)\n", a, f); + return pthread_mutex_unlock(a); +} +#else +#define PTHREAD_MUTEX_LOCK(a) pthread_mutex_lock(a) +#define PTHREAD_MUTEX_UNLOCK(a) pthread_mutex_unlock(a) +#endif + struct chanlist { char type[80]; char description[80]; @@ -33,7 +55,6 @@ struct chanlist { struct ast_channel * (*requester)(char *type, int format, void *data); struct chanlist *next; } *backends = NULL; - struct ast_channel *channels = NULL; /* Protect the channel list (highly unlikely that two things would change @@ -45,7 +66,7 @@ int ast_channel_register(char *type, char *description, int capabilities, struct ast_channel *(*requester)(char *type, int format, void *data)) { struct chanlist *chan, *last=NULL; - if (pthread_mutex_lock(&chlock)) { + if (PTHREAD_MUTEX_LOCK(&chlock)) { ast_log(LOG_WARNING, "Unable to lock channel list\n"); return -1; } @@ -53,7 +74,7 @@ int ast_channel_register(char *type, char *description, int capabilities, while(chan) { if (!strcasecmp(type, chan->type)) { ast_log(LOG_WARNING, "Already have a handler for type '%s'\n", type); - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); return -1; } last = chan; @@ -62,7 +83,7 @@ int ast_channel_register(char *type, char *description, int capabilities, chan = malloc(sizeof(struct chanlist)); if (!chan) { ast_log(LOG_WARNING, "Out of memory\n"); - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); return -1; } strncpy(chan->type, type, sizeof(chan->type)); @@ -78,7 +99,7 @@ int ast_channel_register(char *type, char *description, int capabilities, ast_log(LOG_DEBUG, "Registered handler for '%s' (%s)\n", chan->type, chan->description); else if (option_verbose > 1) ast_verbose( VERBOSE_PREFIX_2 "Registered channel type '%s' (%s)\n", chan->type, chan->description); - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); return 0; } @@ -86,7 +107,7 @@ struct ast_channel *ast_channel_alloc(void) { struct ast_channel *tmp; struct ast_channel_pvt *pvt; - pthread_mutex_lock(&chlock); + PTHREAD_MUTEX_LOCK(&chlock); tmp = malloc(sizeof(struct ast_channel)); memset(tmp, 0, sizeof(struct ast_channel)); if (tmp) { @@ -121,17 +142,17 @@ struct ast_channel *ast_channel_alloc(void) } } else ast_log(LOG_WARNING, "Out of memory\n"); - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); return tmp; } struct ast_channel *ast_channel_walk(struct ast_channel *prev) { struct ast_channel *l, *ret=NULL; - pthread_mutex_lock(&chlock); + PTHREAD_MUTEX_LOCK(&chlock); l = channels; if (!prev) { - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); return l; } while(l) { @@ -139,7 +160,7 @@ struct ast_channel *ast_channel_walk(struct ast_channel *prev) ret = l->next; l = l->next; } - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); return ret; } @@ -147,7 +168,7 @@ struct ast_channel *ast_channel_walk(struct ast_channel *prev) void ast_channel_free(struct ast_channel *chan) { struct ast_channel *last=NULL, *cur; - pthread_mutex_lock(&chlock); + PTHREAD_MUTEX_LOCK(&chlock); cur = channels; while(cur) { if (cur == chan) { @@ -174,7 +195,7 @@ void ast_channel_free(struct ast_channel *chan) free(chan->callerid); pthread_mutex_destroy(&chan->lock); free(chan); - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); } int ast_softhangup(struct ast_channel *chan) @@ -220,7 +241,7 @@ void ast_channel_unregister(char *type) struct chanlist *chan, *last=NULL; if (option_debug) ast_log(LOG_DEBUG, "Unregistering channel type '%s'\n", type); - if (pthread_mutex_lock(&chlock)) { + if (PTHREAD_MUTEX_LOCK(&chlock)) { ast_log(LOG_WARNING, "Unable to lock channel list\n"); return; } @@ -232,13 +253,13 @@ void ast_channel_unregister(char *type) else backends = backends->next; free(chan); - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); return; } last = chan; chan = chan->next; } - pthread_mutex_unlock(&chlock); + PTHREAD_MUTEX_UNLOCK(&chlock); } int ast_answer(struct ast_channel *chan) @@ -392,7 +413,7 @@ struct ast_channel *ast_request(char *type, int format, void *data) { struct chanlist *chan; struct ast_channel *c = NULL; - if (pthread_mutex_lock(&chlock)) { + if (PTHREAD_MUTEX_LOCK(&chlock)) { ast_log(LOG_WARNING, "Unable to lock channel list\n"); return NULL; } @@ -402,15 +423,16 @@ struct ast_channel *ast_request(char *type, int format, void *data) if (!(chan->capabilities & format)) { format = ast_translator_best_choice(format, chan->capabilities); } + PTHREAD_MUTEX_UNLOCK(&chlock); if (chan->requester) c = chan->requester(type, format, data); - pthread_mutex_unlock(&chlock); - break; + return c; } chan = chan->next; } if (!chan) ast_log(LOG_WARNING, "No channel type registered for '%s'\n", type); + PTHREAD_MUTEX_UNLOCK(&chlock); return c; } @@ -433,9 +455,10 @@ int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int fti if (!len) return -1; do { - if (c->streamid > -1) { + if ((c->streamid > -1) || (c->trans && (c->trans->streamid > -1))) { d = ast_waitstream(c, AST_DIGIT_ANY); ast_stopstream(c); + usleep(1000); if (!d) d = ast_waitfordigit(c, to); } else { diff --git a/codecs/codec_g723_1.c b/codecs/codec_g723_1.c index 89d2be760467bf51bef5ec6398a5067ce6dd50ea..b71e28cc2d389db3c29880d7ebce32c9f8e32308 100755 --- a/codecs/codec_g723_1.c +++ b/codecs/codec_g723_1.c @@ -200,7 +200,7 @@ static int g723tolin_framein(struct ast_translator_pvt *pvt, struct ast_frame *f #ifdef ANNEX_B Decod(&tmp->dec, tmpdata, f->data, 0); for (x=0;x<Frame;x++) - (tmp->buf + tmp->tail)[x] = tmpdata[x]; + (tmp->buf + tmp->tail)[x] = (short)tmpdata[x]; #else Decod(&tmp->dec, tmp->buf + tmp->tail, f->data, 0); #endif diff --git a/configs/adtranvofr.conf.sample b/configs/adtranvofr.conf.sample index df19e094eb195377df0bfd52945b85c530356773..efd6af3f0beecfb8557f6218090ec2e6a795a91c 100755 --- a/configs/adtranvofr.conf.sample +++ b/configs/adtranvofr.conf.sample @@ -6,8 +6,10 @@ [interfaces] ; ; Lines for which we are the user termination. They accept incoming -; and outgoing calls. +; and outgoing calls. We use the default context on the first 8 lines +; used by internal phones. ; +context=default ;user=voice00 ;user=voice01 ;user=voice02 @@ -16,15 +18,11 @@ ;user=voice05 ;user=voice06 ;user=voice07 -context=default -user=voice13 -user=voice14 -user=voice15 ; Calls on 16 and 17 come from the outside world, so they get ; a little bit special treatment context=remote -user=voice16 -user=voice17 +;user=voice16 +;user=voice17 ; ; Next we have lines which we only accept calls on, and typically ; do not send outgoing calls on (i.e. these are where we are the diff --git a/configs/modem.conf.sample b/configs/modem.conf.sample index 27b3230f49062ef6e84a4a818cf4af40c9666c93..d5989b4779b761fd41147bdf273c8ec729fcafea 100755 --- a/configs/modem.conf.sample +++ b/configs/modem.conf.sample @@ -26,8 +26,8 @@ stripmsd=1 ; ; Type of dialing ; -;dialtype=tone -dialtype=pulse +dialtype=tone +;dialtype=pulse ; ; Mode selection. "Immediate" means that as soon as you dial, you're connected ; and the line is considered up. "Ring" means we wait until the ring cadence @@ -39,4 +39,4 @@ mode=immediate ; ; List all devices we can use. ; -device=/dev/ttyS3 +;device=/dev/ttyS3 diff --git a/configs/modules.conf.sample b/configs/modules.conf.sample index 2fe03093b4a20c8941694b166f590499a02105d9..2b32e1b0937c37946034c49f3cdd2deb2d110863 100755 --- a/configs/modules.conf.sample +++ b/configs/modules.conf.sample @@ -3,12 +3,26 @@ ; ; Module Loader configuration file ; + [modules] autoload=yes -;load=pbx_gtkconsole.so +; +; If you want, load the GTK console right away. +; Don't load the KDE console since +; it's not as sophisticated right now. +; noload=pbx_gtkconsole.so +;load=pbx_gtkconsole.so noload=pbx_kdeconsole.so +; +; Intercom application is obsoleted by +; chan_oss. Don't load it. +; noload=app_intercom.so -;load=chan_vofr.so -;load=chan_h323.so +; +; Module names listed in "global" section will have symbols globally +; exported to modules loaded after them. +; +[global] +chan_modem.so=yes diff --git a/configs/voicemail.conf.sample b/configs/voicemail.conf.sample index dcf3d0f8f12d00bcef6f764c8497480a10a2e6dd..ce36a3b6601f4dcd7020b17c4ed8b69fb7242281 100755 --- a/configs/voicemail.conf.sample +++ b/configs/voicemail.conf.sample @@ -2,13 +2,19 @@ ; Voicemail Configuration ; [general] -; Default format for writing Voicemail -; format=g723sf|rawgsm|mp3|wav -format=g723sf|wav49|wav +; Default formats for writing Voicemail +;format=g723sf|wav49|wav +format=gsm|wav49|wav +; +; Each mailbox is listed in the form <mailbox>=<password>,<name>,<email> +; if the e-mail is specified, a message will be sent when a message is +; received, to the given mailbox. +; [default] -4200=2345,Mark Spencer,markster@linux-support.net -4300=2345,Ben Rigas,ben@american-computer.net -4310=2345,Sales,sales@marko.net -4069=2345,Matt Brooks,matt@marko.net -4110=1379,Rob Flynn,rflynn@blueridge.net +1234=4242,Example Mailbox,root@localhost +;4200=9855,Mark Spencer,markster@linux-support.net +;4300=3456,Ben Rigas,ben@american-computer.net +;4310=5432,Sales,sales@marko.net +;4069=6522,Matt Brooks,matt@marko.net +;4110=3443,Rob Flynn,rflynn@blueridge.net diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 425eb2e304501df529a3997635f3d569ad9a68ed..d78c490d1d6fcece0e0fe98633b41ba4bd52ab90 100755 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -143,12 +143,14 @@ char ast_waitfordigit(struct ast_channel *c, int ms); for the first digit */ int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders); #define CHECK_BLOCKING(c) { \ - if ((c)->blocking) \ + if ((c)->blocking) {\ ast_log(LOG_WARNING, "Blocking '%s', already blocked by thread %ld in procedure %s\n", (c)->name, (c)->blocker, (c)->blockproc); \ - else { \ + /* *((int *)0)=0; */ \ + } else { \ (c)->blocker = pthread_self(); \ (c)->blockproc = __PRETTY_FUNCTION__; \ - c->blocking = -1; } } + c->blocking = -1; \ + } } #if defined(__cplusplus) || defined(c_plusplus) } diff --git a/loader.c b/loader.c index d6a549b4b1a124e6e04f55974dd3d69cba0d7053..63c44df40c917c24aeb1015439917a165755d303 100755 --- a/loader.c +++ b/loader.c @@ -92,6 +92,22 @@ int ast_load_resource(char *resource_name) int errors=0; int res; struct module *m; + int flags=0; + char *val; + int o; + struct ast_config *cfg; + /* Keep the module file parsing silent */ + o = option_verbose; + option_verbose = 0; + cfg = ast_load(AST_MODULE_CONFIG); + option_verbose = o; + if (cfg) { + if ((val = ast_variable_retrieve(cfg, "global", resource_name)) + && ast_true(val)) + flags |= RTLD_GLOBAL; + ast_destroy(cfg); + } + if (pthread_mutex_lock(&modlock)) ast_log(LOG_WARNING, "Failed to lock\n"); m = module_list; @@ -115,7 +131,7 @@ int ast_load_resource(char *resource_name) } else { snprintf(fn, sizeof(fn), "%s/%s", AST_MODULE_DIR, resource_name); } - m->lib = dlopen(fn, RTLD_NOW | RTLD_GLOBAL); + m->lib = dlopen(fn, RTLD_NOW | flags); if (!m->lib) { ast_log(LOG_WARNING, "%s\n", dlerror()); free(m); @@ -149,16 +165,24 @@ int ast_load_resource(char *resource_name) pthread_mutex_unlock(&modlock); return -1; } - if (option_verbose) - ast_verbose( " => (%s)\n", m->description()); + if (!fully_booted) { + if (option_verbose) + ast_verbose( " => (%s)\n", m->description()); + if (option_console && !option_verbose) + ast_verbose( "."); + } else { + if (option_verbose) + ast_verbose(VERBOSE_PREFIX_1 "Loaded %s => (%s)\n", fn, m->description()); + } + m->next = module_list; + module_list = m; pthread_mutex_unlock(&modlock); if ((res = m->load_module())) { - ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, fn, res); + ast_log(LOG_WARNING, "%s: load_module failed, returning %d\n", m->resource, res); ast_unload_resource(resource_name, 0); return -1; } - m->next = module_list; - module_list = m; + ast_update_use_count(); return 0; } diff --git a/pbx/pbx_gtkconsole.c b/pbx/pbx_gtkconsole.c index 1aefa4ca884f3c36d0346a5b375bf216184f0e25..52a4ecb980bb51350cb8f6987d508e6e1d7d7e18 100755 --- a/pbx/pbx_gtkconsole.c +++ b/pbx/pbx_gtkconsole.c @@ -25,12 +25,15 @@ #include <asterisk/module.h> #include <asterisk/logger.h> #include <asterisk/options.h> +#include <asterisk/cli.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdarg.h> +#include <sys/time.h> +#include <sys/signal.h> #include <gtk/gtk.h> #include <glib.h> @@ -42,6 +45,9 @@ static pthread_mutex_t verb_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_t console_thread; static int inuse=0; +static int clipipe[2]; +static int cleanupid = -1; + static char *dtext = "Asterisk PBX Console (GTK Version)"; static GtkWidget *window; @@ -50,6 +56,9 @@ static GtkWidget *closew; static GtkWidget *verb; static GtkWidget *modules; static GtkWidget *statusbar; +static GtkWidget *cli; + +static struct timeval last; static void update_statusbar(char *msg) { @@ -65,26 +74,101 @@ int unload_module(void) gdk_threads_enter(); gtk_widget_destroy(window); gdk_threads_leave(); + close(clipipe[0]); + close(clipipe[1]); } return 0; } +static int cleanup(void *useless) +{ + gdk_threads_enter(); + gtk_clist_thaw(GTK_CLIST(verb)); + gtk_widget_queue_resize(verb->parent); + gtk_clist_moveto(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1, 0, 0, 0); + cleanupid = -1; + gdk_threads_leave(); + return 0; +} + -static void verboser(char *stuff, int opos, int replacelast, int complete) +static void __verboser(char *stuff, int opos, int replacelast, int complete) { char *s2[2]; - pthread_mutex_lock(&verb_lock); + struct timeval tv; + int ms; s2[0] = stuff; s2[1] = NULL; - gdk_threads_enter(); + gtk_clist_freeze(GTK_CLIST(verb)); if (replacelast) gtk_clist_remove(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1); gtk_clist_append(GTK_CLIST(verb), s2); - gtk_clist_moveto(GTK_CLIST(verb), GTK_CLIST(verb)->rows - 1, 0, 0, 0); - gdk_threads_leave(); + if (last.tv_sec || last.tv_usec) { + gdk_threads_leave(); + gettimeofday(&tv, NULL); + if (cleanupid > -1) + gtk_timeout_remove(cleanupid); + ms = (tv.tv_sec - last.tv_sec) * 1000 + (tv.tv_usec - last.tv_usec) / 1000; + if (ms < 100) { + /* We just got a message within 100ms, so just schedule an update + in the near future */ + cleanupid = gtk_timeout_add(200, cleanup, NULL); + } else { + cleanup(&cleanupid); + } + last = tv; + } else { + gettimeofday(&last, NULL); + } +} + +static void verboser(char *stuff, int opos, int replacelast, int complete) +{ + pthread_mutex_lock(&verb_lock); + /* Lock appropriately if we're really being called in verbose mode */ + __verboser(stuff, opos, replacelast, complete); pthread_mutex_unlock(&verb_lock); } +static void cliinput(void *data, int source, GdkInputCondition ic) +{ + static char buf[256]; + static int offset = 0; + int res; + char *c; + char *l; + char n; + /* Read as much stuff is there */ + res = read(source, buf + offset, sizeof(buf) - 1 - offset); + if (res > -1) + buf[res + offset] = '\0'; + /* make sure we've null terminated whatever we have so far */ + c = buf; + l = buf; + while(*c) { + if (*c == '\n') { + /* Keep the trailing \n */ + c++; + n = *c; + *c = '\0'; + __verboser(l, 0, 0, 1); + *(c - 1) = '\0'; + *c = n; + l = c; + } else + c++; + } + if (strlen(l)) { + /* We have some left over */ + memmove(buf, l, strlen(l) + 1); + offset = strlen(buf); + } else { + offset = 0; + } + +} + + static void remove_module() { int res; @@ -194,14 +278,12 @@ static int mod_update(void) if (GTK_CLIST(modules)->selection) { module= (char *)gtk_clist_get_row_data(GTK_CLIST(modules), (int) GTK_CLIST(modules)->selection->data); } - gdk_threads_enter(); gtk_clist_freeze(GTK_CLIST(modules)); gtk_clist_clear(GTK_CLIST(modules)); ast_update_module_list(add_mod); if (module) gtk_clist_select_row(GTK_CLIST(modules), gtk_clist_find_row_from_data(GTK_CLIST(modules), module), -1); gtk_clist_thaw(GTK_CLIST(modules)); - gdk_threads_leave(); return 1; } @@ -220,8 +302,12 @@ static void exit_now(GtkWidget *widget, gpointer data) static void exit_completely(GtkWidget *widget, gpointer data) { - /* This is the wrong way to do this. We need an ast_clean_exit() routine */ - exit(0); +#if 0 + /* Clever... */ + ast_cli_command(clipipe[1], "quit"); +#else + kill(getpid(), SIGTERM); +#endif } static void exit_nicely(GtkWidget *widget, gpointer data) @@ -239,6 +325,17 @@ static void *consolethread(void *data) return NULL; } +static int cli_activate() +{ + char buf[256]; + strncpy(buf, gtk_entry_get_text(GTK_ENTRY(cli)), sizeof(buf)); + gtk_entry_set_text(GTK_ENTRY(cli), ""); + if (strlen(buf)) { + ast_cli_command(clipipe[1], buf); + } + return TRUE; +} + static int show_console() { GtkWidget *hbox; @@ -276,7 +373,7 @@ static int show_console() gtk_container_add(GTK_CONTAINER(sw), verb); gtk_widget_show(verb); gtk_widget_show(sw); - gtk_widget_set_usize(verb, 600, 400); + gtk_widget_set_usize(verb, 640, 400); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), sw, gtk_label_new("Verbose Status")); @@ -333,14 +430,21 @@ static int show_console() hbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(hbox); + + /* Command line */ + cli = gtk_entry_new(); + gtk_widget_show(cli); + + gtk_signal_connect(GTK_OBJECT(cli), "activate", + GTK_SIGNAL_FUNC (cli_activate), NULL); gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), wbox, FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(hbox), cli, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), statusbar, FALSE, FALSE, 0); - - gtk_container_add(GTK_CONTAINER(window), hbox); gtk_window_set_title(GTK_WINDOW(window), "Asterisk Console"); + gtk_widget_grab_focus(cli); pthread_create(&console_thread, NULL, consolethread, NULL); /* XXX Okay, seriously fix me! XXX */ usleep(100000); @@ -348,6 +452,7 @@ static int show_console() gtk_clist_freeze(GTK_CLIST(verb)); ast_loader_register(mod_update); gtk_clist_thaw(GTK_CLIST(verb)); + gdk_input_add(clipipe[0], GDK_INPUT_READ, cliinput, NULL); mod_update(); update_statusbar("Asterisk Console Ready"); return 0; @@ -356,6 +461,10 @@ static int show_console() int load_module(void) { + if (pipe(clipipe)) { + ast_log(LOG_WARNING, "Unable to create CLI pipe\n"); + return -1; + } g_thread_init(NULL); if (gtk_init_check(NULL, NULL)) { /* XXX Do we need to call this twice? XXX */ diff --git a/say.c b/say.c index c3f5fba5b419b8cf3191dc481036211808ee9072..41b66925e4da9171f051c6a3975eb319d819c2ca 100755 --- a/say.c +++ b/say.c @@ -42,8 +42,13 @@ int ast_say_digits(struct ast_channel *chan, int num) int ast_say_number(struct ast_channel *chan, int num) { int res = 0; + int playh = 0; char fn[256] = ""; while(num && !res) { + if (playh) { + snprintf(fn, sizeof(fn), "digits/hundred"); + playh = 0; + } else if (num < 20) { snprintf(fn, sizeof(fn), "digits/%d", num); num = 0; @@ -52,8 +57,13 @@ int ast_say_number(struct ast_channel *chan, int num) snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10); num -= ((num / 10) * 10); } else { - ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); - res = -1; + if (num < 1000){ + snprintf(fn, sizeof(fn), "digits/%d", (num/100)); + playh++; + } else { + ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); + res = -1; + } } if (!res) { res = ast_streamfile(chan, fn); diff --git a/sounds/beep.gsm b/sounds/beep.gsm new file mode 100755 index 0000000000000000000000000000000000000000..16407f65576c744e8bc988188a958884eb0ab6ab Binary files /dev/null and b/sounds/beep.gsm differ diff --git a/sounds/demo-abouttotry.gsm b/sounds/demo-abouttotry.gsm new file mode 100755 index 0000000000000000000000000000000000000000..2d7842fd31e380d7951363dc83cbb3f1b5bfe85a Binary files /dev/null and b/sounds/demo-abouttotry.gsm differ diff --git a/sounds/demo-congrats.gsm b/sounds/demo-congrats.gsm new file mode 100755 index 0000000000000000000000000000000000000000..c3fa396bac5e19d353176e3475dff06d3d589e81 Binary files /dev/null and b/sounds/demo-congrats.gsm differ diff --git a/sounds/demo-echodone.gsm b/sounds/demo-echodone.gsm new file mode 100755 index 0000000000000000000000000000000000000000..f0d6764f44428a480e40aba6be9e708e395baa98 Binary files /dev/null and b/sounds/demo-echodone.gsm differ diff --git a/sounds/demo-echotest.gsm b/sounds/demo-echotest.gsm new file mode 100755 index 0000000000000000000000000000000000000000..3ad6c2aa45977880f952ec37c53135a2018505a3 Binary files /dev/null and b/sounds/demo-echotest.gsm differ diff --git a/sounds/demo-instruct.gsm b/sounds/demo-instruct.gsm new file mode 100755 index 0000000000000000000000000000000000000000..b40d17212eb92120552ce2fb2177f494b337d19c Binary files /dev/null and b/sounds/demo-instruct.gsm differ diff --git a/sounds/demo-nogo.gsm b/sounds/demo-nogo.gsm new file mode 100755 index 0000000000000000000000000000000000000000..340b3c87062884f95747bc757b9e43926d5274c0 Binary files /dev/null and b/sounds/demo-nogo.gsm differ diff --git a/sounds/demo-thanks.gsm b/sounds/demo-thanks.gsm new file mode 100755 index 0000000000000000000000000000000000000000..6c8b1418f9ac634c5e512ac732229a231b992325 Binary files /dev/null and b/sounds/demo-thanks.gsm differ diff --git a/sounds/digits/0.gsm b/sounds/digits/0.gsm new file mode 100755 index 0000000000000000000000000000000000000000..d7c3be0ae1715bae172b8cee5d42a3206b605037 Binary files /dev/null and b/sounds/digits/0.gsm differ diff --git a/sounds/digits/1.gsm b/sounds/digits/1.gsm new file mode 100755 index 0000000000000000000000000000000000000000..c59f027cd67002407a43dfee8b52a1bfc99059aa Binary files /dev/null and b/sounds/digits/1.gsm differ diff --git a/sounds/digits/10.gsm b/sounds/digits/10.gsm new file mode 100755 index 0000000000000000000000000000000000000000..fd8c88a09fb77fb86661b973df832f6034bbdab1 Binary files /dev/null and b/sounds/digits/10.gsm differ diff --git a/sounds/digits/11.gsm b/sounds/digits/11.gsm new file mode 100755 index 0000000000000000000000000000000000000000..c22cf785bfd6695ff6e08dbf17f338188a7ad3b6 --- /dev/null +++ b/sounds/digits/11.gsm @@ -0,0 +1,5 @@ +Ó™ÕS^ÀͪUe ³M-WƒVÀ¹˜J’[¬¡jm¶éÓè‚#àÀÖ’CKœá8ë1·äÁ8Ô±jMo!¡ú¿iÒv›°sdH±ÛebÂ,]¤Ö…´Ûž%”^$)n8ÄÒkú¥k¤Å¨æòÓ¢ÈãGâµ ˜oŠ6åñ™Ú„–Ód4Ò5ª!kŠ¦Ûè‘ØdŒÃÈ“•;?Œä‹‰×*$&Ür[„Ò1á¤ë¶ƒ%™¶D9^Ô:Ü‘"‘Ú€Æ]‹#ÙðV½Ò4Ð᳉"ó"qÉ/‹!a&€‡â'MðÛÆÃZi”Ò3èis…¹ ²UãÕ!ŽÇ ",ÞöÙ}ⵂW ÒqÑe{{Ç)Ž;o{åƒT²Âw¤4üE(s*(ÛMLþÓs“žywU¨¢rÑI¾-ÄâqPµQúmkMá¤N–ÁÔ/”:qÎ/'je*o³§×˜¤m2äÙ.'oo®+ÓçcÔmœ[xÛ°¶ä7@³ÙQÄêžS\kQ¸ÔjG=ÙPŠ”P¶ÕÔ,¬_pk¯¥Û磌kbñáCisÇf·ÙÓMTÒp6%Ó¬¬_pkPߎUÆÔÓÏVü5wk®Êãxd5n…›1´›Óë“×:kp=ÚRÆ¡ÚíX+»è +ÜJHÉ…„æäÌÿJÇbÓêyÞkî©—“¯h<€Ç9[…¸×~Èh$‰Ê؃솲9[Ôj‚jîÅhÊôfÊ…#›»ñ‹D„¥ÈÄi·¬…^ +r4ìÓjƒgq…¨9Rrþ4¼ˆÐœR„ˆ‰ÉW5AÙ“‰¯u0þÓ«d3©‹¨ò¿ŒÎÔ‰§Ä +‰=p‰(ÄÜQ½X“((͞ѤÓç„ghçLK¬h“˧cÔ;"'É0ÂS¡ )\ééTÓ(Œç``«9km&£vµÉfªYc¢Ä«'±2žEÓ)u3 ÈC>Uͯ réqR#¶BV¶Ü¯e¸M$îÒå„ê(´¤dÅr+cºÆ¶ã7À£ûe!¦ë¨ä5"•„‚ÒŸweà°ÄG.öSžÄFäÍÙ²£óZ±ÚÂb{‘[¹ŠÓW +³b •NÏd±Ôºî@ò·–Ä£º{¢"× ÓN"™³5,ªÔ³"«'‘°«µãFÛ´ŸZˆ–—ÜâÓ]UÞY`!®ûQɱA«;v_AØܹҳÁB¦…ÔjÒ^†áT¢ªŽs[¢Ûe¨Ó¦@ç±îV“Ö@¨Š,S¥Ò^S¥"à ¾õ²ÄÓ¦Áäm´ãØ€Ùœ‰["À€£+mGYÓ s™Zž€¥¬µÉnÖ å£rE3| ¸ÓqÄ¥Ç@öá®Á-ÒÝjœÚfÀ¼òØ´ÄàÏrMÌ¢Þ £T1†‚À¯uš76Ô jaX” Çl’i,˜ ¶ÓLÕ“Õ@¤™Å‹!E""îÓßzÙQŒ ã6”·òªà·"ˆ´êÆ Ë!±¥SpÀÆòŠ8ÕÒÝZ\ÙX Æì®MZàºã‰\l §h*'‚@êÛ‘EÒbÔ@8ì—[;ì`µKVÀbBÃó˜à_S}u \ No newline at end of file diff --git a/sounds/digits/12.gsm b/sounds/digits/12.gsm new file mode 100755 index 0000000000000000000000000000000000000000..445a4bfea752b482d07aa3222f7b9caa0eddabd7 Binary files /dev/null and b/sounds/digits/12.gsm differ diff --git a/sounds/digits/13.gsm b/sounds/digits/13.gsm new file mode 100755 index 0000000000000000000000000000000000000000..e0e04e717a33ba827a8f1f0857c27711a90f089f Binary files /dev/null and b/sounds/digits/13.gsm differ diff --git a/sounds/digits/14.gsm b/sounds/digits/14.gsm new file mode 100755 index 0000000000000000000000000000000000000000..0ee808ad488b009903f24f0a4b57a4dde0dff51d Binary files /dev/null and b/sounds/digits/14.gsm differ diff --git a/sounds/digits/15.gsm b/sounds/digits/15.gsm new file mode 100755 index 0000000000000000000000000000000000000000..debe890589d682df8b3a208c22e49d2af145ba42 Binary files /dev/null and b/sounds/digits/15.gsm differ diff --git a/sounds/digits/16.gsm b/sounds/digits/16.gsm new file mode 100755 index 0000000000000000000000000000000000000000..fe4b020abfb05ec29efdf0e4c6f6b204b8e374ad Binary files /dev/null and b/sounds/digits/16.gsm differ diff --git a/sounds/digits/17.gsm b/sounds/digits/17.gsm new file mode 100755 index 0000000000000000000000000000000000000000..af2fc6aaa42cc8716a4ed3685b6b7f17363ba206 --- /dev/null +++ b/sounds/digits/17.gsm @@ -0,0 +1,4 @@ +Õ‘-£R¢4t`Ö¡f¢¤¥* ¶«4;p¢Q²I^œÖy`©»"ŸIVš˜ c,ÒÀâU\OÚ« ÁË¥Uòó×èxÝÙ|¢(V£™‘Œá™©sSŸ˜¢ÎÍ4¤Ö[xؑء†¥±FͺÂÙnD¨ÜÂ6ͦç(œâ›¢5fÈÕœ`˜Y»#ÊÕfh ßøänÍCçbÔ¢7fY$´§i7&Ôr¡rw%(ª‰ÖƒÈÄãm¸6X…T0&Ë›+7,¶±%Ô¦dè_Í4ä–ûÅ\lÿ¶6îy[uDny13#nJÆÕ&u8Šîà-`Â]wÐ;ðIÆ“wQ$‹ŽÚ+°°²¡Ôét¦øëRK„m8äw1”“q[ul&ä1…®u0ê,ÉLÓê|æ±ç/4¬›$èÐF̉IotÍŠ«iÆÚèï9%îãÔ*[ZrîÈÈ42',îÈ„³>™[}E¿å›Ó&v¦Õa8äÔhdò}äô+if‚}ÈFãyÕâvÈà,V{¥C„qªÅÔ¦cß1{é9$×A%Žè +D)vw¬KD²'#wì¶í–Óæcë0qh†ªE)Ws<%m·bçG7-¸.“æË%ZmË·Òålç(æ©#hÇè†Çc¿ˆ´ìç`mÉ¿îÅŽeq¥iÒ%§™x¦9wÁ³î¢¨=K¤ñCx49-zåÉm¢G#Ò&¦Xá ä–¥Në{B€ËÆ4¥~û]ò&㢢(ÉvɧÒ'¥$é€Â-D°ÓÒat–ùKàI+5êªõvù¤ÓàL ÚPág›˜¤n°¡Lšój3êRà)w¤¡èä•Ú×bš$¢’¡Û •1%å摇¸‘h£Þ.ÈĦD¿dXœØ¥‘%"ê¤=³m²£GÚ ÆËl¤8øµLÓ¹i(äÆÜØh‰]pj†ÝŒ†ç;Š¾¥„¨Ø½¹<¡«fnÞãØdpqŒ§kœ}9i´ÆÉS´¦ÀÃãÀøþdå½NhÂÕLrèh8å›ûºdǶÁ@¸îƒ¯ËBmÆã}-H“’È$ÕžD÷(˜ªI„ƒhÉò©¦Ûh\M…7?…¨bì‘É=ÕE¾Ø‹G'oÊœ¨¨%’²Ä“7øYÔ¦ +h"LÔÝU¾å²ún<Ñ‘C·MUm“J²ÁÔ“e´ÛqÙwÔnyIÜ…´° ]—d´ãIÛX¦¦ZäMÉP›¢É#³Ç¤Óžv¹ +›¶ÚÇdcšy¡"Äj¶[¡A$þxÒߥ¸œ¡Â.HË¡ÂZ›R?•Z£4’$‚§P‘J}QÔÝMù³Bò‘RÝ«ƒ‚ÜnYbRĉ%mÉ"¥¤jÁæ°fÓßfY¬¤Tq¦¤³"”e—-¶¤km8ܶâ6âmÂ2Ò$¥ì™·!Šæ¾é%laµÒݼÁ¡×ÊÉm¾‚!¤±ÇdÒŸfå Ç#·I½a×H²fÚ»a¹#jE̹AÅs²Q#Ò vd¢àÀÃR¶H’¹!‡NJíT"ß©—"¹A&Øn¨Ü \ No newline at end of file diff --git a/sounds/digits/18.gsm b/sounds/digits/18.gsm new file mode 100755 index 0000000000000000000000000000000000000000..d2c604867afd49f0742429993a8606e9ba198f1b Binary files /dev/null and b/sounds/digits/18.gsm differ diff --git a/sounds/digits/19.gsm b/sounds/digits/19.gsm new file mode 100755 index 0000000000000000000000000000000000000000..67dc993b36299413b60e73e081aaf48525608cf5 --- /dev/null +++ b/sounds/digits/19.gsm @@ -0,0 +1 @@ +Ô cœ‘‚À¦írXS° ¦ì)ÔœºàZ¬Ú_œÀÉ&j¦âÒzXÐh€r‰ÁEþ†€ÔôVæ’ Ùª–Y3” É#M8[Ôà‹ÙÖàÃQ¸ãÔ 'esYžà ËRFåtÀ N$Ò]zœÙÄ€+!e#4êàÊÔ¾¹cr€æã–4Ù’ÀÄâÂãÒÝj™RÀ¹‘8›®€34Q…„àoóÕW—ðÀ¿q%ÒdÜâb@©]n=€·ªÉðà6ß–hÁ¹ù¶ÑÒa‡]Ùua„“i˶ƒCJV8š‡c4Û“È%¹D&Y1£ÁÔhr§0ƒìÉlèÒª(ÐÙ>ƒMRvÄ܃Ìʼn¯Õkr_(hÔf'vér&£}î7$ŽÁÚ’¬È˜¥8çÕª‚—p{ÍXÏMÈêy&š™ï†ŽÌᆯñŽW¹m¶ÜÔè{XwL¤Û–pÞàéÎ(°gë-½DÒ'ul&ì›ÖÕh[_Ru(ˆ 1}éêô1P¼Ís+8ï¼"álR;gÖ$K_aç j•´Üo͸ðX¥o+'¾Ñ*ÙÜC¶(çÕ_LòØÛj±‰äÛ'š·p!ËÚÈ#wîŒì)—N¹gÒ'¥ÙRÚ‰]Ò)ØÛÚDÆìÜD£ÜCÖÕÊ[pîBu+ÛÒcdâèƒ[e ¨ÜÚ IéãÊ¡E]¯!¤Ü¢7ô’ÅTÓb|!RîÁ#Y$óª@è#Gäì4}’–ÔŒÀþ]ÏYjÒžc-Q¡DŒRÌêÁ'#i©!n ¥Ý‘9˜r «jØÓ×"rqA;JÇéÉÖ¤ÜzãFZq )ˆÅ±M),ØëpLêØ„*’0ܤg9´íéfÆÝÛžw›ZÅ+¨ƒ©Ùêš)QHF*…º›¶¥<¾“»RÇEäv;\žÆG(}(ŒÙkiÉhÌ…ú:dÅæ-MªãÈÃI–Úü«dz£¶€*Ö_$2à˜ƒ2)Ûv€ãzÒ)¤¥ëˆ¹mŸ——ã̽ýÖ^<öàƒdÌ©3uŠÊ°[M½´Ž„!¡YF‹*íhÕ]E·è&¦Ò£g©Z’Xìš&Ê¥%8T-¤ÕÝE;î„•€£$¥ä: iÁ}VännIš©ÃË-çTãÖ^<ûð¦z„u–”«å¸âŽË7«Go[®Ç#©ÄE"x8œÕM{©DGõŽ´•žBÏYl(R«EÈ둾¬¯ÇÇ#r63Ômþ˜¦„”Nµ¡R¢™£‹\°ã–å»ú°ÂˆLq¶ÐÒ'Ŭšªƒ RjˬÂan×[¦á»+u[îîs:¨8¥Ò#Žä¢§dɪ'$VBÚ±¶í¾!WXMÄ´¡MdÇZÒßn]baÃIjPƒ'/Ö¦å¯!Å,±ª¢ÜzéÒŸe]"«bQ)¨˜«A)«eÍfáORT˜«`³“UªÞÒt¥"ØÁK"Œ‘e¦A&ÍŽ¨ãä€Ù¹ÉXà€©‘ªóÑÝK%šÀ¥*–+Þ€Çd²ÌSTÀÆ)²"e¾À¶œnC+ \ No newline at end of file diff --git a/sounds/digits/2.gsm b/sounds/digits/2.gsm new file mode 100755 index 0000000000000000000000000000000000000000..4de58fbc9c562881805be7344fa4419b202b2fc9 Binary files /dev/null and b/sounds/digits/2.gsm differ diff --git a/sounds/digits/20.gsm b/sounds/digits/20.gsm new file mode 100755 index 0000000000000000000000000000000000000000..e10de0d628df21f40950d9b47e8c28f7ca025649 Binary files /dev/null and b/sounds/digits/20.gsm differ diff --git a/sounds/digits/3.gsm b/sounds/digits/3.gsm new file mode 100755 index 0000000000000000000000000000000000000000..4395cae0a42815c345e1b716a20832ccb420c5ef Binary files /dev/null and b/sounds/digits/3.gsm differ diff --git a/sounds/digits/30.gsm b/sounds/digits/30.gsm new file mode 100755 index 0000000000000000000000000000000000000000..025a2584687b940aa6d53d5813bd792784a6c050 Binary files /dev/null and b/sounds/digits/30.gsm differ diff --git a/sounds/digits/4.gsm b/sounds/digits/4.gsm new file mode 100755 index 0000000000000000000000000000000000000000..be5c1df6b5f4661ef13217d88a649ff8301c73c1 Binary files /dev/null and b/sounds/digits/4.gsm differ diff --git a/sounds/digits/40.gsm b/sounds/digits/40.gsm new file mode 100755 index 0000000000000000000000000000000000000000..cdf537e67e417822de561274e9ac1e013a8a3704 Binary files /dev/null and b/sounds/digits/40.gsm differ diff --git a/sounds/digits/5.gsm b/sounds/digits/5.gsm new file mode 100755 index 0000000000000000000000000000000000000000..570b01f1a74733d79f3401e8ace47ad5a42b187e --- /dev/null +++ b/sounds/digits/5.gsm @@ -0,0 +1,4 @@ +ÓßiÕ† Ìé·Hœbà¶ÛvÃ³Ì ÉÓʤnÀDáX¢oÓ]z"´ X$9»S¢ <[s(ÂêÀ©!vEUvÀ}’!Ój¡¦@—’ÈüR YWú+\€<ËÂp‚À3®ˆÚÒ]zYÀ —*Q·+æ€Ù,§KzÀÔQäh §v,ãÔß‚`Ùրɣ‰Ç$´€ÖԌȢfÀô«¥–€à¦ËÒ8ªÕ¡zYÐÀ§aÑÉ"r`ß›—Y¨ÀÄÜ”í$š€%ŠIŠÖé›ebæÁFÒQ"ñâÉ&·Ë¶_ËÈͶAdRH1«M"šÓ1›ž:ZD@)5$êCW[’ý¾YÌG#m¹/aÎÚ$dÔ•ÓðºÚ=]°9¨‘É$sÎ"³÷+q¥YnqïC[v%ÈÔ¯ÃÕ½qϸ/œ9qQ8!M ‚äâ¡0*qñVã¦8¨ÔñÙüoväÊÖ'mP7L))/oQ[ò*mí9'†¨ÙÔò»Ùûoº#V]Emm3˜¦%¯ÛÌÃÝÆ×>mÎÇ\8œÔó³Ö:×ñÅm7ÏÙŽê”Û"o©‚ÀÔ¦ØÛQÆäÐHÜÔ±¼;oÌŽW*émÔêf1 +oÌMn·cÝé*4·å/Ôq +¤J)/qzr«#áðÇ#7#ß3¼*n=¢Õ2³™»‚ð, ©ÜãpíÃÍÆés®X£²N[u hÆ"ŸÕ1´R:u¯22†«Uu®™SŽtów,ÁaM#/í1Q]MGEÕ2›Úyï©Ê*ã’{‹yùr9|{#âÈ¢}Î'^›Õq”z¾ÑÖÚ'}1oErDìO¶¡¯ùDÆÑI[l˜Õm”yÆL¢Öª‡®È4ÍUÂÒqdP¦ë‰ÐH¢Ç„ÕƒÞùزÉ#u&ÃŽÁ,þ"‘N«Q†ÐËõG#Õª„"¸—0FÜc'$• } µÇ#—o6à‘·%›*Îu¬F“Õèt¸›«ÈúmƒÜÌñ}*fŸjº¤²]| ŠtdhºÌÖ§[Ò¹¡ë3K©6…æŒzg„ÈK£IxsÌêŒo‘…PÕfKÞù§ÌVèɦ¦}Nµ¬ ©5u8«H{Zj7ÔçBÚ+®ªÈÛlW°ÄŒ";5¦b¯Ý@äÄcm¾»Ô"R£ª£ÚÌM²ä}‹ÛìÊêâÇ ðaÖ%lZÔk!¢ÁX¬QzæàÜåw•w¸,¬-Õ+ðÁDœ6ÛÖ"z"Tá\q%"|ÁY5ŽË'²¡Y'D›ŽTÂI±OÕ¤Z–ÂfÓq‡ªˆá,ÛÙ®ÈÁgb¥ÛêÄA\rMS$Ô%QÙጡ—Cmȥ΀¨…½ÌÎA[j<Ìî öŠm‘Ó!iàà¤Ó1,™êf]ŠY[œ Õ5Ž&Ô´ ¢ÓˆÈ£Ój]Ùê ÊÖÈóÚàÖôŽYcØàèäŽW[Ž€» +»cÒ]z˜âR Ø“’ÉT¸€É${VìÔÀ*«CÌ¡`Ç n'Òsbà·i½àÀë#ŽG,”€lå•rãÚ€¦¥šã \ No newline at end of file diff --git a/sounds/digits/50.gsm b/sounds/digits/50.gsm new file mode 100755 index 0000000000000000000000000000000000000000..38edca62358c57d9f6c895d05d03b915e95d3827 Binary files /dev/null and b/sounds/digits/50.gsm differ diff --git a/sounds/digits/6.gsm b/sounds/digits/6.gsm new file mode 100755 index 0000000000000000000000000000000000000000..bfad09ae7b193e9525d4ffcdd27ca35560d23e5c Binary files /dev/null and b/sounds/digits/6.gsm differ diff --git a/sounds/digits/60.gsm b/sounds/digits/60.gsm new file mode 100755 index 0000000000000000000000000000000000000000..2bfdd22b13007589ef6393de413ef27bf83a1910 Binary files /dev/null and b/sounds/digits/60.gsm differ diff --git a/sounds/digits/7.gsm b/sounds/digits/7.gsm new file mode 100755 index 0000000000000000000000000000000000000000..10d47a833b652fefe5c4e4cd9868875054e6e61f Binary files /dev/null and b/sounds/digits/7.gsm differ diff --git a/sounds/digits/70.gsm b/sounds/digits/70.gsm new file mode 100755 index 0000000000000000000000000000000000000000..b2d792d46c7f790c124c833e6d59abefbe59f14a Binary files /dev/null and b/sounds/digits/70.gsm differ diff --git a/sounds/digits/8.gsm b/sounds/digits/8.gsm new file mode 100755 index 0000000000000000000000000000000000000000..d448934c0aa1a5b24a74e268efd28a273baf44ec Binary files /dev/null and b/sounds/digits/8.gsm differ diff --git a/sounds/digits/80.gsm b/sounds/digits/80.gsm new file mode 100755 index 0000000000000000000000000000000000000000..8f03a1e6116f626dd30ad4ef68e0bb56335d666a Binary files /dev/null and b/sounds/digits/80.gsm differ diff --git a/sounds/digits/9.gsm b/sounds/digits/9.gsm new file mode 100755 index 0000000000000000000000000000000000000000..834c1a529cc600f6d7ff99b1379c1f2739ef8c39 Binary files /dev/null and b/sounds/digits/9.gsm differ diff --git a/sounds/digits/90.gsm b/sounds/digits/90.gsm new file mode 100755 index 0000000000000000000000000000000000000000..7a362fdf6cbb4cac8f856ce4c7791b604a21e872 Binary files /dev/null and b/sounds/digits/90.gsm differ diff --git a/sounds/digits/hundred.gsm b/sounds/digits/hundred.gsm new file mode 100755 index 0000000000000000000000000000000000000000..890cd90c7b8c4a51bfc24efe7d814df8c772be42 Binary files /dev/null and b/sounds/digits/hundred.gsm differ diff --git a/sounds/transfer.gsm b/sounds/transfer.gsm new file mode 100755 index 0000000000000000000000000000000000000000..a4928913bc03227648f629d42158ea2b436776fa Binary files /dev/null and b/sounds/transfer.gsm differ diff --git a/sounds/vm-deleted.gsm b/sounds/vm-deleted.gsm new file mode 100755 index 0000000000000000000000000000000000000000..0839a0e94e107f4c68eb5fa90c931773319168d6 Binary files /dev/null and b/sounds/vm-deleted.gsm differ diff --git a/sounds/vm-goodbye.gsm b/sounds/vm-goodbye.gsm new file mode 100755 index 0000000000000000000000000000000000000000..9ae8ad1eefbe6bc96066500ed4e733a32266be5d Binary files /dev/null and b/sounds/vm-goodbye.gsm differ diff --git a/sounds/vm-incorrect.gsm b/sounds/vm-incorrect.gsm new file mode 100755 index 0000000000000000000000000000000000000000..486a9b8b4e1ae2d3ca8aed833ae5162006073787 Binary files /dev/null and b/sounds/vm-incorrect.gsm differ diff --git a/sounds/vm-instructions.gsm b/sounds/vm-instructions.gsm new file mode 100755 index 0000000000000000000000000000000000000000..7e826b79154b6529ffb2133fc8636a4dd83fbe15 Binary files /dev/null and b/sounds/vm-instructions.gsm differ diff --git a/sounds/vm-intro.gsm b/sounds/vm-intro.gsm new file mode 100755 index 0000000000000000000000000000000000000000..64624a0d892df9cee816e3278ee8b748e20ebb31 Binary files /dev/null and b/sounds/vm-intro.gsm differ diff --git a/sounds/vm-isonphone.gsm b/sounds/vm-isonphone.gsm new file mode 100755 index 0000000000000000000000000000000000000000..a0ce4e5a52678a34ff0c651063925b48e3226c2e Binary files /dev/null and b/sounds/vm-isonphone.gsm differ diff --git a/sounds/vm-isunavail.gsm b/sounds/vm-isunavail.gsm new file mode 100755 index 0000000000000000000000000000000000000000..e972c1ebfba78ea52de05091243c44553af92803 Binary files /dev/null and b/sounds/vm-isunavail.gsm differ diff --git a/sounds/vm-login.gsm b/sounds/vm-login.gsm new file mode 100755 index 0000000000000000000000000000000000000000..a1f14288e31cb2f25f16a1f94c4db607b0ff2408 Binary files /dev/null and b/sounds/vm-login.gsm differ diff --git a/sounds/vm-message.gsm b/sounds/vm-message.gsm new file mode 100755 index 0000000000000000000000000000000000000000..8386ae79916d7eaf558d3effeb14e2bcc9318f5e Binary files /dev/null and b/sounds/vm-message.gsm differ diff --git a/sounds/vm-messages.gsm b/sounds/vm-messages.gsm new file mode 100755 index 0000000000000000000000000000000000000000..5c2b5b240053ab721e68f6bf836ac4a10015fee4 --- /dev/null +++ b/sounds/vm-messages.gsm @@ -0,0 +1,5 @@ +ÔEP™ˆáZüSÉ]ŸÁX|ûÔÁ|’Lo39\AT-»VÒfr¡Y„¡Í;2|V¶N6ÓÊ€–fGH‘ðA(Ýi +Ò§zÙ—!)a‚]mRàó+u£ +”Á"e$Kk”¡Eâ›eÒé‹•Q„ŠJÙ¬p¡‡Q4›ÀÃfÁ%ÐÁ\ÜVëÒhƒQ!dmrL¯láj[°Ûu–¡8S$ZXÁPl)ZûÒ£e¨cQe+Û·By%j¬Ê[#:Ýœ™kâÈŠqôÒ¤vlë¯%¤N1¢o&×|rÄ¢oC² OÖjÄ–l)ÑoÒç…-ªoÃ÷££KáÊ©ŽTœk-µ$vÖ$kÌ:\‡´Ó©lz°iMÑuNÅk-;wU²ãi¬ LŽ££iéÌœ•Y˜Ôh\êøijyCÔ&×ÏìkD¤¸Ùg,š•ñKK͉–ÂèK*Óèm£(g v•Ñ¦eNÑ$jµË ƾÆâËMÔå—¶ÛÔhTâðË-4,R×z|«(ȃ®gLÌm4ãkHù5¿'#Ô¦Ri°Ê)ÒNÍkæEˆÀ§µÞ‡6MÆäÀ¤=b¿m|Õi¬¨»CHÄù1Œ¦Gñ'nÀ„§Ü©i¢Ê£½.ôkÕid©®ã!›œt±¯$» Ù¯%x¥ +”«xã&’%‹Ö€è°Ê㙌ÆtdâäËAÕ¤"Ö¤2!(ý™%ÓvÇkÓãsq¸ge.Uy´oɨ;mwîšfÌ8‚mI7£)&#•Ó%e*øv¬³-Ø9"vêG¡)/}Èê,Úä’ÿ—äÓÓãL*x¦È㥀ö‚¨XàSfš„Æ3CWKiª‡Ðãr¶’Óßbqû‡Èæ‰XÃU(•Ž§Ú¦iÎÔŽ…Ï’.ÔÒb£¬êrD}*2©ŒCµH‰Ù,î"¹X•âîâ"‚…:õÓž«mšV»ã)GBR‚U]r¤ÄAú׊ñ".f**ØZƒiâÜ¢– û»©#éîÎJßë¬1$m¶Û„¥É7y¥CÚ”q&°e´š|öêF١ꧧDm)¥z…òP(§ÕZ‚r-pÉÙ9+¿IÆÛ ÆîîãZƤ–ÈÙÍÄïÓ£m.q™l-Ñ<ä’å`j.ýÿP¤ˆV·[—FI“¶îÌÓ¤mjñhÊHãnDÄ—%!T¶êĘÅÅ$ÉÔ„—Ķ¬Òæ}æ°š†¦£m±š£#¯;&ŸgÊÛmsZ$ù¬íÆÓÒæefø ¢*‚ÁœÃNüÅúËÝEˆx› ãÍä¨ÜÓ¤c©ù¤Ä:ì–¬¥Å)LòµmP¢â«ÑÁ¨Âš²èBÔ_™i¢Üâ Qr˜±C½kù¹S¼Â‘EoFêÀ‚Šf¦Á×éSÒæU´¦èã[4—ÉfÕ$Tü2˜Ä^¥KrF+Õ˜aìár„$ÁáB¡R¢¶õŠüŦ¤MÕmÚßê£h˜1DÑÖX’mazâ¥"mú©#·w†)Tæ1êƒâÜ„„ZðÒ×”zeS¼"¶ÖXûšàM”{°äX5“Å€¥McˆÛAÔØš%[Z³„ŒÓŠ‚k%tlé®Ã5\z©°°ã'ýy(eÔ"¢a[¦¢Áj«T¡ù]N7車PêºidÔ‚KeŽ +©Õ“YÜÁñ&¯^å’ú§¬6ÛjáÙLßf„ƒ×±6Û \ No newline at end of file diff --git a/sounds/vm-msginstruct.gsm b/sounds/vm-msginstruct.gsm new file mode 100755 index 0000000000000000000000000000000000000000..2d1628e7b332967e70c3ce31ca943dad1eac79f9 Binary files /dev/null and b/sounds/vm-msginstruct.gsm differ diff --git a/sounds/vm-msgsaved.gsm b/sounds/vm-msgsaved.gsm new file mode 100755 index 0000000000000000000000000000000000000000..e065901023cfe017eb99c017a24623c47aa6e209 Binary files /dev/null and b/sounds/vm-msgsaved.gsm differ diff --git a/sounds/vm-no.gsm b/sounds/vm-no.gsm new file mode 100755 index 0000000000000000000000000000000000000000..cb27cf80546606e69fb12513822a700d7a4fcc6a --- /dev/null +++ b/sounds/vm-no.gsm @@ -0,0 +1 @@ +ÒdŠ”ÛÆÀëŸB6ëªàËq4TŽR –© ˆ“ ¡ZÝwUMÒ¤ƒÙ¼ÁEü•k\`§ž†êçÂÁ9”’)ÔÌÁÄØi©%Ñ,Ö!#kCÛîIÇtÂ&YjÚÁ¨ÃØ…U*ä‚»;ÅÌ¡ÑiÍ¥ªÂ¨\©Íþž¢àät´ƒ% sÀ®lâw‰é£&ÑéÃõ°}"ÔÊdšyb±ÿH^{C%$m¸þy§ºäŒz’Ó(„vøs*6ÜÞ„ËsÌ’Ûh»|s¬©7ÆÞql;l¢õÔ(Œ.¸áÌ•4Skr¬ÔÐa0oŒKÞV>ìoªh¦œ‡Ó«„v¹q®We˘oJtM‰¨Ý.]âñ«cmÌ[؆@ÊÓk¤®©ÛLDŒE¡îmÌI6vþöÛ.7í=Y#ÛŒú¥ Óªœn¹Ü°’P4_o Ü~³wvqŒÛ÷7áåt%…öÓé£îzsäÃI¼ÓåO·½V¶äw«nÙ$Ñë0FÔr8Ó+¬®iñƒ¼15}lËzyQ”ÔÔrHØ ¨k±†ÛÓ,”n±„«õLHHž…ß—½ÉUŒÍÈ,f[PÚɪin Ò줪rB··ìâKÉ¥•¡‘ ¯m¸×Tä©}K ‰Òp«n¢“&}ëª'5Ž§Ã襖§T=€ªÙæÉ4ÄqËýÒn²®ª•dŒé˺”èDÔvûW°¦F™È•E–*Ï©,Ònâê#•#G-¿3•%´åú†²“âéa„Š•;;¢¸ÒpÓi¬ŒÄ÷Zm—5“¥éæn¶šH0ÒJ(ì‘$PrŠ8Òj³àìæ4ä¾]®£¨‹–€[Ž‡Æä’Q\sc!bDÒ/kR*ˆ£é»F©Œ¡SS§…&ì‚&å(‘ð"»$·ÒåÒeœ†áĤp,Œ¡ÀñI¬ä‚ÁYúêùsš!i“M6Ò%“X\ª¡”ÃFÒÍî¡M·4Þ|ÀïYñ'=à`’S°¦™Ò!¢™’ê6ÞE·ZjÁWl½Ç5\áÇmÀ›RÁY)a5Òf¢•‘z¡N¦Ö%]j¡)_Õ™Ô®ÁE‘=ˆá+q.KÑb›Y³Aº£‘·Ý ¡5²UÆÜ`à ¦ÜÔ€Õ¬zØMÑâ’™Zƒas-Ë8ÛŽx]®fÛ|Á´#L¥ªÁI±Û,Ñ"’™š¤)4uØ,ÌÁ$ÜQ‰š Æår=òÐi²È¹,Ѥ‚ØÒðá £…ÆdcA5/ZSÈ Êô’=[¦ái*±ÆìÑeŠÛð!HڊǺàºYJVŽ §iæݬÁH¯Î«ZÑer‘"pÁ<ØŒÅK¸Á'ÉÃ#RÁLæ‰i5àÀùŸ±¬áÒ©r“ÜáYaJá`¡3c*‹ˆÁÞÝS/vdÁ$´É 'Ô*«YRÖ¡¥znKÄpÁ†"@VâÓ°¶ÁpÁ±/Eó \ No newline at end of file diff --git a/sounds/vm-nomore.gsm b/sounds/vm-nomore.gsm new file mode 100755 index 0000000000000000000000000000000000000000..0e89761df57cf3ca6e4fcb22decce5bf4f4a3b05 Binary files /dev/null and b/sounds/vm-nomore.gsm differ diff --git a/sounds/vm-password.gsm b/sounds/vm-password.gsm new file mode 100755 index 0000000000000000000000000000000000000000..fe6660bedb5952c35a021a851e4bebeb8c36208c Binary files /dev/null and b/sounds/vm-password.gsm differ diff --git a/sounds/vm-theperson.gsm b/sounds/vm-theperson.gsm new file mode 100755 index 0000000000000000000000000000000000000000..3938e0ce70bc79260466ce3b9938939d5b9745b8 Binary files /dev/null and b/sounds/vm-theperson.gsm differ diff --git a/sounds/vm-undeleted.gsm b/sounds/vm-undeleted.gsm new file mode 100755 index 0000000000000000000000000000000000000000..e7fa4be02d726a9f3768e33a6458317f4f0f52fe Binary files /dev/null and b/sounds/vm-undeleted.gsm differ diff --git a/sounds/vm-youhave.gsm b/sounds/vm-youhave.gsm new file mode 100755 index 0000000000000000000000000000000000000000..9c2e38208a22f0eeb6d199f9b4816bedd2469c51 Binary files /dev/null and b/sounds/vm-youhave.gsm differ