[Asterisk-cvs] asterisk app.c,1.17,1.18
anthm at lists.digium.com
anthm at lists.digium.com
Wed May 26 19:42:09 CDT 2004
Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv30416
Modified Files:
app.c
Log Message:
enhance control_playback to have an app (app_controlplayback) and to allow pause (inherited by app_voicemail)
Index: app.c
===================================================================
RCS file: /usr/cvsroot/asterisk/app.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- app.c 26 May 2004 16:51:25 -0000 1.17
+++ app.c 26 May 2004 23:56:41 -0000 1.18
@@ -407,12 +407,79 @@
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;
+
}
+
More information about the svn-commits
mailing list