]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Add some fixes that I made in regards to wideband codec handling to get
authorRussell Bryant <russell@russellbryant.com>
Thu, 20 Mar 2008 17:41:22 +0000 (17:41 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 20 Mar 2008 17:41:22 +0000 (17:41 +0000)
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: https://origsvn.digium.com/svn/asterisk/trunk@110268 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/channel.c
res/res_musiconhold.c

index aeb4845ccc5b93c35a5d8d6f6273150b98d129f5..920ee37ddaf97734381f810453f9b7ebebfc52d3 100644 (file)
@@ -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)
index 1b44b3dfd8463ed601fb38d48c66635e660b8634..e7044eff9d7201efcbb5ba59b32600d29e46d060 100644 (file)
@@ -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));