mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	enhance control_playback to have an app (app_controlplayback) and to allow pause (inherited by app_voicemail)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3087 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										79
									
								
								app.c
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								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; | ||||
|  | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user