Yo Thilo,

On Tue, Jul 22, 2003 at 16:51:04 +0200, Thilo Salmon wrote:

> Hi,
> 
> is there a way to enable dtmf detection on zap channels? I am trying to
> pickup, play a ringtone and the dial out. I.e.
>  
> exten => s,1,Wait,1                     
> exten => s,1,Answer                     
> exten => s,2,Playtones(dial)
> exten => s,3,DigitTimeout,5             
> exten => s,4,ResponseTimeout,10
> exten => _X,1,StopPlaytones
> exten => _X,2,Dial,Zap/g8/BYEXTENSION|10
> 
> I don't quite recall what I did last, but I remember this used to work.
> My current installation of asterisk does not detect dtmf tones as I can
> easily verify with debugging turned on. Just to be sure I also dialed in
> from different phones, did a fresh checkout of zaptel, libpri and
> asterisk and wrote my configuration from scratch. None of that made
> asterisk detect dtmf, though.
> 
> Can anybody suggest what to try next?

I encountered the same problem, and first solved it by using
"BackGround" to play a recording of a dial-tone, as "Playtones"
doesn't do anything with any digits dialled while a tone is beeing played.

A while ago, I made some modifications to "Playtones" to allow it to be
interrupted by dialling a digit and behave very much like "BackGround"
in that respect.  The patch to add this new app, called "PlayDialtone", is
attached.



    Grtz,

       Oliver
Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.31
diff -u -r1.31 pbx.c
--- pbx.c       1 Jul 2003 20:29:53 -0000       1.31
+++ pbx.c       3 Jul 2003 11:48:33 -0000
@@ -1747,6 +1747,8 @@
                                /* As long as we're willing to wait, and as long as 
it's not defined, 
                                   keep reading digits until we can't possibly get a 
right answer anymore.  */
                                digit = ast_waitfordigit(c, waittime * 1000);
+                               if (c->writeinterrupt)
+                                       ast_deactivate_generator(c);
                                if (c->_softhangup == AST_SOFTHANGUP_ASYNCGOTO) {
                                        c->_softhangup = 0;
                                } else {
Index: res/res_indications.c
===================================================================
RCS file: /usr/cvsroot/asterisk/res/res_indications.c,v
retrieving revision 1.2
diff -u -r1.2 res_indications.c
--- res/res_indications.c       27 Apr 2003 21:34:27 -0000      1.2
+++ res/res_indications.c       3 Jul 2003 11:48:34 -0000
@@ -201,6 +201,28 @@
 }
 
 /*
+ * PlayDialtone command stuff
+ */
+static int handle_playdialtone(struct ast_channel *chan, void *data)
+{
+       struct tone_zone_sound *ts;
+       int res;
+ 
+       if (!data || !((char*)data)[0]) {
+               ast_log(LOG_NOTICE,"Nothing to play\n");
+               return -1;
+       }
+       ts = ast_get_indication_tone(chan->zone, (const char*)data);
+       if (ts && ts->data[0])
+               res = ast_playtones_start(chan, 0, ts->data, 1);
+       else
+               res = ast_playtones_start(chan, 0, (const char*)data, 1);
+       if (res)
+               ast_log(LOG_NOTICE,"Unable to start playdialtone\n");
+       return res;
+}
+
+/*
  * StopPlaylist command stuff
  */
 static int handle_stopplaytones(struct ast_channel *chan, void *data)
@@ -377,6 +399,7 @@
        ast_cli_register(&remove_indication_cli);
        ast_cli_register(&show_indications_cli);
        ast_register_application("Playtones", handle_playtones, "Play a tone 
list","Play a tone list, either registered (through indications.conf) or a direct list 
of tones and durations.");
+       ast_register_application("PlayDialtone", handle_playdialtone, "Play an 
interruptable tone list","Play a tone list, either registered (through 
indications.conf) or a direct list of tones and durations.  Interrupt the tones after 
a digit is dialed.");
        ast_register_application("StopPlaytones", handle_stopplaytones, "Stop playing 
a tone list","Stop playing a tone list");
 
        return 0;

Reply via email to