aboutsummaryrefslogtreecommitdiffstats
path: root/app.c
diff options
context:
space:
mode:
authoranthm <anthm@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-26 23:56:41 +0000
committeranthm <anthm@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-26 23:56:41 +0000
commit5f3db1b218918d03622e077a6273880b8cb0e043 (patch)
tree4b2c7405bdefa9f20e49fb576b3c8995239f877f /app.c
parent499ff3d55bbfcc8a7103cd327f90d2f1733039ed (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-xapp.c79
1 files changed, 73 insertions, 6 deletions
diff --git a/app.c b/app.c
index 15a15f2b3..0091ea0e8 100755
--- 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;
+
}
+