From: Mark Spencer Date: Sun, 2 Jan 2000 20:59:00 +0000 (+0000) Subject: Version 0.1.2 from FTP X-Git-Tag: 0.1.2~20 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aa07102df24238a1aef830a7883127051e7bc2fe;p=thirdparty%2Fasterisk.git Version 0.1.2 from FTP git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@152 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/Makefile b/apps/Makefile index 773eb535fe..fd5eaac365 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 0000000000..370dc68636 --- /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 + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +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 e766d1142b..419b8f40a0 100755 --- a/apps/app_skel.c +++ b/apps/app_skel.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -22,63 +23,32 @@ #include -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 0000000000..7e140a4278 --- /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 + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +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 f2893b3f62..8fc6f500ff 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 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 a79474077b..bec0894aee 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, " ! 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 \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 0a18b28187..881e291cf6 100755 --- a/channel.c +++ b/channel.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -26,6 +27,27 @@ #include #include + + +#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 89d2be7604..b71e28cc2d 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;xbuf + 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 df19e094eb..efd6af3f0b 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 27b3230f49..d5989b4779 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 2fe03093b4..2b32e1b093 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 dcf3d0f8f1..ce36a3b660 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 =,, +; 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 425eb2e304..d78c490d1d 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 d6a549b4b1..63c44df40c 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 1aefa4ca88..52a4ecb980 100755 --- a/pbx/pbx_gtkconsole.c +++ b/pbx/pbx_gtkconsole.c @@ -25,12 +25,15 @@ #include #include #include +#include #include #include #include #include #include #include +#include +#include #include #include @@ -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 c3f5fba5b4..41b66925e4 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 0000000000..16407f6557 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 0000000000..2d7842fd31 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 0000000000..c3fa396bac 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 0000000000..f0d6764f44 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 0000000000..3ad6c2aa45 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 0000000000..b40d17212e 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 0000000000..340b3c8706 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 0000000000..6c8b1418f9 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 0000000000..d7c3be0ae1 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 0000000000..c59f027cd6 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 0000000000..fd8c88a09f 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 0000000000..c22cf785bf --- /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“žywU¨¢rÑI¾-ÄâqPµ QúmkMá¤N–ÁÔ/”:qÎ/'je*o³§ט¤m2äÙ.'oo®+ÓçcÔmœ[xÛ°¶ä7@³ÙQÄêžS\kQ¸ÔjG=ÙPŠ”P¶ÕÔ,¬_pk¯¥Û磌kbñá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ì—[;ì`µK­VÀ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 0000000000..445a4bfea7 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 0000000000..e0e04e717a 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 0000000000..0ee808ad48 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 0000000000..debe890589 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 0000000000..fe4b020abf 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 0000000000..af2fc6aaa4 --- /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¿dXœØ¥‘%"ê¤=³m²£G Ú ÆËl¤8øµLÓ¹i(äÆÜØh‰]pj†ÝŒ†ç;о¥„¨Ø½¹<¡«fnÞãØdpqŒ§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Óßf­Y¬¤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 0000000000..d2c604867a 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 0000000000..67dc993b36 --- /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èÒª(ÐÙ>ƒMRvÄ܃Ìʼ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ØÓ×"rqA;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½´Ž„!¡YF‹*í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ÃIj Pƒ'/Ö¦å¯!Å,±ª¢Ü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 0000000000..4de58fbc9c 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 0000000000..e10de0d628 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 0000000000..4395cae0a4 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 0000000000..025a258468 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 0000000000..be5c1df6b5 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 0000000000..cdf537e67e 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 0000000000..570b01f1a7 --- /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¥Yn qïC[v%ÈÔ¯ÃÕ½qϸ/œ9qQ8!M ‚äâ¡0*qñVã¦8¨ÔñÙüo­väÊÖ'mP7L))/oQ[ò*mí9'†¨ÙÔò»Ùûoº#V]Emm3˜¦%¯ÛÌÃÝÆ×>mÎÇ\8œÔó³Ö:×ñÅm7Ïَê”Û"o©‚ÀÔ¦ØÛQÆäÐHÜÔ±¼;o̎W*émÔêf1 +oÌMn·cÝé*4·å/Ôq +¤J)/qzr«#áðÇ#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Ö%l­ZÔ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 0000000000..38edca6235 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 0000000000..bfad09ae7b 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 0000000000..2bfdd22b13 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 0000000000..10d47a833b 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 0000000000..b2d792d46c 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 0000000000..d448934c0a 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 0000000000..8f03a1e611 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 0000000000..834c1a529c 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 0000000000..7a362fdf6c 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 0000000000..890cd90c7b 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 0000000000..a4928913bc 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 0000000000..0839a0e94e 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 0000000000..9ae8ad1eef 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 0000000000..486a9b8b4e 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 0000000000..7e826b7915 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 0000000000..64624a0d89 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 0000000000..a0ce4e5a52 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 0000000000..e972c1ebfb 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 0000000000..a1f14288e3 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 0000000000..8386ae7991 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 0000000000..5c2b5b2400 --- /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$ZXÁ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 0000000000..2d1628e7b3 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 0000000000..e065901023 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 0000000000..cb27cf8054 --- /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 Ò줪r B··ìâ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ڊǺàºY­JVŽ §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 0000000000..0e89761df5 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 0000000000..fe6660bedb 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 0000000000..3938e0ce70 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 0000000000..e7fa4be02d 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 0000000000..9c2e38208a Binary files /dev/null and b/sounds/vm-youhave.gsm differ