|
261 | 261 | completely disabled)</para> |
262 | 262 | <para> <literal>voice</literal> Voice mode (returns from FAX mode, reverting the changes that were made)</para> |
263 | 263 | </enum> |
| 264 | + <enum name="dialmode"> |
| 265 | + <para>R/W Pulse and tone dialing mode of the channel.</para> |
| 266 | + <para>If set, overrides the setting in <literal>chan_dahdi.conf</literal> for that channel.</para> |
| 267 | + <enumlist> |
| 268 | + <enum name="both" /> |
| 269 | + <enum name="pulse" /> |
| 270 | + <enum name="dtmf" /> |
| 271 | + <enum name="tone" /> |
| 272 | + <enum name="none" /> |
| 273 | + </enumlist> |
| 274 | + </enum> |
264 | 275 | </enumlist> |
265 | 276 | </info> |
266 | 277 | <info name="Dial_Resource" language="en_US" tech="DAHDI"> |
@@ -1034,6 +1045,7 @@ static struct dahdi_chan_conf dahdi_chan_conf_default(void) |
1034 | 1045 | .mohsuggest = "", |
1035 | 1046 | .parkinglot = "", |
1036 | 1047 | .transfertobusy = 1, |
| 1048 | + .dialmode = 0, |
1037 | 1049 |
|
1038 | 1050 | .ani_info_digits = 2, |
1039 | 1051 | .ani_wink_time = 1000, |
@@ -7009,6 +7021,32 @@ static int dahdi_func_read(struct ast_channel *chan, const char *function, char |
7009 | 7021 | } |
7010 | 7022 | ast_mutex_unlock(&p->lock); |
7011 | 7023 | #endif /* defined(HAVE_PRI) */ |
| 7024 | + } else if (!strcasecmp(data, "dialmode")) { |
| 7025 | + struct analog_pvt *analog_p; |
| 7026 | + ast_mutex_lock(&p->lock); |
| 7027 | + analog_p = p->sig_pvt; |
| 7028 | + /* Hardcode p->radio and p->oprmode as 0 since we're using this to check for analogness, not the handler */ |
| 7029 | + if (dahdi_analog_lib_handles(p->sig, 0, 0) && analog_p) { |
| 7030 | + switch (analog_p->dialmode) { |
| 7031 | + case ANALOG_DIALMODE_BOTH: |
| 7032 | + ast_copy_string(buf, "both", len); |
| 7033 | + break; |
| 7034 | + case ANALOG_DIALMODE_PULSE: |
| 7035 | + ast_copy_string(buf, "pulse", len); |
| 7036 | + break; |
| 7037 | + case ANALOG_DIALMODE_DTMF: |
| 7038 | + ast_copy_string(buf, "dtmf", len); |
| 7039 | + break; |
| 7040 | + case ANALOG_DIALMODE_NONE: |
| 7041 | + ast_copy_string(buf, "none", len); |
| 7042 | + break; |
| 7043 | + } |
| 7044 | + } else { |
| 7045 | + ast_log(LOG_WARNING, "%s only supported on analog channels\n", data); |
| 7046 | + *buf = '\0'; |
| 7047 | + res = -1; |
| 7048 | + } |
| 7049 | + ast_mutex_unlock(&p->lock); |
7012 | 7050 | } else { |
7013 | 7051 | *buf = '\0'; |
7014 | 7052 | res = -1; |
@@ -7114,6 +7152,30 @@ static int dahdi_func_write(struct ast_channel *chan, const char *function, char |
7114 | 7152 | ast_log(LOG_WARNING, "Unsupported value '%s' provided for '%s' item.\n", value, data); |
7115 | 7153 | res = -1; |
7116 | 7154 | } |
| 7155 | + } else if (!strcasecmp(data, "dialmode")) { |
| 7156 | + struct analog_pvt *analog_p; |
| 7157 | + |
| 7158 | + ast_mutex_lock(&p->lock); |
| 7159 | + analog_p = p->sig_pvt; |
| 7160 | + if (!dahdi_analog_lib_handles(p->sig, 0, 0) || !analog_p) { |
| 7161 | + ast_log(LOG_WARNING, "%s only supported on analog channels\n", data); |
| 7162 | + ast_mutex_unlock(&p->lock); |
| 7163 | + return -1; |
| 7164 | + } |
| 7165 | + /* analog pvt is used for pulse dialing, so update both */ |
| 7166 | + if (!strcasecmp(value, "pulse")) { |
| 7167 | + p->dialmode = analog_p->dialmode = ANALOG_DIALMODE_PULSE; |
| 7168 | + } else if (!strcasecmp(value, "dtmf") || !strcasecmp(value, "tone")) { |
| 7169 | + p->dialmode = analog_p->dialmode = ANALOG_DIALMODE_DTMF; |
| 7170 | + } else if (!strcasecmp(value, "none")) { |
| 7171 | + p->dialmode = analog_p->dialmode = ANALOG_DIALMODE_NONE; |
| 7172 | + } else if (!strcasecmp(value, "both")) { |
| 7173 | + p->dialmode = analog_p->dialmode = ANALOG_DIALMODE_BOTH; |
| 7174 | + } else { |
| 7175 | + ast_log(LOG_WARNING, "'%s' is an invalid setting for %s\n", value, data); |
| 7176 | + res = -1; |
| 7177 | + } |
| 7178 | + ast_mutex_unlock(&p->lock); |
7117 | 7179 | } else { |
7118 | 7180 | res = -1; |
7119 | 7181 | } |
@@ -8997,6 +9059,13 @@ static struct ast_frame *dahdi_read(struct ast_channel *ast) |
8997 | 9059 | } else { |
8998 | 9060 | dahdi_handle_dtmf(ast, idx, &f); |
8999 | 9061 | } |
| 9062 | + if (!(p->dialmode == ANALOG_DIALMODE_BOTH || p->dialmode == ANALOG_DIALMODE_DTMF)) { |
| 9063 | + if (f->frametype == AST_FRAME_DTMF_END) { /* only show this message when the key is let go of */ |
| 9064 | + ast_debug(1, "Dropping DTMF digit '%c' because tone dialing is disabled\n", f->subclass.integer); |
| 9065 | + } |
| 9066 | + f->frametype = AST_FRAME_NULL; |
| 9067 | + f->subclass.integer = 0; |
| 9068 | + } |
9000 | 9069 | break; |
9001 | 9070 | case AST_FRAME_VOICE: |
9002 | 9071 | if (p->cidspill || p->cid_suppress_expire) { |
@@ -12780,6 +12849,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, |
12780 | 12849 | #endif |
12781 | 12850 | tmp->immediate = conf->chan.immediate; |
12782 | 12851 | tmp->transfertobusy = conf->chan.transfertobusy; |
| 12852 | + tmp->dialmode = conf->chan.dialmode; |
12783 | 12853 | if (chan_sig & __DAHDI_SIG_FXS) { |
12784 | 12854 | tmp->mwimonitor_fsk = conf->chan.mwimonitor_fsk; |
12785 | 12855 | tmp->mwimonitor_neon = conf->chan.mwimonitor_neon; |
@@ -13113,6 +13183,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, |
13113 | 13183 | analog_p->threewaycalling = conf->chan.threewaycalling; |
13114 | 13184 | analog_p->transfer = conf->chan.transfer; |
13115 | 13185 | analog_p->transfertobusy = conf->chan.transfertobusy; |
| 13186 | + analog_p->dialmode = conf->chan.dialmode; |
13116 | 13187 | analog_p->use_callerid = tmp->use_callerid; |
13117 | 13188 | analog_p->usedistinctiveringdetection = tmp->usedistinctiveringdetection; |
13118 | 13189 | analog_p->use_smdi = tmp->use_smdi; |
@@ -18314,6 +18385,16 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct |
18314 | 18385 | confp->chan.immediate = ast_true(v->value); |
18315 | 18386 | } else if (!strcasecmp(v->name, "transfertobusy")) { |
18316 | 18387 | confp->chan.transfertobusy = ast_true(v->value); |
| 18388 | + } else if (!strcasecmp(v->name, "dialmode")) { |
| 18389 | + if (!strcasecmp(v->value, "pulse")) { |
| 18390 | + confp->chan.dialmode = ANALOG_DIALMODE_PULSE; |
| 18391 | + } else if (!strcasecmp(v->value, "dtmf") || !strcasecmp(v->value, "tone")) { |
| 18392 | + confp->chan.dialmode = ANALOG_DIALMODE_DTMF; |
| 18393 | + } else if (!strcasecmp(v->value, "none")) { |
| 18394 | + confp->chan.dialmode = ANALOG_DIALMODE_NONE; |
| 18395 | + } else { |
| 18396 | + confp->chan.dialmode = ANALOG_DIALMODE_BOTH; |
| 18397 | + } |
18317 | 18398 | } else if (!strcasecmp(v->name, "mwimonitor")) { |
18318 | 18399 | confp->chan.mwimonitor_neon = 0; |
18319 | 18400 | confp->chan.mwimonitor_fsk = 0; |
|
0 commit comments