aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-20 17:41:45 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-20 17:41:45 +0000
commit4d73f2d532a21f46acbc6d3223dc41f0d81d8a0f (patch)
tree577048cc194cdf04ce551e8f27f3c847b08d698c
parent62b36526d50a6c1c37868351471e0b8d8ba52857 (diff)
Merged revisions 110268 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r110268 | russell | 2008-03-20 12:41:22 -0500 (Thu, 20 Mar 2008) | 27 lines Add some fixes that I made in regards to wideband codec handling to get G.722 music on hold working for me. (issue #12164, reported by milazzo and jsmith, patches by me) res/res_musiconhold.c: - I moved a single line so that the sample queue update happened before ast_write(). The reason that this was a bug is that the G.722 frame originally says it has 320 samples in it (which is correct). However, when the frame is written to a channel that uses RTP, main/rtp.c modifies the frame to cut the number of samples in half before it sends it on the wire. This is to account for the stupid incorrect G.722 spec that makes it so we have to lie about the number of samples with RTP. I should probably go and re-work the RTP code so it doesn't modify the frame so that a bug like this won't happen in the future. However, this change to MOH is harmless. main/channel.c: - I made two fixes in regards to generator timing. Generators use samples for timing. However, this code assumed 8 kHz samples. In one case, it was a hard coded 160 samples, that is now written as the sample rate / 50. The other place was dealing with timing a generator based on frames coming from the other direction. However, that would have only worked if the sample rates for the formats in both directions were the same. The code now takes into account that the sample rates may differ, and scales the generator samples accordingly. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@110269 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/channel.c13
-rw-r--r--res/res_musiconhold.c2
2 files changed, 12 insertions, 3 deletions
diff --git a/main/channel.c b/main/channel.c
index aeb4845cc..920ee37dd 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 1b44b3dfd..e7044eff9 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));