]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
OPENZAP-74 thx Raul see you at ClueCon
authorMathieu Rene <mrene@avgs.ca>
Thu, 4 Jun 2009 16:18:22 +0000 (16:18 +0000)
committerMathieu Rene <mrene@avgs.ca>
Thu, 4 Jun 2009 16:18:22 +0000 (16:18 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@736 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/conf/zt.conf
libs/freetdm/src/include/zap_types.h
libs/freetdm/src/ozmod/ozmod_zt/ozmod_zt.c

index ac60475b25fb61e0e16294956495d3f628c22594..a060a403159f2ebb7a3d4a0797114273e9f66f65 100644 (file)
@@ -3,3 +3,6 @@ codec_ms => 20
 wink_ms => 150
 flash_ms => 750
 echo_cancel_level => 64
+rxgain => 0.0
+txgain => 0.0
+
index e5218ca4b81ff2712bef9732de94d833f6f5a137..13e8c2a7a32ccdd4414fc21bd77e59b84b1eb147 100644 (file)
@@ -275,6 +275,10 @@ typedef enum {
        ZAP_COMMAND_DISABLE_ECHOTRAIN,
        ZAP_COMMAND_SET_CAS_BITS,
        ZAP_COMMAND_GET_CAS_BITS,
+       ZAP_COMMAND_SET_RX_GAIN,
+       ZAP_COMMAND_GET_RX_GAIN,
+       ZAP_COMMAND_SET_TX_GAIN,
+       ZAP_COMMAND_GET_TX_GAIN,
        ZAP_COMMAND_COUNT
 } zap_command_t;
 
index c3f80e0f6e2809a389f99d6c6e684c69c3b3a5e7..6ffedc29b65ce33ddc25b6f653fe413008db66e1 100644 (file)
@@ -42,6 +42,8 @@ static struct {
        uint32_t flash_ms;
        uint32_t eclevel;
        uint32_t etlevel;
+    float rxgain;
+    float txgain;
 } zt_globals;
 
 struct ioctl_codes {
@@ -165,6 +167,57 @@ static zap_socket_t CONTROL_FD = ZT_INVALID_SOCKET;
 ZIO_SPAN_NEXT_EVENT_FUNCTION(zt_next_event);
 ZIO_SPAN_POLL_EVENT_FUNCTION(zt_poll_event);
 
+static void zt_build_gains(struct zt_gains *g, float rxgain, float txgain, int codec)
+{
+       int j;
+       int k;
+       float linear_rxgain = pow(10.0, rxgain / 20.0);
+    float linear_txgain = pow(10.0, txgain / 20.0);
+
+       switch (codec) {
+       case ZAP_CODEC_ALAW:
+               for (j = 0; j < (sizeof(g->receive_gain) / sizeof(g->receive_gain[0])); j++) {
+                       if (rxgain) {
+                               k = (int) (((float) alaw_to_linear(j)) * linear_rxgain);
+                               if (k > 32767) k = 32767;
+                               if (k < -32767) k = -32767;
+                               g->receive_gain[j] = linear_to_alaw(k);
+                       } else {
+                               g->receive_gain[j] = j;
+                       }
+                       if (txgain) {
+                               k = (int) (((float) alaw_to_linear(j)) * linear_txgain);
+                               if (k > 32767) k = 32767;
+                               if (k < -32767) k = -32767;
+                               g->transmit_gain[j] = linear_to_alaw(k);
+                       } else {
+                               g->transmit_gain[j] = j;
+                       }
+               }
+               break;
+       case ZAP_CODEC_ULAW:
+               for (j = 0; j < (sizeof(g->receive_gain) / sizeof(g->receive_gain[0])); j++) {
+                       if (rxgain) {
+                               k = (int) (((float) ulaw_to_linear(j)) * linear_rxgain);
+                               if (k > 32767) k = 32767;
+                               if (k < -32767) k = -32767;
+                               g->receive_gain[j] = linear_to_ulaw(k);
+                       } else {
+                               g->receive_gain[j] = j;
+                       }
+                       if (txgain) {
+                               k = (int) (((float) ulaw_to_linear(j)) * linear_txgain);
+                               if (k > 32767) k = 32767;
+                               if (k < -32767) k = -32767;
+                               g->transmit_gain[j] = linear_to_ulaw(k);
+                       } else {
+                               g->transmit_gain[j] = j;
+                       }
+               }
+               break;
+       }
+}
+
 static unsigned zt_open_range(zap_span_t *span, unsigned start, unsigned end, zap_chan_type_t type, char *name, char *number, unsigned char cas_bits)
 {
        unsigned configured = 0, x;
@@ -319,8 +372,26 @@ static unsigned zt_open_range(zap_span_t *span, unsigned start, unsigned end, za
                                        zchan->native_codec = zchan->effective_codec = type;
 
                                }
+                if(zt_globals.rxgain || zt_globals.txgain) {
+                    struct zt_gains gains;
+                    memset(&gains, 0, sizeof(gains));
+
+                    gains.chan_no = ztp.chan_no;
+                    zt_build_gains(&gains, zt_globals.rxgain, zt_globals.txgain, zchan->native_codec);
+
+                    if(zt_globals.rxgain)
+                        zap_log(ZAP_LOG_INFO, "Setting rxgain to %f on channel %d\n", zt_globals.rxgain, gains.chan_no);
+
+                    if(zt_globals.txgain)
+                        zap_log(ZAP_LOG_INFO, "Setting txgain to %f on channel %d\n", zt_globals.txgain, gains.chan_no);
+
+                               if (ioctl(sockfd, codes.SETGAINS, &gains) < 0) {
+                                       zap_log(ZAP_LOG_ERROR, "failure configuring device %s as OpenZAP device %d:%d fd:%d\n", chanpath, zchan->span_id, zchan->chan_id, sockfd);
+                                       close(sockfd);
+                                       continue;
+                               }
+                }
                        }
-                       
 
                        ztp.wink_time = zt_globals.wink_ms;
                        ztp.flash_time = zt_globals.flash_ms;
@@ -330,7 +401,6 @@ static unsigned zt_open_range(zap_span_t *span, unsigned start, unsigned end, za
                                close(sockfd);
                                continue;
                        }
-               
 
                        if (!zap_strlen_zero(name)) {
                                zap_copy_string(zchan->chan_name, name, sizeof(zchan->chan_name));
@@ -414,6 +484,7 @@ static ZIO_CONFIGURE_FUNCTION(zt_configure)
 {
 
        int num;
+    float fnum;
 
        if (!strcasecmp(category, "defaults")) {
                if (!strcasecmp(var, "codec_ms")) {
@@ -445,6 +516,24 @@ static ZIO_CONFIGURE_FUNCTION(zt_configure)
                 zt_globals.eclevel = num;
             }
                        
+               } else if (!strcasecmp(var, "rxgain")) {
+                       fnum = (float)atof(val);
+                       if (fnum < -100.0 || fnum > 100.0) {
+                zap_log(ZAP_LOG_WARNING, "invalid rxgain val at line %d\n", lineno);
+            } else {
+                zt_globals.rxgain = fnum;
+                zap_log(ZAP_LOG_INFO, "Setting rxgain val to %f\n", fnum);
+            }
+                       
+               } else if (!strcasecmp(var, "txgain")) {
+                       fnum = (float)atof(val);
+                       if (fnum < -100.0 || fnum > 100.0) {
+                zap_log(ZAP_LOG_WARNING, "invalid txgain val at line %d\n", lineno);
+            } else {
+                zt_globals.txgain = fnum;
+                zap_log(ZAP_LOG_INFO, "Setting txgain val to %f\n", fnum);
+            }
+                       
                }
        }