Add controlplayback app
[asterisk/asterisk.git] / apps / app_controlplayback.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Trivial application to control playback a sound file
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13  
14 #include <asterisk/lock.h>
15 #include <asterisk/file.h>
16 #include <asterisk/logger.h>
17 #include <asterisk/channel.h>
18 #include <asterisk/pbx.h>
19 #include <asterisk/app.h>
20 #include <asterisk/module.h>
21 #include <asterisk/translate.h>
22 #include <asterisk/utils.h>
23 #include <string.h>
24 #include <stdlib.h>
25 #include <pthread.h>
26
27 static char *tdesc = "Control Playback Application";
28
29 static char *app = "ControlPlayback";
30
31 static char *synopsis = "Play a file with fast forward and rewind";
32
33 static char *descrip = 
34 "  ControlPlayback(filename[|skipms][|endplay]):  Plays  back  a  given  filename\n"
35 "(do not put extension). Options may also be included following a pipe symbol.\n"
36 "you can use * and # to rewind and fast forward the playback specified. If 'endplay' is.\n"
37 "added the file will terminate playback when 1 is pressed. Returns -1 if the channel\n"
38 "was hung up, or if the file does not exist. Returns 0 otherwise.\n";
39
40 STANDARD_LOCAL_USER;
41
42 LOCAL_USER_DECL;
43
44 static int controlplayback_exec(struct ast_channel *chan, void *data)
45 {
46         int res = 0;
47         int skipms = 0;
48         struct localuser *u;
49         char tmp[256];
50         char *skip, *endplay;
51         int option_endplay = 0;
52         if (!data || ast_strlen_zero((char *)data)) {
53                 ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n");
54                 return -1;
55         }
56         strncpy(tmp, (char *)data, sizeof(tmp)-1);
57         if((skip=strchr(tmp,'|'))) {
58                 *skip = '\0';
59                 *skip++;
60                 if((endplay=strchr(skip,'|'))) {
61                         *endplay = '\0';
62                         *endplay++;
63                         if(!strcmp(endplay,"endplay")) {
64                                 option_endplay = 1;
65                         }
66                 }
67         }
68         if (atoi(skip) > 0) {
69                 skipms =  atoi(skip);
70         } else {
71                 skipms = 3000;
72         }
73                 
74         LOCAL_USER_ADD(u);
75
76         if (chan->_state != AST_STATE_UP)
77                 res = ast_answer(chan);
78
79         ast_stopstream(chan);
80         for(;;) {
81                 res = ast_control_streamfile(chan, tmp, "#", "*", skipms);
82                 if (res < 1)
83                         break;
84                 if(option_endplay && res == 49) {
85                         res = 0;
86                         break;
87                 }
88         }
89         ast_stopstream(chan);
90         LOCAL_USER_REMOVE(u);
91         return res;
92 }
93
94 int unload_module(void)
95 {
96         STANDARD_HANGUP_LOCALUSERS;
97         return ast_unregister_application(app);
98 }
99
100 int load_module(void)
101 {
102         return ast_register_application(app, controlplayback_exec, synopsis, descrip);
103 }
104
105 char *description(void)
106 {
107         return tdesc;
108 }
109
110 int usecount(void)
111 {
112         int res;
113         STANDARD_USECOUNT(res);
114         return res;
115 }
116
117 char *key()
118 {
119         return ASTERISK_GPL_KEY;
120 }