summaryrefslogtreecommitdiff
path: root/channels/chan_misdn.c
diff options
context:
space:
mode:
authorNadi Sarrar <ns@beronet.com>2007-03-26 15:59:56 +0000
committerNadi Sarrar <ns@beronet.com>2007-03-26 15:59:56 +0000
commit24d8595d00de93b2e82a135104c81b3043911c53 (patch)
tree1d1ae595b418f54aaaaa9c14ec18809f3b6e1371 /channels/chan_misdn.c
parent133f26f9775e7489e8d2e25c1c8f433dbc6864f4 (diff)
Merged revisions 59202 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r59202 | nadi | 2007-03-26 17:25:53 +0200 (Mo, 26 Mär 2007) | 4 lines * mISDN >= 1.2 provides a dsp pipeline for i.e. echo cancellation modules, make chan_misdn use it. * add a check for linux/mISDNdsp.h to configure.ac and update the autogenerated files: 'configure', 'autoconfig.h.in' (the 'configure' script was not in sync with the latest configure.ac, so the diff is a bit bigger than expected). ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@59203 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_misdn.c')
-rw-r--r--channels/chan_misdn.c94
1 files changed, 75 insertions, 19 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index e486c58ad..fa13d0383 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -351,7 +351,11 @@ int add_out_calls(int port);
int add_in_calls(int port);
+#ifdef MISDN_1_2
+static int update_pipeline_config(struct misdn_bchannel *bc);
+#else
static int update_ec_config(struct misdn_bchannel *bc);
+#endif
@@ -1019,7 +1023,11 @@ static void print_bc_info (int fd, struct chan_list* help, struct misdn_bchannel
" --> activated: %d\n"
" --> state: %s\n"
" --> capability: %s\n"
+#ifdef MISDN_1_2
+ " --> pipeline: %s\n"
+#else
" --> echo_cancel: %d\n"
+#endif
" --> notone : rx %d tx:%d\n"
" --> bc_hold: %d\n",
help->ast->name,
@@ -1032,7 +1040,11 @@ static void print_bc_info (int fd, struct chan_list* help, struct misdn_bchannel
bc->active,
bc_state2str(bc->bc_state),
bearer2str(bc->capability),
- bc->ec_enable,
+#ifdef MISDN_1_2
+ bc->pipeline,
+#else
+ bc->ec_enable,
+#endif
help->norxtone,help->notxtone,
bc->holded
@@ -1260,7 +1272,11 @@ static int misdn_toggle_echocancel (int fd, int argc, char *argv[])
tmp->toggle_ec=tmp->toggle_ec?0:1;
if (tmp->toggle_ec) {
+#ifdef MISDN_1_2
+ update_pipeline_config(tmp->bc);
+#else
update_ec_config(tmp->bc);
+#endif
manager_ec_enable(tmp->bc);
} else {
manager_ec_disable(tmp->bc);
@@ -1598,6 +1614,25 @@ void debug_numplan(int port, int numplan, char *type)
+#ifdef MISDN_1_2
+static int update_pipeline_config(struct misdn_bchannel *bc)
+{
+ int ec;
+
+ misdn_cfg_get(bc->port, MISDN_CFG_PIPELINE, bc->pipeline, sizeof(bc->pipeline));
+
+ if (*bc->pipeline)
+ return 0;
+
+ misdn_cfg_get(bc->port, MISDN_CFG_ECHOCANCEL, &ec, sizeof(int));
+ if (ec == 1)
+ snprintf(bc->pipeline, sizeof(bc->pipeline) - 1, "mg2ec");
+ else if (ec > 1)
+ snprintf(bc->pipeline, sizeof(bc->pipeline) - 1, "mg2ec(deftaps=%d)", ec);
+
+ return 0;
+}
+#else
static int update_ec_config(struct misdn_bchannel *bc)
{
int ec;
@@ -1611,17 +1646,10 @@ static int update_ec_config(struct misdn_bchannel *bc)
bc->ec_enable=1;
bc->ec_deftaps=ec;
}
-#ifdef WITH_ECHOTRAINING
- int ectr;
- misdn_cfg_get( port, MISDN_CFG_ECHOTRAINING, &ectr, sizeof(int));
-
- if ( ectr >= 0 ) {
- bc->ec_training=ectr;
- }
-#endif
return 0;
}
+#endif
static int read_config(struct chan_list *ch, int orig) {
@@ -1696,7 +1724,11 @@ static int read_config(struct chan_list *ch, int orig) {
ast_copy_string (ast->context,ch->context,sizeof(ast->context));
+#ifdef MISDN_1_2
+ update_pipeline_config(bc);
+#else
update_ec_config(bc);
+#endif
{
int eb3;
@@ -1966,9 +1998,15 @@ static int misdn_call(struct ast_channel *ast, char *dest, int timeout)
int bridging;
misdn_cfg_get( 0, MISDN_GEN_BRIDGING, &bridging, sizeof(int));
if (bridging && ch->other_ch) {
- chan_misdn_log(0, port, "Disabling EC on both Sides\n");
+#ifdef MISDN_1_2
+ chan_misdn_log(0, port, "Disabling EC (aka Pipeline) on both Sides\n");
+ *ch->bc->pipeline=0;
+ *ch->other_ch->bc->pipeline=0;
+#else
+ chan_misdn_log(0, port, "Disabling EC on both Sides\n");
ch->bc->ec_enable=0;
ch->other_ch->bc->ec_enable=0;
+#endif
}
r=misdn_lib_send_event( newbc, EVENT_SETUP );
@@ -2466,7 +2504,11 @@ static struct ast_frame *process_ast_dsp(struct chan_list *tmp, struct ast_frame
isdn_lib_update_rxgain(tmp->bc);
tmp->bc->txgain = 0;
isdn_lib_update_txgain(tmp->bc);
+#ifdef MISDN_1_2
+ *tmp->bc->pipeline = 0;
+#else
tmp->bc->ec_enable = 0;
+#endif
isdn_lib_update_ec(tmp->bc);
isdn_lib_stop_dtmf(tmp->bc);
switch (tmp->faxdetect) {
@@ -4922,16 +4964,22 @@ static int misdn_set_opt_exec(struct ast_channel *chan, void *data)
case 'c':
keyidx=atoi(++tok);
- if (keyidx > misdn_key_vector_size || keyidx < 0 ) {
- ast_log(LOG_WARNING, "You entered the keyidx: %d but we have only %d keys\n",keyidx, misdn_key_vector_size );
- continue;
+ char keys[4096];
+ char *key=NULL, *tmp;
+ int i;
+ misdn_cfg_get( 0, MISDN_GEN_CRYPT_KEYS, keys, sizeof(keys));
+
+ tmp=keys;
+
+ for (i=0; i<keyidx; i++) {
+ key=strsep(&tmp,",");
}
-
- {
- ast_copy_string(ch->bc->crypt_key, misdn_key_vector[keyidx], sizeof(ch->bc->crypt_key));
+
+ if (key) {
+ ast_copy_string(ch->bc->crypt_key, key, sizeof(ch->bc->crypt_key));
}
-
- chan_misdn_log(0, ch->bc->port, "SETOPT: crypt with key:%s\n",misdn_key_vector[keyidx]);
+
+ chan_misdn_log(0, ch->bc->port, "SETOPT: crypt with key:%s\n",ch->bc->crypt_key);
break;
case 'e':
@@ -4939,14 +4987,22 @@ static int misdn_set_opt_exec(struct ast_channel *chan, void *data)
if (neglect) {
chan_misdn_log(1, ch->bc->port, " --> disabled\n");
+#ifdef MISDN_1_2
+ *ch->bc->pipeline=0;
+#else
ch->bc->ec_enable=0;
+#endif
} else {
+#ifdef MISDN_1_2
+ update_pipeline_config(ch->bc);
+#else
ch->bc->ec_enable=1;
ch->bc->orig=ch->orginator;
tok++;
- if (tok) {
+ if (*tok) {
ch->bc->ec_deftaps=atoi(tok);
}
+#endif
}
break;