diff options
author | anthm <anthm@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-05-26 23:56:41 +0000 |
---|---|---|
committer | anthm <anthm@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-05-26 23:56:41 +0000 |
commit | 5f3db1b218918d03622e077a6273880b8cb0e043 (patch) | |
tree | 4b2c7405bdefa9f20e49fb576b3c8995239f877f /app.c | |
parent | 499ff3d55bbfcc8a7103cd327f90d2f1733039ed (diff) |
enhance control_playback to have an app (app_controlplayback) and to allow pause (inherited by app_voicemail)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3087 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'app.c')
-rwxr-xr-x | app.c | 79 |
1 files changed, 73 insertions, 6 deletions
@@ -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; + } + |