enhance control_playback to have an app (app_controlplayback) and to allow pause...
authorAnthony Minessale II <anthmct@yahoo.com>
Wed, 26 May 2004 23:56:41 +0000 (23:56 +0000)
committerAnthony Minessale II <anthmct@yahoo.com>
Wed, 26 May 2004 23:56:41 +0000 (23:56 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3087 65c4cc65-6c06-0410-ace0-fbb531ad65f3

app.c
apps/app_controlplayback.c
apps/app_voicemail.c
include/asterisk/app.h

diff --git a/app.c b/app.c
index 15a15f2..0091ea0 100755 (executable)
--- a/app.c
+++ b/app.c
@@ -407,12 +407,79 @@ int ast_linear_stream(struct ast_channel *chan, const char *filename, int fd, in
        return res;
 }
 
-int ast_control_streamfile(struct ast_channel *chan, char *file, char *f, char *r, int skipms) 
+int ast_control_streamfile(struct ast_channel *chan, char *file,char *fwd,char *rev,char *stop,char *pause,int skipms) 
 {
-       int res;
-       if ((res = ast_streamfile(chan, file, chan->language)))
-               ast_log(LOG_WARNING, "Unable to stream file  %s\n", file);
-       if (!res)
-               res = ast_waitstream_fr(chan, AST_DIGIT_ANY,f,r,skipms);
+
+       struct timeval started, ended;
+       long elapsed = 0,last_elapsed =0;
+       char breaks[5];
+       int x=0,res=0;
+
+       if (chan->_state != AST_STATE_UP)
+               res = ast_answer(chan);
+
+
+       if(stop != NULL && stop[0]) {
+               breaks[x++] = stop[0];
+       }
+       if(pause != NULL && pause[0]) {
+               breaks[x++] = pause[0];
+       }
+       breaks[x] = '\0';
+
+       if(chan)
+               ast_stopstream(chan);
+
+       for(;;) {
+               gettimeofday(&started,NULL);
+
+               if(chan)
+                       ast_stopstream(chan);
+               res = ast_streamfile(chan, file, chan->language);
+               if(!res) {
+                       res = 1;
+                       if(elapsed) {
+                               ast_stream_fastforward(chan->stream,elapsed);
+                               last_elapsed = elapsed - 200;
+                       }
+                       if(res) {
+                               res = ast_waitstream_fr(chan,breaks,fwd,rev,skipms);
+                       }
+                       else {
+                               break;
+                       }
+               }
+
+               if (res < 1)
+                       break;
+
+               if(pause != NULL && res == *pause) {
+                       gettimeofday(&ended,NULL);
+                       elapsed = (((ended.tv_sec * 1000) + ended.tv_usec / 1000) - ((started.tv_sec * 1000) + started.tv_usec / 1000) + last_elapsed);
+                       for(;;) {
+                               if(chan)
+                                       ast_stopstream(chan);
+                               res = ast_waitfordigit(chan, 1000);
+                               if(res == -1 || res == *pause || (stop && res == *stop))
+                                       break;
+                       }
+                       if(res == *pause) {
+                               res = 0;
+                               continue;
+                       }
+               }
+               if(res == -1)
+                       break;
+
+               if(stop != NULL && res == *stop) {
+                       res = 0;
+                       break;
+               }
+       }
+       if(chan)
+               ast_stopstream(chan);
+
        return res;
+
 }
+
index 75664f2..8aa7c48 100755 (executable)
@@ -31,13 +31,13 @@ static char *app = "ControlPlayback";
 static char *synopsis = "Play a file with fast forward and rewind";
 
 static char *descrip = 
-"ControlPlayback(filename[|skipms][|<rewindchar><ffchar><endchar>]):\n"
+"ControlPlayback(filename[|skipms]|[ffchar]|[rewchar]|[stopchar]]):\n"
 "  Plays  back  a  given  filename (do not put extension). Options may also\n"
 "  be included following a pipe symbol.  You can use * and # to rewind and\n"
-"  fast forward the playback specified. If 'endchar' is added the file will\n"
-"  terminate playback when 'endchar' is pressed. Returns -1 if the channel\n"
+"  fast forward the playback specified. If 'stopchar' is added the file will\n"
+"  terminate playback when 'stopchar' is pressed. Returns -1 if the channel\n"
 "  was hung up, or if the file does not exist. Returns 0 otherwise.\n\n"
-"  Example:  exten => 1234,1,ControlPlayback(file|4000|*#1)\n\n";
+"  Example:  exten => 1234,1,ControlPlayback(file|4000|*|#|1)\n\n";
 
 
 STANDARD_LOCAL_USER;
@@ -55,53 +55,61 @@ static int controlplayback_exec(struct ast_channel *chan, void *data)
        int skipms = 0;
        struct localuser *u;
        char tmp[256];
-       char opts[3];
-       char *skip = NULL, *stop = NULL;
+       char *skip = NULL, *fwd = NULL, *rev = NULL, *stop = NULL, *pause = NULL, *file = NULL;
+
+
        if (!data || ast_strlen_zero((char *)data)) {
                ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n");
                return -1;
        }
        
-       memset(opts,0,3);
+
        strncpy(tmp, (char *)data, sizeof(tmp)-1);
+       file = tmp;
+
        if((skip=strchr(tmp,'|'))) {
                *skip = '\0';
                *skip++;
-       }
-
-       if(skip && (stop=strchr(skip,'|'))) {
-               *stop = '\0';
-               *stop++;
-               strncpy(opts,stop,3);
+               fwd=strchr(skip,'|');
+               if(fwd) {
+                       *fwd = '\0';
+                       *fwd++;
+                       rev = strchr(fwd,'|');
+                       if(rev) {
+                               *rev = '\0';
+                               *rev++;
+                               stop = strchr(rev,'|');
+                               if(stop) {
+                                       *stop = '\0';
+                                       *stop++;
+                                       pause = strchr(stop,'|');
+                                       if(pause) {
+                                               *pause = '\0';
+                                               *pause++;
+                                       }
+                               }
+                       }
+               }
        }
 
        skipms = skip ? atoi(skip) : 3000;
        if(!skipms)
                skipms = 3000;
 
-       if(opts[0] == '\0' || ! is_on_phonepad(opts[0]))
-               opts[0] = '*';
-       if(opts[1] == '\0' || ! is_on_phonepad(opts[1]))
-               opts[1] = '#';
-       if(opts[2] == '\0' || ! is_on_phonepad(opts[2]))
-               opts[2] = '1';
+       if(!fwd || ! is_on_phonepad(*fwd))
+               fwd = "#";
+       if(!rev || ! is_on_phonepad(*rev))
+               rev = "*";
+       if(stop && ! is_on_phonepad(*stop))
+               stop = NULL;
+       if(pause && ! is_on_phonepad(*pause))
+               pause = NULL;
+
 
        LOCAL_USER_ADD(u);
 
-       if (chan->_state != AST_STATE_UP)
-               res = ast_answer(chan);
-
-       ast_stopstream(chan);
-       for(;;) {
-               res = ast_control_streamfile(chan, tmp, &opts[1], &opts[0], skipms);
-               if (res < 1)
-                       break;
-               if(res == opts[2]) {
-                       res = 0;
-                       break;
-               }
-       }
-       ast_stopstream(chan);
+       res = ast_control_streamfile(chan, file, fwd, rev, stop, pause, skipms);
+
        LOCAL_USER_REMOVE(u);
        return res;
 }
index 9bce8c6..bf65b26 100755 (executable)
@@ -2549,7 +2549,7 @@ static int wait_file2(struct ast_channel *chan, struct vm_state *vms, char *file
 
 static int wait_file(struct ast_channel *chan, struct vm_state *vms, char *file) 
 {
-       return ast_control_streamfile(chan, file, "#", "*", skipms);
+       return ast_control_streamfile(chan, file, "#", "*","1","0", skipms);
 }
 
 static int play_message_datetime(struct ast_channel *chan, struct ast_vm_user *vmu, char *origtime, char *filename)
index 618e94f..bab5620 100755 (executable)
@@ -54,8 +54,8 @@ int ast_dtmf_stream(struct ast_channel *chan, struct ast_channel *peer, char *di
 //! Stream a filename (or file descriptor) as a generator.
 int ast_linear_stream(struct ast_channel *chan, const char *filename, int fd, int allowoverride);
 
-//! Stream a file with fast forward and reverse.
-int ast_control_streamfile(struct ast_channel *chan, char *file, char *f, char *r, int skipms);
+//! Stream a file with fast forward, pause, reverse.
+int ast_control_streamfile(struct ast_channel *chan, char *file,char *fwd,char *rev,char *stop,char *pause,int skipms);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }