diff --git a/main/channel.c b/main/channel.c index aeb4845ccc..920ee37dda 100644 --- a/main/channel.c +++ b/main/channel.c @@ -1724,7 +1724,7 @@ static int generator_force(const void *data) if (!tmp || !generate) return 0; - res = generate(chan, tmp, 0, 160); + res = generate(chan, tmp, 0, ast_format_rate(chan->writeformat & AST_FORMAT_AUDIO_MASK) / 50); chan->generatordata = tmp; @@ -2256,6 +2256,7 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram if (chan->generatordata && !ast_internal_timing_enabled(chan)) { void *tmp = chan->generatordata; int res; + int samples; if (chan->timingfunc) { if (option_debug > 1) @@ -2264,7 +2265,15 @@ static void ast_read_generator_actions(struct ast_channel *chan, struct ast_fram } chan->generatordata = NULL; /* reset, to let writes go through */ - res = chan->generator->generate(chan, tmp, f->datalen, f->samples); + + if (f->subclass != chan->writeformat) { + float factor; + factor = ((float) ast_format_rate(chan->writeformat)) / ((float) ast_format_rate(f->subclass)); + samples = (int) ( ((float) f->samples) * factor ); + } else { + samples = f->samples; + } + res = chan->generator->generate(chan, tmp, f->datalen, samples); chan->generatordata = tmp; if (res) { if (option_debug > 1) diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c index 1b44b3dfd8..e7044eff9d 100644 --- a/res/res_musiconhold.c +++ b/res/res_musiconhold.c @@ -312,8 +312,8 @@ static int moh_files_generator(struct ast_channel *chan, void *data, int len, in while (state->sample_queue > 0) { if ((f = moh_files_readframe(chan))) { state->samples += f->samples; - res = ast_write(chan, f); state->sample_queue -= f->samples; + res = ast_write(chan, f); ast_frfree(f); if (res < 0) { ast_log(LOG_WARNING, "Failed to write frame to '%s': %s\n", chan->name, strerror(errno));