mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +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; | 	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 | /*! \brief Writes a frame into the audiohook structure | ||||||
|  * \param audiohook Audiohook structure |  * \param audiohook Audiohook structure | ||||||
|  * \param direction Direction the audio frame came from |  * \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 our_factory_ms; | ||||||
| 	int other_factory_samples; | 	int other_factory_samples; | ||||||
| 	int other_factory_ms; | 	int other_factory_ms; | ||||||
| 	int muteme = 0; |  | ||||||
|  |  | ||||||
| 	/* Update last feeding time to be current */ | 	/* Update last feeding time to be current */ | ||||||
| 	*rwtime = ast_tvnow(); | 	*rwtime = ast_tvnow(); | ||||||
| @@ -197,17 +201,6 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo | |||||||
| 		ast_slinfactory_flush(other_factory); | 		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 */ | 	/* Write frame out to respective factory */ | ||||||
| 	ast_slinfactory_feed(factory, frame); | 	ast_slinfactory_feed(factory, frame); | ||||||
|  |  | ||||||
| @@ -246,8 +239,11 @@ static struct ast_frame *audiohook_read_frame_single(struct ast_audiohook *audio | |||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* If a volume adjustment needs to be applied apply it */ | 	if (SHOULD_MUTE(audiohook, direction)) { | ||||||
| 	if (vol) { | 		/* 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); | 		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 (usable_read) { | ||||||
| 		if (ast_slinfactory_read(&audiohook->read_factory, buf1, samples)) { | 		if (ast_slinfactory_read(&audiohook->read_factory, buf1, samples)) { | ||||||
| 			read_buf = buf1; | 			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); | 				adjust_value = abs(audiohook->options.read_volume); | ||||||
| 				for (count = 0; count < samples; count++) { | 				for (count = 0; count < samples; count++) { | ||||||
| 					if (audiohook->options.read_volume > 0) { | 					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 (usable_write) { | ||||||
| 		if (ast_slinfactory_read(&audiohook->write_factory, buf2, samples)) { | 		if (ast_slinfactory_read(&audiohook->write_factory, buf2, samples)) { | ||||||
| 			write_buf = buf2; | 			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); | 				adjust_value = abs(audiohook->options.write_volume); | ||||||
| 				for (count = 0; count < samples; count++) { | 				for (count = 0; count < samples; count++) { | ||||||
| 					if (audiohook->options.write_volume > 0) { | 					if (audiohook->options.write_volume > 0) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user