Index: apps/app_meetme.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_meetme.c,v retrieving revision 1.91 diff -u -r1.91 app_meetme.c --- apps/app_meetme.c 21 Mar 2005 03:23:05 -0000 1.91 +++ apps/app_meetme.c 28 Mar 2005 04:14:49 -0000 @@ -110,7 +110,10 @@ STANDARD_LOCAL_USER; LOCAL_USER_DECL; - +struct ast_signal { + char *data; + int len; +}; static struct ast_conference { char confno[AST_MAX_EXTENSION]; /* Conference */ struct ast_channel *chan; /* Announcements channel */ @@ -130,6 +133,8 @@ char *recordingformat; /* Format to record the Conference in */ char pin[AST_MAX_EXTENSION]; /* If protected by a PIN */ char pinadmin[AST_MAX_EXTENSION]; /* If protected by a admin PIN */ + struct ast_signal *entersignal; /* Enter Beep Data */ + struct ast_signal *leavesignal; /* Leave Beep Data */ struct ast_conference *next; } *confs; @@ -151,15 +156,15 @@ #define MEETME_DELAYDETECTTALK 300 #define MEETME_DELAYDETECTENDTALK 1000 +#define DEFAULT_ENTERSIGNAL "beep" +#define DEFAULT_LEAVESIGNAL "vm-no" + AST_MUTEX_DEFINE_STATIC(conflock); static int admin_exec(struct ast_channel *chan, void *data); static void *recordthread(void *args); -#include "enter.h" -#include "leave.h" - #define ENTER 0 #define LEAVE 1 @@ -226,7 +231,49 @@ else return "(not talking)"; } +struct ast_signal *readsignalfile(char *filename); +struct ast_signal *readsignalfile(char *filename) { + FILE *file; + struct ast_signal *tmpsignal; + tmpsignal = malloc(sizeof(struct ast_signal)); + file = fopen(filename, "rb"); + if (!ast_strlen_zero(filename)) { + file = fopen(filename, "rb"); + if (file) { + fseek(file, 0, SEEK_END); + tmpsignal->len=ftell(file); + fseek(file, 0, SEEK_SET); + tmpsignal->data=(char *)malloc(tmpsignal->len+sizeof(char *)); + fread(tmpsignal->data, tmpsignal->len, 1, file); + fclose(file); + return tmpsignal; + } + } + return NULL; +} +struct ast_signal *getsignal(char *filename); +struct ast_signal *getsignal(char *filename) { + struct ast_filestream *others; + struct ast_filestream *realfiles; + struct ast_frame *fr; + char tempfile[80] = "tempfileforsignal"; + char tmp[256]; + char *fmt = "ulaw"; + char comment[256]; + struct ast_signal *signal; + realfiles = ast_readfile(filename, "gsm", comment, O_RDONLY, 0, 0); + others = ast_writefile(tempfile, fmt, comment, O_CREAT, 0, 0700); + while ((fr = ast_readframe(realfiles))) { + ast_writestream(others,fr); + } + ast_closestream(others); + ast_closestream(realfiles); + snprintf(tmp,sizeof(tmp)-1,"%s/%s/%s.pcm",(char *)ast_config_AST_VAR_DIR,"sounds",tempfile); + signal = readsignalfile(tmp); + ast_filedelete(tempfile, NULL); + return signal; +} static int careful_write(int fd, unsigned char *data, int len) { int res; @@ -259,12 +306,12 @@ ast_mutex_lock(&conflock); switch(sound) { case ENTER: - data = enter; - len = sizeof(enter); + data = conf->entersignal->data; + len = conf->entersignal->len; break; case LEAVE: - data = leave; - len = sizeof(leave); + data = conf->leavesignal->data; + len = conf->leavesignal->len; break; default: data = NULL; @@ -311,6 +358,9 @@ } } memset(&ztc, 0, sizeof(ztc)); + cnf->entersignal = getsignal(DEFAULT_ENTERSIGNAL); + cnf->leavesignal = getsignal(DEFAULT_LEAVESIGNAL); + /* Setup a new zap conference */ ztc.chan = 0; ztc.confno = -1;