|
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