[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