Version 0.1.2 from FTP

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@152 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2000-01-02 20:59:00 +00:00
parent 5099c2edf7
commit aa07102df2
72 changed files with 523 additions and 140 deletions

View File

@@ -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+=

80
apps/app_echo.c Executable file
View File

@@ -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;
}

View File

@@ -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;
}

82
apps/app_system.c Executable file
View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)
}

View File

@@ -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());
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_unload_resource(resource_name, 0);
return -1;
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, res);
ast_unload_resource(resource_name, 0);
return -1;
}
ast_update_use_count();
return 0;
}

View File

@@ -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"));
@@ -334,13 +431,20 @@ 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 */

14
say.c
View File

@@ -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);

BIN
sounds/beep.gsm Executable file

Binary file not shown.

BIN
sounds/demo-abouttotry.gsm Executable file

Binary file not shown.

BIN
sounds/demo-congrats.gsm Executable file

Binary file not shown.

BIN
sounds/demo-echodone.gsm Executable file

Binary file not shown.

BIN
sounds/demo-echotest.gsm Executable file

Binary file not shown.

BIN
sounds/demo-instruct.gsm Executable file

Binary file not shown.

BIN
sounds/demo-nogo.gsm Executable file

Binary file not shown.

BIN
sounds/demo-thanks.gsm Executable file

Binary file not shown.

BIN
sounds/digits/0.gsm Executable file

Binary file not shown.

BIN
sounds/digits/1.gsm Executable file

Binary file not shown.

BIN
sounds/digits/10.gsm Executable file

Binary file not shown.

5
sounds/digits/11.gsm Executable file
View File

@@ -0,0 +1,5 @@
<EFBFBD><17><>S^<5E><><15>Ue<><65>M-W<>V<EFBFBD><56><EFBFBD>J<EFBFBD>[<5B><>jm<><6D><EFBFBD><EFBFBD><EFBFBD>#<23><>֒<EFBFBD>CK<43><4B>8<EFBFBD>1<EFBFBD><05><>8ԱjMo!<21><1B><>i<EFBFBD>v<EFBFBD><1D>sdH <0B><>eb<65>,<2C>]<5D>օ<>۞%<25>^$)n8<6E><38>k<EFBFBD><6B>k<EFBFBD>Ũ<EFBFBD><C5A8>Ӣ<EFBFBD><D3A2>G<EFBFBD><47> <20>o<EFBFBD>6<EFBFBD><36><EFBFBD>ڄ<><DA84>d4 <0B>5<EFBFBD>!k<><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>d<EFBFBD><64>ȓ<EFBFBD>;?<3F><><EFBFBD><1D><>*<2A>$&<26>r[<5B><>1<EFBFBD><31>붃%<19><><03>D9^<5E>:ܑ"<22>ڀ<EFBFBD>]<5D>#<23><>V<EFBFBD><14>4<EFBFBD>᳉"<22>"q<>/<2F>!a&<26> <0C><><EFBFBD>'M<><4D><EFBFBD><EFBFBD>Zi<10><>3<EFBFBD>is<69>¹ <20>U<14><><EFBFBD>!<21><> ",ށ<><DE81>}<>W <20>q<EFBFBD>e{{<7B>)<1C>;o{<7B><>T<EFBFBD><54><EFBFBD>w<EFBFBD>4<>E(s*(<28>ML<4D><4C>s<EFBFBD><73>yw<79>U<16><>r<EFBFBD>I<EFBFBD>-<2D><>qP<71> Q<>mkM<6B><4D>N<EFBFBD><4E><EFBFBD>/<2F>:q<>/'je*o<><6F>ט<>m2<6D><32>.'oo<6F>+<2B><18>c<EFBFBD>m<EFBFBD>[x۰<78><DBB0>7@<40><>Q<EFBFBD><51><EFBFBD>S\kQ<6B><51>jG=<3D>P<EFBFBD><50>P<EFBFBD><50><EFBFBD>,<2C>_pk<70><6B><EFBFBD>磌k<EFAAAB>b<EFBFBD><62><EFBFBD>Cis<69> f<><66><EFBFBD>MT<4D>p6%Ӭ<>_pkPߎU<DF8E><55><EFBFBD><EFBFBD>V<EFBFBD>5wk<><6B><EFBFBD>xd5n<35><6E><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:kp=<3D><52><C6A1>X+<2B><>
<EFBFBD>JHɅ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<0E>b<EFBFBD><62>y<EFBFBD>k<6B><EEA997>h<<3C><>9[<5B><><EFBFBD>~<7E>h$<24><>؃솲9[<5B>j<EFBFBD>j<><6A>h<EFBFBD><68>fʅ#<23><><EFBFBD><EFBFBD>D<EFBFBD><44><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD>^
r4<EFBFBD><EFBFBD>j<EFBFBD>gq<EFBFBD><EFBFBD>9Rr<EFBFBD>4<EFBFBD><EFBFBD>МR<EFBFBD><EFBFBD><EFBFBD><EFBFBD>W5Aٓ<EFBFBD><08>u0<75>ӫd3<64><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԉ<EFBFBD><D489>
<EFBFBD>=p<>(<28><>Q<EFBFBD>X<EFBFBD>((͞Ѥ<CD9E><D1A4><EFBFBD>gh<67>LK<4C>h<1A>˧c<CBA7>;"<22>'<27>0<>S<EFBFBD> )\<5C><>T<EFBFBD>(<28><>``<60>9km&<1A>v<> <0C>f<EFBFBD>Yc<59><63>ī'<27>2<EFBFBD>E<1B>)u3 <20>C>U<><18>
r<EFBFBD>qR#<23>BV<42>ܯe<DCAF>M$<24><><EFBFBD><EFBFBD><EFBFBD>(<28><>d<EFBFBD>r+c<>ƶ<EFBFBD>7<1C><><EFBFBD>e!<21><><EFBFBD><EFBFBD>5"<22><><EFBFBD>ҟwe<77><65><EFBFBD>G.<2E>S<><53>F<EFBFBD><46><EFBFBD><03><><EFBFBD>Z<EFBFBD><5A><EFBFBD>b<EFBFBD>{<7B>[<5B><><EFBFBD>W

BIN
sounds/digits/12.gsm Executable file

Binary file not shown.

BIN
sounds/digits/13.gsm Executable file

Binary file not shown.

BIN
sounds/digits/14.gsm Executable file

Binary file not shown.

BIN
sounds/digits/15.gsm Executable file

Binary file not shown.

BIN
sounds/digits/16.gsm Executable file

Binary file not shown.

4
sounds/digits/17.gsm Executable file
View File

@@ -0,0 +1,4 @@
<EFBFBD><1D>-<2D>R<EFBFBD>4t`֡f<D6A1><66><EFBFBD><EFBFBD>*<2A><EFBFBD>4;p<>Q<EFBFBD>I^<5E>֝y`<60><>"<22>IV<49><56><EFBFBD>
<EFBFBD>c,<2C><><EFBFBD>U\Oګ<4F><DAAB>˥U<CBA5><55><EFBFBD><EFBFBD>x<EFBFBD><78>|<7C>(<28>V<EFBFBD><56><1A><>ᙩsS<73><53><EFBFBD><EFBFBD><16>4<EFBFBD><34>[xؑء<D891><D8A1><EFBFBD>Fͺ<46><18>nD<6E><44><EFBFBD><36>(<28>⛢5f<35>՜`<60>Y<EFBFBD>#<23><>fh<66><68><01><>n<EFBFBD>C<EFBFBD>bԢ7fY$<24><>i7&ԝr<D49D>rw%(<28><><EFBFBD><14><><EFBFBD><EFBFBD>m<EFBFBD>6X<36>T0&˛+7,<2C><>%Ԧd<1A>_<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD>\l<><1B>6<EFBFBD>y[uDny13#nJ<6E><4A>&u8<><38><EFBFBD>-`<60>]w<>;<3B>IƓwQ$<24><><EFBFBD>+<2B><><EFBFBD><EFBFBD><1E><>t<EFBFBD><74><EFBFBD>RK<52>m8<6D>w1<06><>q[ul&<26>1<EFBFBD><31>u0<75>,<2C><>L<EFBFBD><4C>|<7C><><EFBFBD>/4<><34> $<24><>F̉Iot͊<74>i<EFBFBD><69><EFBFBD><EFBFBD>9%<25><18><>*[Zr<5A><72><EFBFBD>42',<2C>Ȅ<EFBFBD>><3E>[}E<><45><EFBFBD><EFBFBD>&v<><76>a8<61><38>hd<16>}<7D><>+if<69>}<7D>F<EFBFBD>y<EFBFBD><79><76>,V{<7B>C<EFBFBD>q<EFBFBD><71>Ԧc<D4A6>1{<7B>9$<24>A%<25><>
D)vw<76>KD<4B>'#w<><77><EFBFBD><EFBFBD><1C><>c<EFBFBD>0qh<71><68>E)Ws <%m<>b<EFBFBD>G7-<2D>.<2E><><EFBFBD>%Zm˷<6D><CBB7>l<EFBFBD>(<28><>#h<><1A><><EFBFBD>c<EFBFBD><63><EFBFBD><EFBFBD><EFBFBD>`<60>mɿ<6D>Ŏeq<65>i<EFBFBD>%<25><>x<>9w<39><77>=K<><4B>Cx49-z<><7A>m<EFBFBD>G#<23>&<26>X<EFBFBD><58>䖥N<E496A5>{B<><42><EFBFBD>4<EFBFBD>~û]<5D>&㢢(<28><76>'<27>$<24><><EFBFBD>-D<><44><EFBFBD><EFBFBD>at<61><74>K<EFBFBD><4B>I +5<>v<EFBFBD><76><EFBFBD><EFBFBD>L<EFBFBD><4C>P<EFBFBD>g<EFBFBD><67><EFBFBD>n<EFBFBD><6E>L<EFBFBD><4C>j3<6A><33>R<EFBFBD>)w<1B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><1B>b<EFBFBD>$<24><><EFBFBD><EFBFBD> <09>1%<25><><EFBFBD><E69187>h<EFBFBD><1A>.<2E>ĦD<C4A6>d<EFBFBD>X<EFBFBD>إ<EFBFBD>%"<22><>=<3D>m<><6D>G <0C>
<EFBFBD><EFBFBD>l<EFBFBD>8<EFBFBD><EFBFBD>Lӹi(<28><11><><EFBFBD>h<EFBFBD>]pj<70><14><15><><EFBFBD><EFBFBD>;<16><><EFBFBD><EFBFBD><EFBFBD>؝<EFBFBD><D89D><<3C><08>fn<66><6E><EFBFBD>dp<64>q<EFBFBD><71>k<EFBFBD>}9i<39><69><EFBFBD>S<><53><EFBFBD><EFBFBD><17><><EFBFBD><EFBFBD>d彭Nh<4E><68>Lr<4C><72>h8<68><38><EFBFBD><EFBFBD><64>@<40><EFBFBD>Bm<42><6D>}-H<><48><EFBFBD>$՞D<D59E>(<28><>I<08><> <0C>h<EFBFBD><68><EFBFBD><EFBFBD>ہh\M<>7?<3F><>b<EFBFBD><62><EFBFBD>=<3D>E<>؋G'<6F><CA9C>%<25><><EFBFBD><12><04>7<EFBFBD>YԦ

BIN
sounds/digits/18.gsm Executable file

Binary file not shown.

1
sounds/digits/19.gsm Executable file
View File

@@ -0,0 +1 @@
Ԡc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rXS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)Ԝ<><D49C>Z<EFBFBD>ڝ_<DA9D><5F><EFBFBD>&j<><6A><EFBFBD>zX<7A>h<EFBFBD>r<EFBFBD><72>E<EFBFBD><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD>V撠٪<E692A0>Y3<59><33><EFBFBD>#M8[<5B><><EFBFBD><18><><EFBFBD><EFBFBD>Q<><51>Ԡ'esY<73><59><EFBFBD>˭RF<52>t<EFBFBD>

BIN
sounds/digits/2.gsm Executable file

Binary file not shown.

BIN
sounds/digits/20.gsm Executable file

Binary file not shown.

BIN
sounds/digits/3.gsm Executable file

Binary file not shown.

BIN
sounds/digits/30.gsm Executable file

Binary file not shown.

BIN
sounds/digits/4.gsm Executable file

Binary file not shown.

BIN
sounds/digits/40.gsm Executable file

Binary file not shown.

4
sounds/digits/5.gsm Executable file
View File

@@ -0,0 +1,4 @@
<EFBFBD><EFBFBD>i<EFBFBD><12><><EFBFBD><EFBFBD><EFBFBD>H<EFBFBD>b<EFBFBD><62><EFBFBD>vó̠<C3B3>Ӎʤn<CAA4>D<EFBFBD>X<EFBFBD>o<EFBFBD>]z"<22><>X$9<>S<EFBFBD><53><[s(<28><><EFBFBD><EFBFBD>!vEUv<55> }<7D>!<21>j<><1A>@<40><1C><><EFBFBD>R<EFBFBD>YW<59>+\<5C><<3C><>p<EFBFBD><70>3<13><><EFBFBD><EFBFBD>]zY<19><><EFBFBD>*Q<>+<2B><><EFBFBD>,<2C>Kz<>ԭQ<16>h<EFBFBD><68>v,<2C><>߂`<60>րɣ<D680><C9A3>$<24><><EFBFBD>ԌȢf<C8A2><14><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>աzY<><59><EFBFBD>a<EFBFBD><61>"r`ߛ<>Y<1D><><EFBFBD>ܔ<EFBFBD>$<24><>%<13>I<EFBFBD><49><EFBFBD><EFBFBD>eb<65><62>F<EFBFBD>Q"<22><><EFBFBD><EFBFBD>&<26>˶_<CBB6><5F>ͶAdRH1<48>M"<22><>1<EFBFBD><31>:ZD<5A>@)5$<24>CW[<5B><><EFBFBD>Y<EFBFBD>G#m<>/a<><61>$dԕ<64><D495><EFBFBD><EFBFBD>=]<5D>9<EFBFBD><39><EFBFBD>$s<>"<22><>+q<10>Yn q<>C[v%<25>ԯ<EFBFBD>սqϸ/<2F>9qQ8!<21>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0*q<>V<EFBFBD><56>8<EFBFBD><38><EFBFBD>Ù<EFBFBD>o<EFBFBD>v<EFBFBD><76><EFBFBD>'mP7L))/o<>Q[<5B>*<2A>m<EFBFBD>9'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<10>#V]Emm3<6D><33>%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>>m<><6D>\8<><38><EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD>m7<6D>َ<06><><EFBFBD>"o<><6F><EFBFBD>Ԧ<EFBFBD><D4A6>Q<EFBFBD><51><EFBFBD>H<EFBFBD>Ա<EFBFBD>;o̎W*<2A>m<0E><>f1
o<EFBFBD>Mn<>c<EFBFBD><63>*4<><34>/<2F><><EFBFBD><19>q
<EFBFBD>J)/q<>zr<7A>#<23><><EFBFBD>#7#<23>3<EFBFBD>*n=<3D><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>,<2C><><06><>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>X<EFBFBD><58>N[u
h<EFBFBD>"<22><>1<EFBFBD>R:u<>22<32><32>Uu<55><75>S<EFBFBD>t<EFBFBD>w,<2C>aM#/<2F>1Q]MGE<47>2<EFBFBD><32>y<EFBFBD><79><EFBFBD>*<2A><03>{<7B>y<EFBFBD>r9|{<7B>#<23><>Ȣ}<7D>'^<5E><1E><>q<EFBFBD>z<><7A><EFBFBD><EFBFBD>'}1oErD<72><44>O<EFBFBD><4F><EFBFBD><EFBFBD>D<EFBFBD><44>I[l<10><>m<EFBFBD>y<><79><EFBFBD>L<EFBFBD>֪<EFBFBD><D6AA><EFBFBD>4<EFBFBD>U<13><>qdP<64><50><EFBFBD><EFBFBD>H<EFBFBD><48>DŽխ<C784><D5AD><EFBFBD>ز<EFBFBD>#u&Î<><C38E>,<2C>"<22>N<EFBFBD><4E>Q<EFBFBD><14><><EFBFBD><EFBFBD>G#ժ<>"<22><>0F<30>c'$<24>

BIN
sounds/digits/50.gsm Executable file

Binary file not shown.

BIN
sounds/digits/6.gsm Executable file

Binary file not shown.

BIN
sounds/digits/60.gsm Executable file

Binary file not shown.

BIN
sounds/digits/7.gsm Executable file

Binary file not shown.

BIN
sounds/digits/70.gsm Executable file

Binary file not shown.

BIN
sounds/digits/8.gsm Executable file

Binary file not shown.

BIN
sounds/digits/80.gsm Executable file

Binary file not shown.

BIN
sounds/digits/9.gsm Executable file

Binary file not shown.

BIN
sounds/digits/90.gsm Executable file

Binary file not shown.

BIN
sounds/digits/hundred.gsm Executable file

Binary file not shown.

BIN
sounds/transfer.gsm Executable file

Binary file not shown.

BIN
sounds/vm-deleted.gsm Executable file

Binary file not shown.

BIN
sounds/vm-goodbye.gsm Executable file

Binary file not shown.

BIN
sounds/vm-incorrect.gsm Executable file

Binary file not shown.

BIN
sounds/vm-instructions.gsm Executable file

Binary file not shown.

BIN
sounds/vm-intro.gsm Executable file

Binary file not shown.

BIN
sounds/vm-isonphone.gsm Executable file

Binary file not shown.

BIN
sounds/vm-isunavail.gsm Executable file

Binary file not shown.

BIN
sounds/vm-login.gsm Executable file

Binary file not shown.

BIN
sounds/vm-message.gsm Executable file

Binary file not shown.

5
sounds/vm-messages.gsm Executable file
View File

@@ -0,0 +1,5 @@
<EFBFBD>EP<45><50><EFBFBD>Z<EFBFBD>S<EFBFBD>]<5D><>X|<7C><><EFBFBD>|<7C><>Lo39\AT-<2D>V<EFBFBD>fr<66>Y<EFBFBD><59><EFBFBD>;2|<7C>V<01>N6<4E>ʀ<EFBFBD>fGH<47><48>A(<28>i
ҧz<EFBFBD><1A>!)a<>]mR<6D><52>+u<>
<EFBFBD><EFBFBD>"e$Kk<4B><6B>E⭛e<E2AD9B>鋕Q<E98B95><51><19>J٬p<D9AC><70>Q4<51><34><EFBFBD><EFBFBD>f<>%<25><>\<5C>V<1A><>h<EFBFBD>Q!dmrL<72>l<EFBFBD>j[<5B><>u<EFBFBD><75>8S$Z<>X<EFBFBD>Pl)Z<>ңe<D2A3>cQe+۷By%j<><6A>[#:ݜ<>k<6B>Ȋq<1F>Ҥvl<76><6C>%<12>N1<4E>o&<26>|rĢoC<6F> O<>jĖl)<29>o<EFBFBD><6F><EFBFBD>-<2D>o<EFBFBD><6F><EFBFBD><EFBFBD>K<1C>ʩ<CAA9>T<EFBFBD>k-<2D>$v<>$k<>:\<5C><><EFBFBD>өlz<6C>iM<69>uN<75>k-;wU<77><55>i<EFBFBD> L<><4C><EFBFBD>i<EFBFBD>̜<EFBFBD>Y<EFBFBD><59>h\<5C><>ijyC<79>&<26><><EFBFBD>kD<6B><44><EFBFBD>g,<2C><><EFBFBD>KK͉<4B><CD89><EFBFBD>K*<2A><>m<EFBFBD>(g v<> ѦeN<65>$j<><1A>
ƾ<11><><EFBFBD>M<EFBFBD><EFBFBD><E597B6>hT<68><54><EFBFBD>-4,R<>z|<7C>(<28><06><>gL<67>m4<6D>kH<6B>5<EFBFBD>'#ԦRi<52><69>)<04>N<EFBFBD>k<EFBFBD>E<EFBFBD><45><12><><EFBFBD><06>6M<36><4D><EFBFBD><EFBFBD>=b<>m|<7C>i<><69><EFBFBD>CH<1E><>1<EFBFBD><31>G<16>'n<><6E><EFBFBD>ܩi<DCA9>ʣ<EFBFBD>.<2E>k<EFBFBD>id<69><64><EFBFBD>!<21><>t<EFBFBD><74>$<24> ٯ%x<>
<EFBFBD><04>x<EFBFBD>&<26>%<25><><1A><><EFBFBD><EFBFBD><EFBFBD>td<74><64><EFBFBD>Aդ"֤2!<21>(<28><>%<07>v<EFBFBD>k<EFBFBD><6B>sq<73>ge.Uy<55>oɨ;mw<6D><77>f<EFBFBD>8<EFBFBD>mI7<49>)&#<23><13>%e*<2A>v<EFBFBD><76>-<2D>9"v<>G<EFBFBD>)/}<7D><0E>,<2C><><EFBFBD><05><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L*x<><78><><E3A580><EFBFBD>X<EFBFBD>Sf<53><66><EFBFBD>3CWKi<4B><69><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD>bq<62><71><05><0E><><1B>X<>U(<28><><EFBFBD>ڦi<DAA6>Ԏ<EFBFBD>ϒ.ԝ<>b<EFBFBD><62><EFBFBD>rD}*2<><15>C<EFBFBD>H<EFBFBD><48>,<2C>"<22>X<EFBFBD><16><><EFBFBD>"<22><>:<3A>Ӟ<EFBFBD>m<EFBFBD><56>)GBR<42>U]r<><72>A<EFBFBD>׊<EFBFBD><14>".f*<2A>*<2A>Z<EFBFBD>i<EFBFBD>ܢ<1B> <09><><EFBFBD>#<23><><EFBFBD>J<EFBFBD><4A><EFBFBD>1$m<>ۄ<EFBFBD><DB84>7y<37>Cڔq&<19>e<EFBFBD><65><EFBFBD>|<7C><>F ١ꧧDm)<29>z<EFBFBD><7A>P<EFBFBD>(<28><>Z<EFBFBD>r-p<><70><1F>9+<2B>I<EFBFBD><49>

BIN
sounds/vm-msginstruct.gsm Executable file

Binary file not shown.

BIN
sounds/vm-msgsaved.gsm Executable file

Binary file not shown.

1
sounds/vm-no.gsm Executable file
View File

@@ -0,0 +1 @@
<EFBFBD>d<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B6<EFBFBD><EFBFBD><EFBFBD><EFBFBD>q4T<EFBFBD>R<EFBFBD><EFBFBD><EFBFBD>

BIN
sounds/vm-nomore.gsm Executable file

Binary file not shown.

BIN
sounds/vm-password.gsm Executable file

Binary file not shown.

BIN
sounds/vm-theperson.gsm Executable file

Binary file not shown.

BIN
sounds/vm-undeleted.gsm Executable file

Binary file not shown.

BIN
sounds/vm-youhave.gsm Executable file

Binary file not shown.