diff --git a/apps/Makefile b/apps/Makefile index f7aca4639..708ac94cc 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -27,7 +27,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_mp3.so\ app_hasnewvoicemail.so app_sayunixtime.so app_cut.so app_read.so \ app_setcdruserfield.so app_random.so app_ices.so app_eval.so \ app_nbscat.so app_sendtext.so app_exec.so app_sms.so \ - app_groupcount.so app_txtcidname.so + app_groupcount.so app_txtcidname.so app_controlplayback.so ifneq (${OSARCH},Darwin) ifneq (${OSARCH},FreeBSD) diff --git a/apps/app_controlplayback.c b/apps/app_controlplayback.c new file mode 100755 index 000000000..31c7605cd --- /dev/null +++ b/apps/app_controlplayback.c @@ -0,0 +1,120 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Trivial application to control playback a sound file + * + * Copyright (C) 1999, Mark Spencer + * + * Mark Spencer + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static char *tdesc = "Control Playback Application"; + +static char *app = "ControlPlayback"; + +static char *synopsis = "Play a file with fast forward and rewind"; + +static char *descrip = +" ControlPlayback(filename[|skipms][|endplay]): Plays back a given filename\n" +"(do not put extension). Options may also be included following a pipe symbol.\n" +"you can use * and # to rewind and fast forward the playback specified. If 'endplay' is.\n" +"added the file will terminate playback when 1 is pressed. Returns -1 if the channel\n" +"was hung up, or if the file does not exist. Returns 0 otherwise.\n"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +static int controlplayback_exec(struct ast_channel *chan, void *data) +{ + int res = 0; + int skipms = 0; + struct localuser *u; + char tmp[256]; + char *skip, *endplay; + int option_endplay = 0; + if (!data || ast_strlen_zero((char *)data)) { + ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n"); + return -1; + } + strncpy(tmp, (char *)data, sizeof(tmp)-1); + if((skip=strchr(tmp,'|'))) { + *skip = '\0'; + *skip++; + if((endplay=strchr(skip,'|'))) { + *endplay = '\0'; + *endplay++; + if(!strcmp(endplay,"endplay")) { + option_endplay = 1; + } + } + } + if (atoi(skip) > 0) { + skipms = atoi(skip); + } else { + skipms = 3000; + } + + LOCAL_USER_ADD(u); + + if (chan->_state != AST_STATE_UP) + res = ast_answer(chan); + + ast_stopstream(chan); + for(;;) { + res = ast_control_streamfile(chan, tmp, "#", "*", skipms); + if (res < 1) + break; + if(option_endplay && res == 49) { + res = 0; + break; + } + } + ast_stopstream(chan); + 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, controlplayback_exec, synopsis, descrip); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} + +char *key() +{ + return ASTERISK_GPL_KEY; +}