summaryrefslogtreecommitdiff
path: root/main/audiohook.c
diff options
context:
space:
mode:
authorSean Bright <sean.bright@gmail.com>2017-02-01 16:56:50 -0500
committerSean Bright <sean.bright@gmail.com>2017-02-01 17:00:26 -0600
commit2849b726b680b907be35459f3cdb96a73fc58fd7 (patch)
tree172ab26181aa0c3fd15530a588ac80244e28487d /main/audiohook.c
parent97d58add328cdfdbbf6d7ea7498e4789eaf47353 (diff)
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
Diffstat (limited to 'main/audiohook.c')
-rw-r--r--main/audiohook.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/main/audiohook.c b/main/audiohook.c
index 8a0055e4b..836ae0496 100644
--- a/main/audiohook.c
+++ b/main/audiohook.c
@@ -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) {