From 06fde4bfafaff33006359fb9e0ea965b0236e7af Mon Sep 17 00:00:00 2001 From: Matteo Brancaleoni Date: Fri, 14 Feb 2003 06:00:11 +0000 Subject: [PATCH] Fri Feb 14 07:00:01 CET 2003 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@614 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- agi/DialAnMp3.agi | 82 ++++++++++++++++++++++++++++++++++ agi/numeralize | 44 ++++++++++++++++++ apps/app_agi.c | 4 +- channel.c | 3 +- channels/chan_iax.c | 10 ++++- channels/chan_sip.c | 12 +++-- channels/chan_zap.c | 2 +- configs/parking.conf.sample | 2 +- pbx.c | 2 +- sounds/demo-enterkeywords.gsm | Bin 0 -> 9603 bytes sounds/demo-nomatch.gsm | Bin 0 -> 6336 bytes 11 files changed, 151 insertions(+), 10 deletions(-) create mode 100755 agi/DialAnMp3.agi create mode 100755 agi/numeralize create mode 100755 sounds/demo-enterkeywords.gsm create mode 100755 sounds/demo-nomatch.gsm diff --git a/agi/DialAnMp3.agi b/agi/DialAnMp3.agi new file mode 100755 index 0000000000..59a54265e6 --- /dev/null +++ b/agi/DialAnMp3.agi @@ -0,0 +1,82 @@ +#!/usr/bin/perl +# +# Simple AGI application to play mp3's selected by a user both using +# xmms and over the phone itself. +# +$|=1; +while() { + chomp; + last unless length($_); + if (/^agi_(\w+)\:\s+(.*)$/) { + $AGI{$1} = $2; + } +} + +print STDERR "AGI Environment Dump:\n"; +foreach $i (sort keys %AGI) { + print STDERR " -- $i = $AGI{$i}\n"; +} + +dbmopen(%DIGITS, "/var/lib/asterisk/mp3list", 0644) || die("Unable to open mp3list");; + +sub checkresult { + my ($res) = @_; + my $retval; + $tests++; + chomp $res; + if ($res =~ /^200/) { + $res =~ /result=(-?[\w\*\#]+)/; + return $1; + } else { + return -1; + } +} + +#print STDERR "1. Playing beep...\n"; +#print "STREAM FILE beep \"\"\n"; +#$result = ; +#checkresult($result); + +print STDERR "2. Getting song name...\n"; +print "GET DATA demo-enterkeywords\n"; +$result = ; +$digitstr = checkresult($result); +if ($digitstr < 0) { + exit(1); +} +$digitstr =~ s/\*/ /g; + +print STDERR "Resulting songname is $digitstr\n"; +@searchwords = split (/\s+/, $digitstr); +print STDERR "Searchwords: " . join(':', @searchwords) . "\n"; + +foreach $key (sort keys %DIGITS) { + @words = split(/\s+/, $DIGITS{$key}); + $match = 1; + foreach $search (@searchwords) { + $match = 0 unless grep(/$search/, @words); + } + if ($match > 0) { + print STDERR "File $key matches\n"; + # Play a beep + print "STREAM FILE beep \"\"\n"; + system("xmms", $key); + $result = ; + if (&checkresult($result) < 0) { + exit 0; + } + print "EXEC MP3Player \"$key\"\n"; +# print "WAIT FOR DIGIT 60000\n"; + $result = ; + if (&checkresult($result) < 0) { + exit 0; + } + print STDERR "Got here...\n"; + } +} + +print STDERR "4. Testing 'saynumber' of $digitstr...\n"; +print "STREAM FILE demo-nomatch\"\"\n"; +$result = ; +checkresult($result); + diff --git a/agi/numeralize b/agi/numeralize new file mode 100755 index 0000000000..5ca51913da --- /dev/null +++ b/agi/numeralize @@ -0,0 +1,44 @@ +#!/usr/bin/perl +# +# Build a database linking filenames to their numerical representations +# using a keypad for the DialAnMp3 application +# + +$mp3dir="/usr/media/mpeg3"; + +dbmopen(%DIGITS, "/var/lib/asterisk/mp3list", 0644) || die("Unable to open mp3list");; +sub process_dir { + my ($dir) = @_; + my $file; + my $digits; + my @entries; + opendir(DIR, $dir); + @entries = readdir(DIR); + closedir(DIR); + foreach $_ (@entries) { + if (!/^\./) { + $file = "$dir/$_"; + if (-d "$file") { + process_dir("$file"); + } else { + $digits = $_; + $digits =~ s/[^ \w]+//g; + $digits =~ s/\_/ /g; + $digits =~ tr/[a-z]/[A-Z]/; + $digits =~ tr/[A-C]/2/; + $digits =~ tr/[D-F]/3/; + $digits =~ tr/[G-I]/4/; + $digits =~ tr/[J-L]/5/; + $digits =~ tr/[M-O]/6/; + $digits =~ tr/[P-S]/7/; + $digits =~ tr/[T-V]/8/; + $digits =~ tr/[W-Z]/9/; + $digits =~ s/\s+/ /; + print "File: $file, digits: $digits\n"; + $DIGITS{$file} = $digits; + } + } + } +} + +process_dir($mp3dir); diff --git a/apps/app_agi.c b/apps/app_agi.c index 91ca9749f8..e7bccedf62 100755 --- a/apps/app_agi.c +++ b/apps/app_agi.c @@ -352,14 +352,14 @@ int ast_app_getdata(struct ast_channel *c, char *prompt, char *s, int maxlen, in static int handle_getdata(struct ast_channel *chan, int fd, int argc, char *argv[]) { int res; - char data[50]; + char data[1024]; int max; int timeout; if (argc < 3) return RESULT_SHOWUSAGE; if (argc >= 4) timeout = atoi(argv[3]); else timeout = 0; - if (argc >= 5) max = atoi(argv[4]); else max = 50; + if (argc >= 5) max = atoi(argv[4]); else max = 1024; res = ast_app_getdata(chan, argv[2], data, max, timeout); if (res == 1) fdprintf(fd, "200 result=%s (timeout)\n", data); diff --git a/channel.c b/channel.c index 83659c0734..e75f74723a 100755 --- a/channel.c +++ b/channel.c @@ -967,7 +967,8 @@ struct ast_frame *ast_read(struct ast_channel *chan) if (!(f->subclass & chan->nativeformats)) { /* This frame can't be from the current native formats -- drop it on the floor */ - ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s since our native format has changed\n", chan->name); + ast_log(LOG_NOTICE, "Dropping incompatible voice frame on %s of format %d since our native format has changed to %d\n", chan->name, f->subclass, chan->nativeformats); + ast_frfree(f); f = &null_frame; } else if (chan->pvt->readtrans) { f = ast_translate(chan->pvt->readtrans, f, 1); diff --git a/channels/chan_iax.c b/channels/chan_iax.c index ce896c7385..d48b24f552 100755 --- a/channels/chan_iax.c +++ b/channels/chan_iax.c @@ -1758,6 +1758,10 @@ static int iax_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, ast_verbose(VERBOSE_PREFIX_3 "Can't masquerade, we're different...\n"); return -2; } + if (c0->nativeformats != c1->nativeformats) { + ast_verbose(VERBOSE_PREFIX_3 "Operating with different codecs, can't native bridge...\n"); + return -2; + } if (!transferstarted) { /* Try the transfer */ if (iax_start_transfer(c0, c1)) @@ -2240,12 +2244,13 @@ static int iax_show_channels(int fd, int argc, char *argv[]) #define FORMAT2 "%-15.15s %-10.10s %-11.11s %-11.11s %-7.7s %-6.6s %s\n" #define FORMAT "%-15.15s %-10.10s %5.5d/%5.5d %5.5d/%5.5d %-5.5dms %-4.4dms %d\n" int x; + int numchans = 0; if (argc != 3) return RESULT_SHOWUSAGE; ast_cli(fd, FORMAT2, "Peer", "Username", "ID (Lo/Rem)", "Seq (Tx/Rx)", "Lag", "Jitter", "Format"); for (x=0;xaddr.sin_addr), strlen(iaxs[x]->username) ? iaxs[x]->username : "(None)", iaxs[x]->callno, iaxs[x]->peercallno, @@ -2253,8 +2258,11 @@ static int iax_show_channels(int fd, int argc, char *argv[]) iaxs[x]->lag, iaxs[x]->jitter, iaxs[x]->voiceformat); + numchans++; + } ast_pthread_mutex_unlock(&iaxsl[x]); } + ast_cli(fd, "%d active IAX channel(s)\n", numchans); return RESULT_SUCCESS; #undef FORMAT #undef FORMAT2 diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 93d8777349..2d49f13655 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -2413,6 +2413,7 @@ static int sip_show_channels(int fd, int argc, char *argv[]) #define FORMAT2 "%-15.15s %-10.10s %-11.11s %-11.11s %-7.7s %-6.6s %s\n" #define FORMAT "%-15.15s %-10.10s %-11.11s %5.5d/%5.5d %-5.5dms %-4.4dms %d\n" struct sip_pvt *cur; + int numchans = 0; if (argc != 3) return RESULT_SHOWUSAGE; ast_pthread_mutex_lock(&iflock); @@ -2427,8 +2428,10 @@ static int sip_show_channels(int fd, int argc, char *argv[]) 0, cur->owner ? cur->owner->nativeformats : 0); cur = cur->next; + numchans++; } ast_pthread_mutex_unlock(&iflock); + ast_cli(fd, "%d active SIP channel(s)\n", numchans); return RESULT_SUCCESS; #undef FORMAT #undef FORMAT2 @@ -3048,9 +3051,12 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc else transmit_response(p, "202 Accepted", req); ast_log(LOG_DEBUG,"202 Accepted\n"); - transfer_to = c->bridge; - if (transfer_to) - ast_async_goto(transfer_to,"", p->refer_to,1, 1); + c = p->owner; + if (c) { + transfer_to = c->bridge; + if (transfer_to) + ast_async_goto(transfer_to,"", p->refer_to,1, 1); + } } else if (!strcasecmp(cmd, "CANCEL") || !strcasecmp(cmd, "BYE")) { copy_request(&p->initreq, req); diff --git a/channels/chan_zap.c b/channels/chan_zap.c index 45f6aed813..9e8c9c0286 100755 --- a/channels/chan_zap.c +++ b/channels/chan_zap.c @@ -5361,11 +5361,11 @@ static void *pri_dchannel(void *vpri) ast_log(LOG_WARNING, "Ringing requested on channel %d not in use on span %d\n", e->ringing.channel, pri->span); chan = 0; } else if (!strlen(pri->pvt[chan]->dop.dialstr)) { + zt_enable_ec(pri->pvt[chan]); pri->pvt[chan]->subs[SUB_REAL].needringing =1; } else ast_log(LOG_DEBUG, "Deferring ringing notification because of extra digits to dial...\n"); } - zt_enable_ec(pri->pvt[chan]); break; case PRI_EVENT_FACNAME: chan = e->facname.channel; diff --git a/configs/parking.conf.sample b/configs/parking.conf.sample index 54658c9670..20eb427474 100755 --- a/configs/parking.conf.sample +++ b/configs/parking.conf.sample @@ -6,4 +6,4 @@ parkext => 700 ; What ext. to dial to park parkpos => 701-720 ; What extensions to park calls on context => parkedcalls ; Which context parked calls are in - +;parkingtime => 45 ; Number of seconds a call can be parked for (default is 45 seconds) diff --git a/pbx.c b/pbx.c index ba3d2bcb04..6e0f073b23 100755 --- a/pbx.c +++ b/pbx.c @@ -1139,7 +1139,7 @@ int ast_pbx_run(struct ast_channel *c) /* Something bad happened, or a hangup has been requested. */ if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) { ast_log(LOG_DEBUG, "Oooh, got something to jump out with ('%c')!\n", res); - exten[pos++] = res; + exten[pos++] = digit = res; break; } switch(res) { diff --git a/sounds/demo-enterkeywords.gsm b/sounds/demo-enterkeywords.gsm new file mode 100755 index 0000000000000000000000000000000000000000..dafd7a7d947c15a38d093c538b91c21e1b87aede GIT binary patch literal 9603 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 literal 0 HcmV?d00001 diff --git a/sounds/demo-nomatch.gsm b/sounds/demo-nomatch.gsm new file mode 100755 index 0000000000000000000000000000000000000000..a869457e58b2723603b9cd0a1638f389537541c6 GIT binary patch literal 6336 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 literal 0 HcmV?d00001