Index: channels/chan_dahdi.c =================================================================== --- channels/chan_dahdi.c (revision 291724) +++ channels/chan_dahdi.c (working copy) @@ -2724,6 +2724,20 @@ return 0; } +static void enable_dtmf_detect(struct dahdi_pvt *p); +static void disable_dtmf_detect(struct dahdi_pvt *p); + +static int my_set_dtmf_detect(void *pvt, int enable) +{ + struct dahdi_pvt *p = pvt; + + if (enable) + enable_dtmf_detect(p); + else + disable_dtmf_detect(p); + return 0; +} + static int dahdi_ring_phone(struct dahdi_pvt *p); static int my_ring(void *pvt) @@ -3467,6 +3481,7 @@ .wait_event = my_wait_event, .is_off_hook = my_is_off_hook, .set_echocanceller = my_set_echocanceller, + .set_dtmf_detect = my_set_dtmf_detect, .ring = my_ring, .flash = my_flash, .off_hook = my_off_hook, Index: channels/sig_analog.c =================================================================== --- channels/sig_analog.c (revision 291724) +++ channels/sig_analog.c (working copy) @@ -437,6 +437,14 @@ return -1; } +static int analog_set_dtmf_detect(struct analog_pvt *p, int enable) +{ + if (p->calls->set_dtmf_detect) { + return p->calls->set_dtmf_detect(p->chan_pvt, enable); + } + return -1; +} + static int analog_train_echocanceller(struct analog_pvt *p) { if (p->calls->train_echocanceller) { @@ -847,6 +855,8 @@ p->callwaitcas = 0; } + analog_set_dtmf_detect(p, 1); + if (p->calls->stop_callwait) { return p->calls->stop_callwait(p->chan_pvt); } @@ -858,6 +868,9 @@ if (p->callwaitingcallerid) { p->callwaitcas = 1; } + + analog_set_dtmf_detect(p, 0); + if (p->calls->callwait) { return p->calls->callwait(p->chan_pvt); } Index: channels/sig_analog.h =================================================================== --- channels/sig_analog.h (revision 291724) +++ channels/sig_analog.h (working copy) @@ -166,6 +166,7 @@ int (* const play_tone)(void *pvt, enum analog_sub sub, enum analog_tone tone); int (* const set_echocanceller)(void *pvt, int enable); + int (* const set_dtmf_detect)(void *pvt, int enable); int (* const train_echocanceller)(void *pvt); int (* const dsp_set_digitmode)(void *pvt, enum analog_dsp_digitmode mode); int (* const dsp_reset_and_flush_digits)(void *pvt);