mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Merged revisions 197537 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r197537 | mmichelson | 2009-05-28 09:49:13 -0500 (Thu, 28 May 2009) | 21 lines Add flags to chanspy audiohook so that audio stays in sync. There are two flags being added to the chanspy audiohook here. One is the pre-existing AST_AUDIOHOOK_TRIGGER_SYNC flag. With this set, we ensure that the read and write slinfactories on the audiohook do not skew beyond a certain tolerance. In addition, there is a new audiohook flag added here, AST_AUDIOHOOK_SMALL_QUEUE. With this flag set, we do not allow for a slinfactory to build up a substantial amount of audio before flushing it. For this particular issue, this means that the person spying on the call will hear the conversations in real time with very little delay in the audio. (closes issue #13745) Reported by: geoffs Patches: 13745.patch uploaded by mmichelson (license 60) Tested by: snblitz ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@197543 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -123,6 +123,7 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo | ||||
| 	struct ast_slinfactory *factory = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->read_factory : &audiohook->write_factory); | ||||
| 	struct ast_slinfactory *other_factory = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->write_factory : &audiohook->read_factory); | ||||
| 	struct timeval *rwtime = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->read_time : &audiohook->write_time), previous_time = *rwtime; | ||||
| 	int our_factory_samples; | ||||
| 	int our_factory_ms; | ||||
| 	int other_factory_samples; | ||||
| 	int other_factory_ms; | ||||
| @@ -130,7 +131,8 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo | ||||
| 	/* Update last feeding time to be current */ | ||||
| 	*rwtime = ast_tvnow(); | ||||
|  | ||||
| 	our_factory_ms = ast_tvdiff_ms(*rwtime, previous_time) + (ast_slinfactory_available(factory) / 8); | ||||
| 	our_factory_samples = ast_slinfactory_available(factory); | ||||
| 	our_factory_ms = ast_tvdiff_ms(*rwtime, previous_time) + (our_factory_samples / 8); | ||||
| 	other_factory_samples = ast_slinfactory_available(other_factory); | ||||
| 	other_factory_ms = other_factory_samples / 8; | ||||
|  | ||||
| @@ -141,6 +143,14 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo | ||||
| 		ast_slinfactory_flush(other_factory); | ||||
| 	} | ||||
|  | ||||
| 	if (ast_test_flag(audiohook, AST_AUDIOHOOK_SMALL_QUEUE) && (our_factory_samples > 640 || other_factory_samples > 640)) { | ||||
| 		if (option_debug) { | ||||
| 			ast_log(LOG_DEBUG, "Audiohook %p has stale audio in its factories. Flushing them both\n", audiohook); | ||||
| 		} | ||||
| 		ast_slinfactory_flush(factory); | ||||
| 		ast_slinfactory_flush(other_factory); | ||||
| 	} | ||||
|  | ||||
| 	/* Write frame out to respective factory */ | ||||
| 	ast_slinfactory_feed(factory, frame); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user