mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	audiohooks: Muting a hook can mute underlying frames
If an audiohook is placed on a channel that does not require transcoding,
muting that hook will cause the underlying frames to be muted as well.
The original patch is from David Woolley but I have modified slightly.
ASTERISK-21094 #close
Reported by: David Woolley
Patches:
      ASTERISK-21094-Patch-1.8-1.txt (license #5737) patch uploaded
      by David Woolley
Change-Id: Ib2b68c6283e227cbeb5fa478b2d0f625dae338ed
			
			
This commit is contained in:
		| @@ -156,6 +156,11 @@ int ast_audiohook_destroy(struct ast_audiohook *audiohook) | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| #define SHOULD_MUTE(hook, dir) \ | ||||
| 	((ast_test_flag(hook, AST_AUDIOHOOK_MUTE_READ) && (dir == AST_AUDIOHOOK_DIRECTION_READ)) || \ | ||||
| 	(ast_test_flag(hook, AST_AUDIOHOOK_MUTE_WRITE) && (dir == AST_AUDIOHOOK_DIRECTION_WRITE)) || \ | ||||
| 	(ast_test_flag(hook, AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE) == (AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE))) | ||||
|  | ||||
| /*! \brief Writes a frame into the audiohook structure | ||||
|  * \param audiohook Audiohook structure | ||||
|  * \param direction Direction the audio frame came from | ||||
| @@ -171,7 +176,6 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo | ||||
| 	int our_factory_ms; | ||||
| 	int other_factory_samples; | ||||
| 	int other_factory_ms; | ||||
| 	int muteme = 0; | ||||
|  | ||||
| 	/* Update last feeding time to be current */ | ||||
| 	*rwtime = ast_tvnow(); | ||||
| @@ -197,17 +201,6 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo | ||||
| 		ast_slinfactory_flush(other_factory); | ||||
| 	} | ||||
|  | ||||
| 	/* swap frame data for zeros if mute is required */ | ||||
| 	if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_READ) && (direction == AST_AUDIOHOOK_DIRECTION_READ)) || | ||||
| 		(ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE) && (direction == AST_AUDIOHOOK_DIRECTION_WRITE)) || | ||||
| 		(ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE) == (AST_AUDIOHOOK_MUTE_READ | AST_AUDIOHOOK_MUTE_WRITE))) { | ||||
| 			muteme = 1; | ||||
| 	} | ||||
|  | ||||
| 	if (muteme && frame->datalen > 0) { | ||||
| 		ast_frame_clear(frame); | ||||
| 	} | ||||
|  | ||||
| 	/* Write frame out to respective factory */ | ||||
| 	ast_slinfactory_feed(factory, frame); | ||||
|  | ||||
| @@ -246,8 +239,11 @@ static struct ast_frame *audiohook_read_frame_single(struct ast_audiohook *audio | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	/* If a volume adjustment needs to be applied apply it */ | ||||
| 	if (vol) { | ||||
| 	if (SHOULD_MUTE(audiohook, direction)) { | ||||
| 		/* Swap frame data for zeros if mute is required */ | ||||
| 		ast_frame_clear(&frame); | ||||
| 	} else if (vol) { | ||||
| 		/* If a volume adjustment needs to be applied apply it */ | ||||
| 		ast_frame_adjust_volume(&frame, vol); | ||||
| 	} | ||||
|  | ||||
| @@ -296,8 +292,12 @@ static struct ast_frame *audiohook_read_frame_both(struct ast_audiohook *audioho | ||||
| 	if (usable_read) { | ||||
| 		if (ast_slinfactory_read(&audiohook->read_factory, buf1, samples)) { | ||||
| 			read_buf = buf1; | ||||
| 			/* Adjust read volume if need be */ | ||||
| 			if (audiohook->options.read_volume) { | ||||
|  | ||||
| 			if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_READ))) { | ||||
| 				/* Clear the frame data if we are muting */ | ||||
| 				memset(buf1, 0, sizeof(buf1)); | ||||
| 			} else if (audiohook->options.read_volume) { | ||||
| 				/* Adjust read volume if need be */ | ||||
| 				adjust_value = abs(audiohook->options.read_volume); | ||||
| 				for (count = 0; count < samples; count++) { | ||||
| 					if (audiohook->options.read_volume > 0) { | ||||
| @@ -316,8 +316,12 @@ static struct ast_frame *audiohook_read_frame_both(struct ast_audiohook *audioho | ||||
| 	if (usable_write) { | ||||
| 		if (ast_slinfactory_read(&audiohook->write_factory, buf2, samples)) { | ||||
| 			write_buf = buf2; | ||||
| 			/* Adjust write volume if need be */ | ||||
| 			if (audiohook->options.write_volume) { | ||||
|  | ||||
| 			if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE))) { | ||||
| 				/* Clear the frame data if we are muting */ | ||||
| 				memset(buf2, 0, sizeof(buf2)); | ||||
| 			} else if (audiohook->options.write_volume) { | ||||
| 				/* Adjust write volume if need be */ | ||||
| 				adjust_value = abs(audiohook->options.write_volume); | ||||
| 				for (count = 0; count < samples; count++) { | ||||
| 					if (audiohook->options.write_volume > 0) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user