diff options
author | Sean Bright <sean.bright@gmail.com> | 2017-02-01 16:56:50 -0500 |
---|---|---|
committer | Sean Bright <sean.bright@gmail.com> | 2017-02-01 17:00:26 -0600 |
commit | 2849b726b680b907be35459f3cdb96a73fc58fd7 (patch) | |
tree | 172ab26181aa0c3fd15530a588ac80244e28487d /main/audiohook.c | |
parent | 97d58add328cdfdbbf6d7ea7498e4789eaf47353 (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.c | 40 |
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) { |