Index: asterisk-1.6.2.18/main/channel.c =================================================================== --- asterisk-1.6.2.18.orig/main/channel.c 2011-05-04 13:50:05.000000000 +0100 +++ asterisk-1.6.2.18/main/channel.c 2011-05-04 14:56:54.000000000 +0100 @@ -4730,6 +4730,41 @@ ); } +static void ast_sync_monitor(struct ast_channel *chan) +{ + if (!chan->monitor || !chan->monitor->write_stream || !chan->monitor->read_stream) + return; + +#ifndef MONITOR_CONSTANT_DELAY + int jump = chan->insmpl - chan->outsmpl; + if (jump >= 0) { + jump = calc_monitor_jump((chan->insmpl - chan->outsmpl), ast_format_rate(chan->monitor->write_stream->fmt->format), ast_format_rate(chan->monitor->read_stream->fmt->format)); + if (ast_seekstream(chan->monitor->write_stream, jump, SEEK_FORCECUR) == -1) + ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n"); + chan->outsmpl += chan->insmpl - chan->outsmpl; + } else { + jump = calc_monitor_jump((chan->outsmpl - chan->insmpl), ast_format_rate(chan->monitor->read_stream->fmt->format), ast_format_rate(chan->monitor->write_stream->fmt->format)); + if (ast_seekstream(chan->monitor->read_stream, jump, SEEK_FORCECUR) == -1) + ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n"); + chan->insmpl += chan->outsmpl - chan->insmpl; + } +#else + int jump = calc_monitor_jump((chan->insmpl - chan->outsmpl), ast_format_rate(chan->monitor->write_stream->fmt->format), ast_format_rate(chan->monitor->read_stream->fmt->format)); + if (jump - MONITOR_DELAY >= 0) { + if (ast_seekstream(chan->monitor->write_stream, jump, SEEK_FORCECUR) == -1) + ast_log(LOG_WARNING, "Failed to perform seek in monitoring write stream, synchronization between the files may be broken\n"); + chan->outsmpl += chan->insmpl - chan->outsmpl; + } + + jump = calc_monitor_jump((chan->outsmpl - chan->insmpl), ast_format_rate(chan->monitor->read_stream->fmt->format), ast_format_rate(chan->monitor->write_stream->fmt->format)); + if (jump - MONITOR_DELAY >= 0) { + if (ast_seekstream(chan->monitor->read_stream, jump, SEEK_FORCECUR) == -1) + ast_log(LOG_WARNING, "Failed to perform seek in monitoring read stream, synchronization between the files may be broken\n"); + chan->insmpl += chan->outsmpl - chan->insmpl; + } +#endif +} + /*! \brief Masquerade a channel @@ -4888,6 +4923,8 @@ manager_event(EVENT_FLAG_CALL, "Rename", "Channel: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", masqn, zombn, clonechan->uniqueid); /* Update the type. */ + ast_sync_monitor(original); + ast_sync_monitor(clonechan); t_pvt = original->monitor; original->monitor = clonechan->monitor; clonechan->monitor = t_pvt;