programmer_ted
2004-Jun-30 11:39 UTC
[Asterisk-Users] Bugfix for CVS-HEAD-06/26/04-21:56:45
Hiya, I sent this bugfix to the asterisk-dev mailing list, and modified it as I noticed side effects, but now it appears to be finished. Nobody seemed to notice it there, so I thought I'd post here, as it seems to be something that will be needed as people update to the latest CVS version. So...read on :) Ted programmer_ted@hotmail.com P.S. Read to the very end. The original bugfix has an annoying side effect.>>>>>Hi, >>>>> >>>>>My friend and I were getting a warning when calling his Sipura from a >>>>>PSTN line (connecting to Asterisk through BroadVoice), that said: >>>>> >>>>>Asked to transmit frame type 64, while native formats is 4 (read/write >>>>>= 4/4) >>>>> >>>>>and was followed by a hangup (type 64 is 16-bit Signed Linear PCM, >>>>>type 4 is G711u). I found that many people have had similar issues, >>>>>but these were never resolved. So, I figured that because Asterisk is >>>>>open-source, I'd dive into the code and try to fix the bug. >>>>> >>>>>After a couple of hours of familiarizing myself with the Asterisk code >>>>>and tracing the problem, I found that for some reason the tone >>>>>generator, which uses 16-bit Signed Linear PCM, was still being >>>>>allocated and playtones_generator (indications.c) was still getting >>>>>called, regardless that the Sipura doesn't take SLINEAR data (in my >>>>>case, it accepts G711u). So, I ended up adding an if conditional to >>>>>the beginning of the playtones_alloc function (indications.c) to check >>>>>if SLINEAR was supported by the channel, and if not, return 0 (which, >>>>>when received by the ast_activate_generator function (channel.c), >>>>>causes the channel generatordata to remain empty, effectively stopping >>>>>the SLINEAR data from being sent in the most nonintrusive way possible). >>>>> >>>>>NOTICE: this bugfix will work for similar issues involving format 64 >>>>>(16-bit Signed Linear PCM) being sent even if channel capabilities >>>>>don't allow it, if the generator is involved - it's not limited to my >>>>>situation (dialing the Sipura from Asterisk). >>>>> >>>>>This patch should be applied to indications.c under the main asterisk >>>>>source directory (usually /usr/src/asterisk): >>>>> >>>>>68a69 >>>>> > if (!(chan->nativeformats & AST_FORMAT_SLINEAR)) return 0; >>>>> >>>>>Oh, and finally, here's a shameless plug to a good friend's website >>>>>(which includes a VOIP forum!): http://outcast.ws >>>>> >>>>>Comments? Questions? :) >>>> >>>>Just a quick update. I was looking things over again and it appears >>>>this fix also disables the generator when I'm calling in on PSTN over >>>>BroadVoice (when dialing the Sipura), not just disabling it for the >>>>Sipura. This basically disables the dialing sound while waiting for >>>>the Sipura to pick up. I have an idea that I should have used >>>>chan->capabilities rather than chan->nativeformats, but it's too late >>>>to check at the moment. I'll try it out first thing tomorrow and >>>>update you guys, but for now, that's one drawback of using this fix. >>> >>>I thought it over a little bit more and the optimum solution would be to >>>just translate the SLINEAR data to a format that is recognized by >>>whoever is receiving the data, thus eliminating all drawbacks. I'm >>>going to try using capabilities rather than nativeformats as a quick >>>workaround (after debugging to see if it'll work), and then work on >>>adding the translating code to sip_write. Actually, thinking about it >>>again, it'd probably be best to just translate at the >>>playtones_generator function. I'll keep you guys updated. >>> >>>...snipped non-relevant signature info etc... >> >>Learning as I go. It appears I don't have access to the capabilities >>value from the ast_channel structure. I'm just gonna go ahead and have >>the SLINEAR data translate to the channel's writeformat. > >Ok, as I thought, PSTN over BroadVoice does not understand SLINEAR >natively, which is why the dialing sound was also disabled when I dialed >the Sipura. I added some code to playtones_alloc (indications.c) so that >the write format is only set to SLINEAR if it's supported, and added some >code to playtones_generator to translate from SLINEAR to the channel's >writeformat if SLINEAR isn't supported natively by the channel. Of >course, I also had to include the translate.h header. > >Conclusion: playtones_generator now works regardless of SLINEAR support by >the channel, as long as a translator path can be found from SLINEAR to the >channel's writeformat. If SLINEAR is supported, no translation takes >place. This should fix some bugs where format 64 is being sent regardless >of codec allow settings in the configuration files. > >Apply this patch to indications.c: > >28a29 > > #include <asterisk/translate.h> /* Needed for bugfix */ >75c76 >< if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) { >--- > > if ((chan->nativeformats & AST_FORMAT_SLINEAR) && > ast_set_write_format(chan, AST_FORMAT_SLINEAR)) { >128c129,142 >< ast_write(chan, &ps->f); >--- > > > > // Now, we have a finished SLINEAR frame that we need to > translate, IF > > // the channel doesn't support SLINEAR. Otherwise, we need to just > > // write the SLINEAR frame. > > if (!(chan->nativeformats & AST_FORMAT_SLINEAR)) { > > struct ast_trans_pvt* transPath = > ast_translator_build_path(chan->writeformat, AST_FORMAT_SLINEAR); > > struct ast_frame* transFrame = ast_translate(transPath, > &ps->f, 0); > > if (transFrame) { > > ast_write(chan, transFrame); > > ast_frfree(transFrame); > > } > > ast_translator_free_path(transPath); > > } > > else ast_write(chan, &ps->f); > >Hopefully, this fixes the problem for good.
I am encountering the same issues EXACTLY with a GrandStream BT101. I had to downgrade to the CVS as of 6/7 in order to get the grandstreams to work. It seems that a change thereafter is causing this issue... it only happens when called from PSTN -> Asterisk. Calls through asterisk between phones don't show this and calls from the phone -> PSTN don't do this either... -Chris ----- Original Message ----- From: "programmer_ted" <ted@fusionapple.com> To: <asterisk-users@lists.digium.com> Sent: Wednesday, June 30, 2004 11:39 AM Subject: [Asterisk-Users] Bugfix for CVS-HEAD-06/26/04-21:56:45> Hiya, > > I sent this bugfix to the asterisk-dev mailing list, and modified it as I > noticed side effects, but now it appears to be finished. Nobody seemed to > notice it there, so I thought I'd post here, as it seems to be something > that will be needed as people update to the latest CVS version. So...read > on :) > > Ted > programmer_ted@hotmail.com > > P.S. Read to the very end. The original bugfix has an annoying sideeffect.> > > >>>>>Hi, > >>>>> > >>>>>My friend and I were getting a warning when calling his Sipura from a > >>>>>PSTN line (connecting to Asterisk through BroadVoice), that said: > >>>>> > >>>>>Asked to transmit frame type 64, while native formats is 4(read/write> >>>>>= 4/4) > >>>>> > >>>>>and was followed by a hangup (type 64 is 16-bit Signed Linear PCM, > >>>>>type 4 is G711u). I found that many people have had similar issues, > >>>>>but these were never resolved. So, I figured that because Asteriskis> >>>>>open-source, I'd dive into the code and try to fix the bug. > >>>>> > >>>>>After a couple of hours of familiarizing myself with the Asteriskcode> >>>>>and tracing the problem, I found that for some reason the tone > >>>>>generator, which uses 16-bit Signed Linear PCM, was still being > >>>>>allocated and playtones_generator (indications.c) was still getting > >>>>>called, regardless that the Sipura doesn't take SLINEAR data (in my > >>>>>case, it accepts G711u). So, I ended up adding an if conditional to > >>>>>the beginning of the playtones_alloc function (indications.c) tocheck> >>>>>if SLINEAR was supported by the channel, and if not, return 0 (which, > >>>>>when received by the ast_activate_generator function (channel.c), > >>>>>causes the channel generatordata to remain empty, effectivelystopping> >>>>>the SLINEAR data from being sent in the most nonintrusive waypossible).> >>>>> > >>>>>NOTICE: this bugfix will work for similar issues involving format 64 > >>>>>(16-bit Signed Linear PCM) being sent even if channel capabilities > >>>>>don't allow it, if the generator is involved - it's not limited to my > >>>>>situation (dialing the Sipura from Asterisk). > >>>>> > >>>>>This patch should be applied to indications.c under the main asterisk > >>>>>source directory (usually /usr/src/asterisk): > >>>>> > >>>>>68a69 > >>>>> > if (!(chan->nativeformats & AST_FORMAT_SLINEAR)) return 0; > >>>>> > >>>>>Oh, and finally, here's a shameless plug to a good friend's website > >>>>>(which includes a VOIP forum!): http://outcast.ws > >>>>> > >>>>>Comments? Questions? :) > >>>> > >>>>Just a quick update. I was looking things over again and it appears > >>>>this fix also disables the generator when I'm calling in on PSTN over > >>>>BroadVoice (when dialing the Sipura), not just disabling it for the > >>>>Sipura. This basically disables the dialing sound while waiting for > >>>>the Sipura to pick up. I have an idea that I should have used > >>>>chan->capabilities rather than chan->nativeformats, but it's too late > >>>>to check at the moment. I'll try it out first thing tomorrow and > >>>>update you guys, but for now, that's one drawback of using this fix. > >>> > >>>I thought it over a little bit more and the optimum solution would beto> >>>just translate the SLINEAR data to a format that is recognized by > >>>whoever is receiving the data, thus eliminating all drawbacks. I'm > >>>going to try using capabilities rather than nativeformats as a quick > >>>workaround (after debugging to see if it'll work), and then work on > >>>adding the translating code to sip_write. Actually, thinking about it > >>>again, it'd probably be best to just translate at the > >>>playtones_generator function. I'll keep you guys updated. > >>> > >>>...snipped non-relevant signature info etc... > >> > >>Learning as I go. It appears I don't have access to the capabilities > >>value from the ast_channel structure. I'm just gonna go ahead and have > >>the SLINEAR data translate to the channel's writeformat. > > > >Ok, as I thought, PSTN over BroadVoice does not understand SLINEAR > >natively, which is why the dialing sound was also disabled when I dialed > >the Sipura. I added some code to playtones_alloc (indications.c) so that > >the write format is only set to SLINEAR if it's supported, and added some > >code to playtones_generator to translate from SLINEAR to the channel's > >writeformat if SLINEAR isn't supported natively by the channel. Of > >course, I also had to include the translate.h header. > > > >Conclusion: playtones_generator now works regardless of SLINEAR supportby> >the channel, as long as a translator path can be found from SLINEAR tothe> >channel's writeformat. If SLINEAR is supported, no translation takes > >place. This should fix some bugs where format 64 is being sentregardless> >of codec allow settings in the configuration files. > > > >Apply this patch to indications.c: > > > >28a29 > > > #include <asterisk/translate.h> /* Needed for bugfix */ > >75c76 > >< if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) { > >--- > > > if ((chan->nativeformats & AST_FORMAT_SLINEAR) && > > ast_set_write_format(chan, AST_FORMAT_SLINEAR)) { > >128c129,142 > >< ast_write(chan, &ps->f); > >--- > > > > > > // Now, we have a finished SLINEAR frame that we need to > > translate, IF > > > // the channel doesn't support SLINEAR. Otherwise, we need tojust> > > // write the SLINEAR frame. > > > if (!(chan->nativeformats & AST_FORMAT_SLINEAR)) { > > > struct ast_trans_pvt* transPath > > ast_translator_build_path(chan->writeformat, AST_FORMAT_SLINEAR); > > > struct ast_frame* transFrame = ast_translate(transPath, > > &ps->f, 0); > > > if (transFrame) { > > > ast_write(chan, transFrame); > > > ast_frfree(transFrame); > > > } > > > ast_translator_free_path(transPath); > > > } > > > else ast_write(chan, &ps->f); > > > >Hopefully, this fixes the problem for good. > > _______________________________________________ > Asterisk-Users mailing list > Asterisk-Users@lists.digium.com > http://lists.digium.com/mailman/listinfo/asterisk-users > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-users
Holger Schurig
2004-Jun-30 23:59 UTC
[Asterisk-Users] Bugfix for CVS-HEAD-06/26/04-21:56:45
> I sent this bugfix to the asterisk-dev mailing list, [...]. Nobody > seemed to notice it there, so I thought I'd post here,Please file a bug report at http://bugs.digium.com and attach your bug fix.
Dear Ted i have notice the same problem had you reported from monday, i have try to update to today CVS HEAD but nothing still buggy so i roolback to Stable V1. Where i can find the pacth? Thanks in advance Dimitri On Wednesday 30 June 2004 08:39 pm, programmer_ted wrote:> Hiya, > > I sent this bugfix to the asterisk-dev mailing list, and modified it as I > noticed side effects, but now it appears to be finished. Nobody seemed to > notice it there, so I thought I'd post here, as it seems to be something > that will be needed as people update to the latest CVS version. So...read > on :) > > Ted > programmer_ted@hotmail.com > > P.S. Read to the very end. The original bugfix has an annoying side > effect. > > >>>>>Hi, > >>>>> > >>>>>My friend and I were getting a warning when calling his Sipura from a > >>>>>PSTN line (connecting to Asterisk through BroadVoice), that said: > >>>>> > >>>>>Asked to transmit frame type 64, while native formats is 4 (read/write > >>>>>= 4/4) > >>>>> > >>>>>and was followed by a hangup (type 64 is 16-bit Signed Linear PCM, > >>>>>type 4 is G711u). I found that many people have had similar issues, > >>>>>but these were never resolved. So, I figured that because Asterisk is > >>>>>open-source, I'd dive into the code and try to fix the bug. > >>>>> > >>>>>After a couple of hours of familiarizing myself with the Asterisk code > >>>>>and tracing the problem, I found that for some reason the tone > >>>>>generator, which uses 16-bit Signed Linear PCM, was still being > >>>>>allocated and playtones_generator (indications.c) was still getting > >>>>>called, regardless that the Sipura doesn't take SLINEAR data (in my > >>>>>case, it accepts G711u). So, I ended up adding an if conditional to > >>>>>the beginning of the playtones_alloc function (indications.c) to check > >>>>>if SLINEAR was supported by the channel, and if not, return 0 (which, > >>>>>when received by the ast_activate_generator function (channel.c), > >>>>>causes the channel generatordata to remain empty, effectively stopping > >>>>>the SLINEAR data from being sent in the most nonintrusive way > >>>>> possible). > >>>>> > >>>>>NOTICE: this bugfix will work for similar issues involving format 64 > >>>>>(16-bit Signed Linear PCM) being sent even if channel capabilities > >>>>>don't allow it, if the generator is involved - it's not limited to my > >>>>>situation (dialing the Sipura from Asterisk). > >>>>> > >>>>>This patch should be applied to indications.c under the main asterisk > >>>>>source directory (usually /usr/src/asterisk): > >>>>> > >>>>>68a69 > >>>>> > >>>>> > if (!(chan->nativeformats & AST_FORMAT_SLINEAR)) return 0; > >>>>> > >>>>>Oh, and finally, here's a shameless plug to a good friend's website > >>>>>(which includes a VOIP forum!): http://outcast.ws > >>>>> > >>>>>Comments? Questions? :) > >>>> > >>>>Just a quick update. I was looking things over again and it appears > >>>>this fix also disables the generator when I'm calling in on PSTN over > >>>>BroadVoice (when dialing the Sipura), not just disabling it for the > >>>>Sipura. This basically disables the dialing sound while waiting for > >>>>the Sipura to pick up. I have an idea that I should have used > >>>>chan->capabilities rather than chan->nativeformats, but it's too late > >>>>to check at the moment. I'll try it out first thing tomorrow and > >>>>update you guys, but for now, that's one drawback of using this fix. > >>> > >>>I thought it over a little bit more and the optimum solution would be to > >>>just translate the SLINEAR data to a format that is recognized by > >>>whoever is receiving the data, thus eliminating all drawbacks. I'm > >>>going to try using capabilities rather than nativeformats as a quick > >>>workaround (after debugging to see if it'll work), and then work on > >>>adding the translating code to sip_write. Actually, thinking about it > >>>again, it'd probably be best to just translate at the > >>>playtones_generator function. I'll keep you guys updated. > >>> > >>>...snipped non-relevant signature info etc... > >> > >>Learning as I go. It appears I don't have access to the capabilities > >>value from the ast_channel structure. I'm just gonna go ahead and have > >>the SLINEAR data translate to the channel's writeformat. > > > >Ok, as I thought, PSTN over BroadVoice does not understand SLINEAR > >natively, which is why the dialing sound was also disabled when I dialed > >the Sipura. I added some code to playtones_alloc (indications.c) so that > >the write format is only set to SLINEAR if it's supported, and added some > >code to playtones_generator to translate from SLINEAR to the channel's > >writeformat if SLINEAR isn't supported natively by the channel. Of > >course, I also had to include the translate.h header. > > > >Conclusion: playtones_generator now works regardless of SLINEAR support by > >the channel, as long as a translator path can be found from SLINEAR to the > >channel's writeformat. If SLINEAR is supported, no translation takes > >place. This should fix some bugs where format 64 is being sent regardless > >of codec allow settings in the configuration files. > > > >Apply this patch to indications.c: > > > >28a29 > > > > > #include <asterisk/translate.h> /* Needed for bugfix */ > > > >75c76 > >< if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) { > >--- > > > > > if ((chan->nativeformats & AST_FORMAT_SLINEAR) && > > > > ast_set_write_format(chan, AST_FORMAT_SLINEAR)) { > >128c129,142 > >< ast_write(chan, &ps->f); > >--- > > > > > // Now, we have a finished SLINEAR frame that we need to > > > > translate, IF > > > > > // the channel doesn't support SLINEAR. Otherwise, we need to > > > just // write the SLINEAR frame. > > > if (!(chan->nativeformats & AST_FORMAT_SLINEAR)) { > > > struct ast_trans_pvt* transPath > > > > ast_translator_build_path(chan->writeformat, AST_FORMAT_SLINEAR); > > > > > struct ast_frame* transFrame = ast_translate(transPath, > > > > &ps->f, 0); > > > > > if (transFrame) { > > > ast_write(chan, transFrame); > > > ast_frfree(transFrame); > > > } > > > ast_translator_free_path(transPath); > > > } > > > else ast_write(chan, &ps->f); > > > >Hopefully, this fixes the problem for good. > > _______________________________________________ > Asterisk-Users mailing list > Asterisk-Users@lists.digium.com > http://lists.digium.com/mailman/listinfo/asterisk-users > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-users