float lrxgain;
int j,k;
g.chan = chan;
- /* caluculate linear value of tx gain */
- ltxgain = pow(10.0,txgain / 20.0);
- /* caluculate linear value of rx gain */
- lrxgain = pow(10.0,rxgain / 20.0);
- if (law == ZT_LAW_ALAW) {
- for (j=0;j<256;j++) {
- k = (int)(((float)AST_ALAW(j)) * lrxgain);
- if (k > 32767) k = 32767;
- if (k < -32767) k = -32767;
- g.rxgain[j] = AST_LIN2A(k);
- k = (int)(((float)AST_ALAW(j)) * ltxgain);
- if (k > 32767) k = 32767;
- if (k < -32767) k = -32767;
- g.txgain[j] = AST_LIN2A(k);
+ if ((rxgain != 0.0) || (txgain != 0.0)) {
+ /* caluculate linear value of tx gain */
+ ltxgain = pow(10.0,txgain / 20.0);
+ /* caluculate linear value of rx gain */
+ lrxgain = pow(10.0,rxgain / 20.0);
+ if (law == ZT_LAW_ALAW) {
+ for (j=0;j<256;j++) {
+ k = (int)(((float)AST_ALAW(j)) * lrxgain);
+ if (k > 32767) k = 32767;
+ if (k < -32767) k = -32767;
+ g.rxgain[j] = AST_LIN2A(k);
+ k = (int)(((float)AST_ALAW(j)) * ltxgain);
+ if (k > 32767) k = 32767;
+ if (k < -32767) k = -32767;
+ g.txgain[j] = AST_LIN2A(k);
+ }
+ } else {
+ for (j=0;j<256;j++) {
+ k = (int)(((float)AST_MULAW(j)) * lrxgain);
+ if (k > 32767) k = 32767;
+ if (k < -32767) k = -32767;
+ g.rxgain[j] = AST_LIN2MU(k);
+ k = (int)(((float)AST_MULAW(j)) * ltxgain);
+ if (k > 32767) k = 32767;
+ if (k < -32767) k = -32767;
+ g.txgain[j] = AST_LIN2MU(k);
+ }
}
} else {
for (j=0;j<256;j++) {
- k = (int)(((float)AST_MULAW(j)) * lrxgain);
- if (k > 32767) k = 32767;
- if (k < -32767) k = -32767;
- g.rxgain[j] = AST_LIN2MU(k);
- k = (int)(((float)AST_MULAW(j)) * ltxgain);
- if (k > 32767) k = 32767;
- if (k < -32767) k = -32767;
- g.txgain[j] = AST_LIN2MU(k);
+ g.rxgain[j] = j;
+ g.txgain[j] = j;
}
}
+
/* set 'em */
return(ioctl(fd,ZT_SETGAINS,&g));
}