mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 11:58:52 +00:00
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:
@@ -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
80
apps/app_echo.c
Executable 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;
|
||||
}
|
@@ -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
82
apps/app_system.c
Executable 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;
|
||||
}
|
@@ -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);
|
||||
|
74
asterisk.c
74
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;
|
||||
}
|
||||
|
61
channel.c
61
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 {
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
}
|
||||
|
40
loader.c
40
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());
|
||||
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;
|
||||
}
|
||||
|
||||
|
@@ -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
14
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);
|
||||
|
BIN
sounds/beep.gsm
Executable file
BIN
sounds/beep.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-abouttotry.gsm
Executable file
BIN
sounds/demo-abouttotry.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-congrats.gsm
Executable file
BIN
sounds/demo-congrats.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-echodone.gsm
Executable file
BIN
sounds/demo-echodone.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-echotest.gsm
Executable file
BIN
sounds/demo-echotest.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-instruct.gsm
Executable file
BIN
sounds/demo-instruct.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-nogo.gsm
Executable file
BIN
sounds/demo-nogo.gsm
Executable file
Binary file not shown.
BIN
sounds/demo-thanks.gsm
Executable file
BIN
sounds/demo-thanks.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/0.gsm
Executable file
BIN
sounds/digits/0.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/1.gsm
Executable file
BIN
sounds/digits/1.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/10.gsm
Executable file
BIN
sounds/digits/10.gsm
Executable file
Binary file not shown.
5
sounds/digits/11.gsm
Executable file
5
sounds/digits/11.gsm
Executable 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>Rơ<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
BIN
sounds/digits/12.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/13.gsm
Executable file
BIN
sounds/digits/13.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/14.gsm
Executable file
BIN
sounds/digits/14.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/15.gsm
Executable file
BIN
sounds/digits/15.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/16.gsm
Executable file
BIN
sounds/digits/16.gsm
Executable file
Binary file not shown.
4
sounds/digits/17.gsm
Executable file
4
sounds/digits/17.gsm
Executable 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>6ͦ<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>vÈ<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>vɧ<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>dǶ<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'oʜ<6F><CA9C>%<25><><EFBFBD><12><04>7<EFBFBD>YԦ
|
BIN
sounds/digits/18.gsm
Executable file
BIN
sounds/digits/18.gsm
Executable file
Binary file not shown.
1
sounds/digits/19.gsm
Executable file
1
sounds/digits/19.gsm
Executable 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
BIN
sounds/digits/2.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/20.gsm
Executable file
BIN
sounds/digits/20.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/3.gsm
Executable file
BIN
sounds/digits/3.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/30.gsm
Executable file
BIN
sounds/digits/30.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/4.gsm
Executable file
BIN
sounds/digits/4.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/40.gsm
Executable file
BIN
sounds/digits/40.gsm
Executable file
Binary file not shown.
4
sounds/digits/5.gsm
Executable file
4
sounds/digits/5.gsm
Executable 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>Ynq<>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
BIN
sounds/digits/50.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/6.gsm
Executable file
BIN
sounds/digits/6.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/60.gsm
Executable file
BIN
sounds/digits/60.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/7.gsm
Executable file
BIN
sounds/digits/7.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/70.gsm
Executable file
BIN
sounds/digits/70.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/8.gsm
Executable file
BIN
sounds/digits/8.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/80.gsm
Executable file
BIN
sounds/digits/80.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/9.gsm
Executable file
BIN
sounds/digits/9.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/90.gsm
Executable file
BIN
sounds/digits/90.gsm
Executable file
Binary file not shown.
BIN
sounds/digits/hundred.gsm
Executable file
BIN
sounds/digits/hundred.gsm
Executable file
Binary file not shown.
BIN
sounds/transfer.gsm
Executable file
BIN
sounds/transfer.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-deleted.gsm
Executable file
BIN
sounds/vm-deleted.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-goodbye.gsm
Executable file
BIN
sounds/vm-goodbye.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-incorrect.gsm
Executable file
BIN
sounds/vm-incorrect.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-instructions.gsm
Executable file
BIN
sounds/vm-instructions.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-intro.gsm
Executable file
BIN
sounds/vm-intro.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-isonphone.gsm
Executable file
BIN
sounds/vm-isonphone.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-isunavail.gsm
Executable file
BIN
sounds/vm-isunavail.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-login.gsm
Executable file
BIN
sounds/vm-login.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-message.gsm
Executable file
BIN
sounds/vm-message.gsm
Executable file
Binary file not shown.
5
sounds/vm-messages.gsm
Executable file
5
sounds/vm-messages.gsm
Executable 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>V»<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
BIN
sounds/vm-msginstruct.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-msgsaved.gsm
Executable file
BIN
sounds/vm-msgsaved.gsm
Executable file
Binary file not shown.
1
sounds/vm-no.gsm
Executable file
1
sounds/vm-no.gsm
Executable 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
BIN
sounds/vm-nomore.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-password.gsm
Executable file
BIN
sounds/vm-password.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-theperson.gsm
Executable file
BIN
sounds/vm-theperson.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-undeleted.gsm
Executable file
BIN
sounds/vm-undeleted.gsm
Executable file
Binary file not shown.
BIN
sounds/vm-youhave.gsm
Executable file
BIN
sounds/vm-youhave.gsm
Executable file
Binary file not shown.
Reference in New Issue
Block a user