On Thu, 2006-01-19 at 03:15 +0100, Pisac wrote: > I compiled it, and it's WORKING. > Thanks. > > But, I would realy realy realy like that somebody explain to me how is > exactly that bug hidden in those two segments? Where is difference? > Anybody? > > 1) > if (!IS_DIGITAL(ast->transfercapability)) { > set_actual_gain(p->subs[SUB_REAL].zfd, 0, p->rxgain, p->txgain, > p->law); > } else { > set_actual_gain(p->subs[SUB_REAL].zfd, 0, 0, 0, p->law); } > > 2) > if (IS_DIGITAL(ast->transfercapability)) { > set_actual_gain(p->subs[SUB_REAL].zfd, 0, 0, 0, p->law); > } else { > set_actual_gain(p->subs[SUB_REAL].zfd, 0, p->rxgain, p->txgain, > p->law); }
The problem results from the way the IS_DIGITAL() macro is defined in include/asterisk/transcap.h: #define IS_DIGITAL(cap)\ (cap) & AST_TRANS_CAP_DIGITAL ? 1 : 0 So the expression !IS_DIGITAL(foo) expands to !(foo) & AST_TRANS_CAP_DIGITAL ? 1 : 0 which is equivalent to ( !(foo) ) & AST_TRANS_CAP_DIGITAL ? 1 : 0 while one would like to have !( (foo) & AST_TRANS_CAP_DIGITAL ? 1 : 0 ) Rewriting the original statement removes the "!" operator and everything is fine. The two "if" statements would be equivalent (and both correct) if the definition in transcap.h followed best practices to avoid problems with operator precedence and looked like this: #define IS_DIGITAL(cap)\ ((cap) & AST_TRANS_CAP_DIGITAL ? 1 : 0) Regards, Mike -- Dr. Michael Neuhauser phone: +43 1 789 08 49 - 30 Firmix Software GmbH fax: +43 1 789 08 49 - 55 Vienna/Austria/Europe email: [EMAIL PROTECTED] Embedded Linux Development and Services http://www.firmix.at/ _______________________________________________ --Bandwidth and Colocation provided by Easynews.com -- Asterisk-Users mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/asterisk-users