diff --git a/main/audiohook.c b/main/audiohook.c index 8a0055e4b46be389278323a9baccdcd3a629ca17..836ae0496fd617cb36a47bc159cb33c4d46f74df 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) {