/ adjusted how the gain settings are implemeted

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5039 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Ben Kramer
2005-02-17 04:58:03 +00:00
parent f12c0bb3aa
commit 367da10e08

View File

@@ -63,6 +63,7 @@ extern "C" {
#define VPB_WAIT_TIMEOUT 4000 #define VPB_WAIT_TIMEOUT 4000
#define MAX_VPB_GAIN 12.0 #define MAX_VPB_GAIN 12.0
#define MIN_VPB_GAIN -12.0
#define DTMF_CALLERID #define DTMF_CALLERID
#define DTMF_CID_START 'D' #define DTMF_CID_START 'D'
@@ -194,6 +195,10 @@ VPB_TONE_MAP DialToneMap[] = { { VPB_BUSY_AUST, VPB_CALL_DISCONNECT, 0 },
#define VPB_STATE_PLAYBUSY 6 #define VPB_STATE_PLAYBUSY 6
#define VPB_STATE_PLAYRING 7 #define VPB_STATE_PLAYRING 7
#define VPB_GOT_RXHWG 1
#define VPB_GOT_TXHWG 2
#define VPB_GOT_RXSWG 4
#define VPB_GOT_TXSWG 8
typedef struct { typedef struct {
int inuse; int inuse;
@@ -1331,7 +1336,7 @@ static void mkbrd(vpb_model_t model, int echo_cancel)
} }
} }
static struct vpb_pvt *mkif(int board, int channel, int mode, float txgain, float rxgain, static struct vpb_pvt *mkif(int board, int channel, int mode, int gains, float txgain, float rxgain,
float txswgain, float rxswgain, int bal1, int bal2, int bal3, float txswgain, float rxswgain, int bal1, int bal2, int bal3,
char * callerid, int echo_cancel, int group ) char * callerid, int echo_cancel, int group )
{ {
@@ -1393,17 +1398,46 @@ static struct vpb_pvt *mkif(int board, int channel, int mode, float txgain, floa
if(bal1>=0) vpb_set_codec_reg(tmp->handle, 0x32, bal1); if(bal1>=0) vpb_set_codec_reg(tmp->handle, 0x32, bal1);
if(bal2>=0) vpb_set_codec_reg(tmp->handle, 0x3a, bal2); if(bal2>=0) vpb_set_codec_reg(tmp->handle, 0x3a, bal2);
tmp->txgain = txgain; if (gains & VPB_GOT_TXHWG){
vpb_play_set_hw_gain(tmp->handle, (txgain > MAX_VPB_GAIN) ? MAX_VPB_GAIN : txgain); if (txgain > MAX_VPB_GAIN){
tmp->txgain = MAX_VPB_GAIN;
}
else if (txgain < MIN_VPB_GAIN){
tmp->txgain = MIN_VPB_GAIN;
}
else {
tmp->txgain = txgain;
}
ast_log(LOG_NOTICE,"VPB setting Tx Hw gain to [%f]\n",tmp->txgain);
vpb_play_set_hw_gain(tmp->handle, tmp->txgain);
}
tmp->rxgain = rxgain; if (gains & VPB_GOT_RXHWG){
vpb_record_set_hw_gain(tmp->handle, (rxgain > MAX_VPB_GAIN) ? MAX_VPB_GAIN : rxgain); if (rxgain > MAX_VPB_GAIN){
tmp->rxgain = MAX_VPB_GAIN;
}
else if (rxgain < MIN_VPB_GAIN){
tmp->rxgain = MIN_VPB_GAIN;
}
else {
tmp->rxgain = rxgain;
}
ast_log(LOG_NOTICE,"VPB setting Rx Hw gain to [%f]\n",tmp->rxgain);
vpb_record_set_hw_gain(tmp->handle,tmp->rxgain);
}
tmp->txswgain = txswgain; if (gains & VPB_GOT_TXSWG){
vpb_play_set_gain(tmp->handle, (txswgain > MAX_VPB_GAIN) ? MAX_VPB_GAIN : txswgain); tmp->txswgain = txswgain;
ast_log(LOG_NOTICE,"VPB setting Tx Sw gain to [%f]\n",tmp->txswgain);
vpb_play_set_gain(tmp->handle, tmp->txswgain);
}
tmp->rxswgain = rxswgain; if (gains & VPB_GOT_RXSWG){
vpb_record_set_gain(tmp->handle, (rxswgain > MAX_VPB_GAIN) ? MAX_VPB_GAIN : rxswgain); tmp->rxswgain = rxswgain;
ast_log(LOG_NOTICE,"VPB setting Rx Sw gain to [%f]\n",tmp->rxswgain);
vpb_record_set_gain(tmp->handle, tmp->rxswgain);
}
tmp->vpb_model = vpb_model_unknown; tmp->vpb_model = vpb_model_unknown;
if( vpb_get_model(buf) == VPB_OK ) { if( vpb_get_model(buf) == VPB_OK ) {
@@ -1450,9 +1484,8 @@ static struct vpb_pvt *mkif(int board, int channel, int mode, float txgain, floa
/* define grunt tone */ /* define grunt tone */
vpb_settonedet(tmp->handle,&toned_ungrunt); vpb_settonedet(tmp->handle,&toned_ungrunt);
ast_log(LOG_NOTICE,"Voicetronix %s channel %s initialized (rxgain=%f txgain=%f) (%f/%f/0x%X/0x%X/0x%X)\n", ast_log(LOG_NOTICE,"Voicetronix %s channel %s initialized (rxsg=%f/txsg=%f/rxhg=%f/txhg=%f)(0x%x/0x%x/0x%x)\n",
(tmp->vpb_model==vpb_model_v4pci)?"V4PCI": (tmp->vpb_model==vpb_model_v4pci)?"V4PCI": (tmp->vpb_model==vpb_model_v12pci)?"V12PCI":"[Unknown model]",
(tmp->vpb_model==vpb_model_v12pci)?"V12PCI":"[Unknown model]",
tmp->dev, tmp->rxswgain, tmp->txswgain, tmp->rxgain, tmp->txgain, bal1, bal2, bal3 ); tmp->dev, tmp->rxswgain, tmp->txswgain, tmp->rxgain, tmp->txgain, bal1, bal2, bal3 );
return tmp; return tmp;
@@ -2465,6 +2498,7 @@ int load_module()
int mode = MODE_IMMEDIATE; int mode = MODE_IMMEDIATE;
float txgain = DEFAULT_GAIN, rxgain = DEFAULT_GAIN; float txgain = DEFAULT_GAIN, rxgain = DEFAULT_GAIN;
float txswgain = 0, rxswgain = 0; float txswgain = 0, rxswgain = 0;
int got_gain=0;
int first_channel = 1; int first_channel = 1;
int echo_cancel = DEFAULT_ECHO_CANCEL; int echo_cancel = DEFAULT_ECHO_CANCEL;
int error = 0; /* Error flag */ int error = 0; /* Error flag */
@@ -2516,7 +2550,7 @@ int load_module()
UseNativeBridge = atoi(v->value); UseNativeBridge = atoi(v->value);
} else if (strcasecmp(v->name, "channel") == 0) { } else if (strcasecmp(v->name, "channel") == 0) {
int channel = atoi(v->value); int channel = atoi(v->value);
tmp = mkif(board, channel, mode, txgain, rxgain, txswgain, rxswgain, bal1, bal2, bal3, callerid, echo_cancel,group); tmp = mkif(board, channel, mode, got_gain, txgain, rxgain, txswgain, rxswgain, bal1, bal2, bal3, callerid, echo_cancel,group);
if (tmp) { if (tmp) {
if(first_channel) { if(first_channel) {
mkbrd( tmp->vpb_model, echo_cancel ); mkbrd( tmp->vpb_model, echo_cancel );
@@ -2549,12 +2583,16 @@ int load_module()
echo_cancel = 0; echo_cancel = 0;
} else if (strcasecmp(v->name, "txgain") == 0) { } else if (strcasecmp(v->name, "txgain") == 0) {
txswgain = parse_gain_value(v->name, v->value); txswgain = parse_gain_value(v->name, v->value);
got_gain |=VPB_GOT_TXSWG;
} else if (strcasecmp(v->name, "rxgain") == 0) { } else if (strcasecmp(v->name, "rxgain") == 0) {
rxswgain = parse_gain_value(v->name, v->value); rxswgain = parse_gain_value(v->name, v->value);
got_gain |=VPB_GOT_RXSWG;
} else if (strcasecmp(v->name, "txhwgain") == 0) { } else if (strcasecmp(v->name, "txhwgain") == 0) {
txgain = parse_gain_value(v->name, v->value); txgain = parse_gain_value(v->name, v->value);
got_gain |=VPB_GOT_TXHWG;
} else if (strcasecmp(v->name, "rxhwgain") == 0) { } else if (strcasecmp(v->name, "rxhwgain") == 0) {
rxgain = parse_gain_value(v->name, v->value); rxgain = parse_gain_value(v->name, v->value);
got_gain |=VPB_GOT_RXHWG;
} else if (strcasecmp(v->name, "bal1") == 0) { } else if (strcasecmp(v->name, "bal1") == 0) {
bal1 = strtol(v->value, NULL, 16); bal1 = strtol(v->value, NULL, 16);
if(bal1<0 || bal1>255) { if(bal1<0 || bal1>255) {