mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	audiohook: add directional awareness
Add enum to allow setting optional direction. If set to only one direction, only feed matching-direction frames to the associated slin factory. This prevents mangling the transcoder on non-mixed frames when the READ and WRITE frames would have otherwise required it. Also removes the need to mute or discard the un-wanted frames as they are no longer added in the first place. res_stasis_snoop is changed to use this addition to set direction on audiohook based on spy direction. If no direction is set, the ast_audiohook_init will init this enum to BOTH which maintains existing functionality. ASTERISK-30252 Change-Id: If8716bad334562a5d812be4eeb2a92e4f3be28eb
This commit is contained in:
		
				
					committed by
					
						 Friendly Automation
						Friendly Automation
					
				
			
			
				
	
			
			
			
						parent
						
							0234b2b9be
						
					
				
				
					commit
					4fd2f07ff9
				
			| @@ -188,21 +188,9 @@ static struct ast_frame *snoop_read(struct ast_channel *chan) | ||||
| 	} | ||||
|  | ||||
| 	ast_audiohook_lock(&snoop->spy); | ||||
| 	if (snoop->spy_direction != AST_AUDIOHOOK_DIRECTION_BOTH) { | ||||
| 		/* | ||||
| 		 * When a singular direction is chosen frames are still written to the | ||||
| 		 * opposing direction's queue. Those frames must be read so the queue | ||||
| 		 * does not continue to grow, however since they are not needed for the | ||||
| 		 * selected direction they can be dropped. | ||||
| 		 */ | ||||
| 		enum ast_audiohook_direction opposing_direction = | ||||
| 			snoop->spy_direction == AST_AUDIOHOOK_DIRECTION_READ ? | ||||
| 			AST_AUDIOHOOK_DIRECTION_WRITE : AST_AUDIOHOOK_DIRECTION_READ; | ||||
| 		ast_frame_dtor(ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples, | ||||
| 							opposing_direction, snoop->spy_format)); | ||||
| 	} | ||||
|  | ||||
| 	frame = ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples, snoop->spy_direction, snoop->spy_format); | ||||
|  | ||||
| 	ast_audiohook_unlock(&snoop->spy); | ||||
|  | ||||
| 	return frame ? frame : &snoop->silence; | ||||
| @@ -287,6 +275,14 @@ static int snoop_setup_audiohook(struct ast_channel *chan, enum ast_audiohook_ty | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	/* Set the audiohook direction so we don't write unnecessary frames */ | ||||
| 	if (ast_audiohook_set_frame_feed_direction(audiohook, *direction)) { | ||||
| 		/* If we are unable to set direction, the audiohook either failed to init | ||||
| 		   or someone else started using it already.  If we don't bail here, we risk | ||||
| 		   feeding frames that will never be read */ | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	return ast_audiohook_attach(chan, audiohook); | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user