Index: audiohook.c =================================================================== --- audiohook.c (revision 381728) +++ audiohook.c (working copy) @@ -32,6 +32,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include +#include #include "asterisk/channel.h" #include "asterisk/utils.h" @@ -133,7 +134,6 @@ 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(); @@ -158,17 +158,6 @@ 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); @@ -205,8 +194,17 @@ if (!ast_slinfactory_read(factory, buf, samples)) return NULL; + /* 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))) { + + ast_frame_clear(&frame); + + } + /* If a volume adjustment needs to be applied apply it */ - if (vol) + else if (vol) ast_frame_adjust_volume(&frame, vol); return ast_frdup(&frame); @@ -250,8 +248,15 @@ if (usable_read) { if (ast_slinfactory_read(&audiohook->read_factory, buf1, samples)) { read_buf = buf1; + + /* swap frame data for zeros if mute is required */ + if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_READ) ) ) { + memset(buf1, 0, sizeof buf1); + + } + /* Adjust read volume if need be */ - if (audiohook->options.read_volume) { + else if (audiohook->options.read_volume) { int count = 0; short adjust_value = abs(audiohook->options.read_volume); for (count = 0; count < samples; count++) { @@ -269,8 +274,15 @@ if (usable_write) { if (ast_slinfactory_read(&audiohook->write_factory, buf2, samples)) { write_buf = buf2; + + /* swap frame data for zeros if mute is required */ + if ((ast_test_flag(audiohook, AST_AUDIOHOOK_MUTE_WRITE) ) ) { + memset(buf2, 0, sizeof buf2); + + } + /* Adjust write volume if need be */ - if (audiohook->options.write_volume) { + else if (audiohook->options.write_volume) { int count = 0; short adjust_value = abs(audiohook->options.write_volume); for (count = 0; count < samples; count++) {