<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:courier,monaco,monospace,sans-serif;font-size:12pt">Yes I want to keep more modules in the svn tree<br>we have a few in the scripts subdir like scripts/js_modules/SpeechTools.jm for the asr stuff.<br><br><br><div>&nbsp;</div><div>Anthony Minessale II<br><br><span>FreeSWITCH <a target="_blank" href="http://www.freeswitch.org/">http://www.freeswitch.org/</a></span><br><span>ClueCon <a target="_blank" href="http://www.cluecon.com/">http://www.cluecon.com/</a></span><br><br>AIM: anthm<br>MSN:anthony_minessale@hotmail.com<br>JABBER:anthony.minessale@gmail.com<br>IRC: irc.freenode.net #freeswitch</div><div><br>FreeSWITCH Developer Conference<br>sip:888@conference.freeswitch.org<br>iax:guest@conference.freeswitch.org/888<br>googletalk:conf+888@conference.freeswitch.org<br>pstn:213-799-1400</div><div style="font-family: courier,monaco,monospace,sans-serif;
 font-size: 12pt;"><br><br><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;">----- Original Message ----<br>From: Jonas Gauffin &lt;jonas.gauffin@gmail.com&gt;<br>To: freeswitch-users@lists.freeswitch.org<br>Sent: Saturday, August 11, 2007 9:08:26 AM<br>Subject: Re: [Freeswitch-users] Javascript input<br><br><div>I've written a module for the input handling and for playing phrases<br>only when dtmf digits are not pressed (which can be overridden). I got<br>a couple of OOP javascript modules (for freeswitch) that I can<br>contribute with.<br><br>Should javascript modules be checked in too? Currently there are a lot<br>of example code in the wiki, but it doesn't feel like the right place.<br>Maybe there should be some example applications and modules in the<br>repository?<br><br>for instance, my module can do this:<br><br>digit = input.getByMenu("123", "to_conference_1;to_queue_2;to_operator_3");<br><br>That creates a
 complete menu that does this:<br>a) Only valid digits are 123<br>b) It plays "choice_invalid" if an invalid choice was pressed (max three times)<br>c) plays "choice_timeout" if the user do not enter anything<br>d) playes "choice_too_many_tries" if three attempts was made.<br>e) It plays all of the soundfiles that was separated with semicolon<br>f) Soundfiles that end with "_X" are handled in a special way. _X will<br>be substituted with "pressX" soundfile. i.e the following soundfiles<br>will be played: "to_conference", "press1", to_queue", "press2",<br>"to_operator", "press3". That's perfect if you got a database driven<br>menu where u want to reuse your normal sound files.<br><br>I've also made the module aware of language choice. (You can switch<br>language any time in the IVR apps).<br><br>Thanks for the answer about streamFile. I guess that a standardized<br>javascript module will do instead.<br><br>On 8/11/07, Anthony Minessale
 &lt;anthmct@yahoo.com&gt; wrote:<br>&gt;<br>&gt; The notion of the callback goes all the way down to the core.&nbsp;&nbsp;The C portion<br>&gt; of the code is where the digit is dequeued so there is no way to avoid it.<br>&gt;<br>&gt; So, When you call streamFile you can not only pass a function to callback,<br>&gt; you can also pass an arbitrary object.&nbsp;&nbsp;That way you can get that object as<br>&gt; "arg" in your example callback and push the digits onto a shared string<br>&gt; there.<br>&gt;<br>&gt;<br>&gt; The intention is to make a pure js class for this kind of thing that we can<br>&gt; put in tree and people can use it to make their scripts.<br>&gt;<br>&gt;<br>&gt;<br>&gt; function mycb (type, data, arg) {<br>&gt;<br>&gt;&nbsp;&nbsp;if (type == "dtmf") {<br>&gt;&nbsp;&nbsp;arg.digits += data;<br>&gt;&nbsp;&nbsp;return false;<br>&gt;&nbsp;&nbsp;}<br>&gt; }<br>&gt;<br>&gt; var dtmf = new Object();<br>&gt; dtmf.digits = "";<br>&gt;
 session.streamFile("blah.wav", mycb, dtmf);<br>&gt; //say you need 3 digits so subtract how many you have so far.<br>&gt; dtmf.digits += getDigits(3 - dtmf.digits.length, "#", 5000);<br>&gt;<br>&gt; This is a crude example but you can see how you could write this into a<br>&gt; permanently&nbsp;&nbsp;used module everyone could use.&nbsp;&nbsp;The idea is to make the js the<br>&gt; place where you can continue to code functionality without touching the<br>&gt; core.&nbsp;&nbsp;That is the reason the default api is the lowest level possible<br>&gt; without going too far.<br>&gt;<br>&gt; This pure js module has yet to be written but we probably should get started<br>&gt; on it soon before we make everyone duplicate this kind of thing....<br>&gt;<br>&gt;<br>&gt; Anthony Minessale II<br>&gt;<br>&gt; FreeSWITCH <a target="_blank" href="http://www.freeswitch.org/">http://www.freeswitch.org/</a><br>&gt; ClueCon <a target="_blank"
 href="http://www.cluecon.com/">http://www.cluecon.com/</a><br>&gt;<br>&gt; AIM: anthm<br>&gt; MSN:anthony_minessale@hotmail.com<br>&gt; JABBER:anthony.minessale@gmail.com<br>&gt; IRC: irc.freenode.net #freeswitch<br>&gt;<br>&gt; FreeSWITCH Developer Conference<br>&gt; sip:888@conference.freeswitch.org<br>&gt; iax:guest@conference.freeswitch.org/888<br>&gt; googletalk:conf+888@conference.freeswitch.org<br>&gt; pstn:213-799-1400<br>&gt;<br>&gt;<br>&gt; ----- Original Message ----<br>&gt; From: Jonas Gauffin &lt;jonas.gauffin@gmail.com&gt;<br>&gt; To: freeswitch-users@lists.freeswitch.org<br>&gt; Sent: Saturday, August 11, 2007 3:37:26 AM<br>&gt; Subject: Re: [Freeswitch-users] Javascript input<br>&gt;<br>&gt; Ok. Let's take an example:<br>&gt;<br>&gt; I got a voicemail application that plays a lot of phrases. Let's check<br>&gt; a simple example:<br>&gt;<br>&gt; session.streamFile("you_have.wav");<br>&gt; session.streamFile("2.wav");<br>&gt;
 session.streamFile("new_messages.wav");<br>&gt; choice = session.getDigit(1, "", 5000);<br>&gt;<br>&gt; Ok. I want to skip to the second voicemail by pressing 2. That's not<br>&gt; possible with the code above. Instead you have to do something like<br>&gt; this:<br>&gt;<br>&gt; var _digits = "";<br>&gt; function on_dtmf(type, digits, arg)<br>&gt; {<br>&gt;&nbsp;&nbsp; _digits += digits;<br>&gt;&nbsp;&nbsp; return false;<br>&gt; }<br>&gt;<br>&gt; function say(phrase)<br>&gt; {<br>&gt;&nbsp;&nbsp; if (_digits != "")<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&gt;&nbsp;&nbsp; session.streamFile(phrase, on_dtmf);<br>&gt; }<br>&gt;<br>&gt; function getDigits(length, terminators, timeout)<br>&gt; {<br>&gt;&nbsp;&nbsp; if (_digits != '')<br>&gt;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; var tempVar = _digits;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; _digits = "";<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return tempVar;<br>&gt;&nbsp;&nbsp; }<br>&gt;&nbsp;&nbsp; return
 session.getDigits(length, terminators, timeout);<br>&gt; }<br>&gt;<br>&gt; say("you_have.wav");<br>&gt; say("2.wav");<br>&gt; say("new_messages");<br>&gt; choice = getDigits(1, "", 5000);<br>&gt;<br>&gt; Right? That will abort speach on input and return the pressed digit.<br>&gt; But what if we want to enter a pincode or something like that? Then we<br>&gt; need to handle both _digits AND use session.getDigits:<br>&gt;<br>&gt; function getDigits(length, terminators, timeout)<br>&gt; {<br>&gt;&nbsp;&nbsp; if (_digits.length &lt; length)<br>&gt;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; tempVar = _digits;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; _digits = "";<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; tempVar += session.getDigits(length - _digits.length, terminators,<br>&gt; timeout);<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return tempVar;<br>&gt;&nbsp;&nbsp; }<br>&gt;&nbsp;&nbsp; else<br>&gt;&nbsp;&nbsp; {<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; tempVar =
 _digits;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; _digits = "";<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return tempVar;<br>&gt;&nbsp;&nbsp; }<br>&gt; }<br>&gt;<br>&gt; Get my point? All of that could have been two lines of code if there<br>&gt; was an alternative to streamFile which do not remove the DTMF from the<br>&gt; input queue (or whatever it's called):<br>&gt;<br>&gt; session.streamAndAbortOnDtmf("theFile.wav");<br>&gt; var digit = session.getDigits(1, "", 3000);<br>&gt;<br>&gt; All I wanted was an alternative that is simple. Again: I'm not looking<br>&gt; for a replacement of streamFile but an complement for those who just<br>&gt; want to do the above.<br>&gt;<br>&gt; I apologize if my examples are incorrect in some way, I've written<br>&gt; them directly in this email with my mind as a reference. I might have<br>&gt; done some syntax errors or something like that. Afterall, it's<br>&gt; saturday =)<br>&gt;<br>&gt; But anyway. I can create an alternative to
 streamFile which does<br>&gt; On 8/10/07, Chris Danielson &lt;chris@maxpowersoft.com&gt; wrote:<br>&gt; &gt; Jonas,<br>&gt; &gt; To what purpose would having a streamFile abort without DTMF input?&nbsp;&nbsp;If<br>&gt; &gt; the streamFile operation is going to require aborting then DTMF input or<br>&gt; &gt; voice recognition will be the means.&nbsp;&nbsp;Jonas, your heart is in the right<br>&gt; &gt; place, but everything you have asked for is already implemented in a very<br>&gt; &gt; flexible manner within the JavaScript engine.<br>&gt; &gt; Regards,<br>&gt; &gt; Chris Danielson<br>&gt; &gt;<br>&gt; &gt; &gt; Yes. The current architecture works just fine.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; I'm not saying that the current method should be removed. It's<br>&gt; &gt; &gt; excellent in those cases when you want to filter input during<br>&gt; &gt; &gt; streamFile and recordFile. But I still think that those cases are more<br>&gt; &gt; &gt; rare than
 wanting to abort the speech.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; Consider this a feature request then: A new streamFile that do not eat<br>&gt; &gt; &gt; DTMF but aborts the speech instead. Or simply a new argument that<br>&gt; &gt; &gt; specifies that the method should abort instead of eating the DTMF.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; On 8/10/07, Mike Murdock &lt;mmurdock@coppercom.com&gt; wrote:<br>&gt; &gt; &gt;&gt; You do currently have the option to either continue playing the prompt<br>&gt; &gt; &gt;&gt; or abort the prompt. In order to collect the digits during the playing<br>&gt; &gt; &gt;&gt; of a prompt you must code a dtmf_callback handler. When a user presses<br>&gt; a<br>&gt; &gt; &gt;&gt; digit your call back handler gets called. You can decide it the digit<br>&gt; is<br>&gt; &gt; &gt;&gt; a valid one and if it is valid return "false" (or the digit) causing<br>&gt; the<br>&gt; &gt; &gt;&gt; prompt to stop. If the digit is not valid you
 can ignore it by<br>&gt; returning<br>&gt; &gt; &gt;&gt; "true" and the prompting will continue. While this does require the<br>&gt; &gt; &gt;&gt; application developer to code a digit handler it gives you a much<br>&gt; richer<br>&gt; &gt; &gt;&gt; option for the handling of the results.<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt; You are free to develop your own wrapper function to force the<br>&gt; &gt; &gt;&gt; particular behaviour you want. I have written a getdigits function in<br>&gt; &gt; &gt;&gt; javascript that you are welcome to use to get the behaviour you are<br>&gt; &gt; &gt;&gt; looking for.<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt; Michael B. Murdock<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt; ________________________________<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt; From: freeswitch-users-bounces@lists.freeswitch.org on<br>&gt; behalf of Jonas<br>&gt; &gt; &gt;&gt;
 Gauffin<br>&gt; &gt; &gt;&gt; Sent: Fri 8/10/2007 2:49 AM<br>&gt; &gt; &gt;&gt; To: freeswitch-users@lists.freeswitch.org<br>&gt; &gt; &gt;&gt; Subject: Re: [Freeswitch-users] Javascript input<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt; Why not simply make another streamFile method that aborts on input.<br>&gt; &gt; &gt;&gt; Then the user can choose which one he wants.<br>&gt; &gt; &gt;&gt;<br>&gt; &gt; &gt;&gt; I can elaborate my wish too. I guess that you have used a lot of IVR<br>&gt; &gt; &gt;&gt; applications, right?<br>&gt; &gt; &gt;&gt; For instance, you call your phone provider and they have a IVR m<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; _______________________________________________<br>&gt; &gt; Freeswitch-users mailing list<br>&gt; &gt; Freeswitch-users@lists.freeswitch.org<br>&gt; &gt;<br>&gt; <a target="_blank"
 href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>&gt; &gt;<br>&gt; UNSUBSCRIBE:<a target="_blank" href="http://lists.freeswitch.org/mailman/options/freeswitch-users">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>&gt; &gt; <a target="_blank" href="http://www.freeswitch.org">http://www.freeswitch.org</a><br>&gt; &gt;<br>&gt;<br>&gt; _______________________________________________<br>&gt; Freeswitch-users mailing list<br>&gt; Freeswitch-users@lists.freeswitch.org<br>&gt; <a target="_blank" href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>&gt; UNSUBSCRIBE:<a target="_blank" href="http://lists.freeswitch.org/mailman/options/freeswitch-users">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>&gt; <a target="_blank"
 href="http://www.freeswitch.org">http://www.freeswitch.org</a><br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;________________________________<br>&gt; Take the Internet to Go: Yahoo!Go puts the Internet in your pocket: mail,<br>&gt; news, photos &amp; more.<br>&gt; _______________________________________________<br>&gt; Freeswitch-users mailing list<br>&gt; Freeswitch-users@lists.freeswitch.org<br>&gt; <a target="_blank" href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>&gt; UNSUBSCRIBE:<a target="_blank" href="http://lists.freeswitch.org/mailman/options/freeswitch-users">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>&gt; <a target="_blank" href="http://www.freeswitch.org">http://www.freeswitch.org</a><br>&gt;<br>&gt;<br><br>_______________________________________________<br>Freeswitch-users mailing list<br>Freeswitch-users@lists.freeswitch.org<br><a
 target="_blank" href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>UNSUBSCRIBE:<a target="_blank" href="http://lists.freeswitch.org/mailman/options/freeswitch-users">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br><a target="_blank" href="http://www.freeswitch.org">http://www.freeswitch.org</a><br></div></div><br></div></div><br>
      <hr size=1>Yahoo! oneSearch: Finally, <a href="http://us.rd.yahoo.com/evt=48252/*http://mobile.yahoo.com/mobileweb/onesearch?refer=1ONXIC"> mobile search 
that gives answers</a>, not web links. 

</body></html>