Index: Makefile
===================================================================
RCS file: /usr/cvsroot/asterisk/Makefile,v
retrieving revision 1.24
diff -u -r1.24 Makefile
--- Makefile 19 Aug 2003 16:42:30 -0000 1.24
+++ Makefile 25 Aug 2003 03:25:52 -0000
@@ -36,7 +36,7 @@
######### Uncomment to enable MMXTM optimizations for x86 architecture CPU's
######### which support MMX instructions. This should be newer pentiums,
######### ppro's, etc, as well as the AMD K6 and K7.
-#K6OPT = -DK6OPT
+K6OPT = -DK6OPT
#Tell gcc to optimize the asterisk's code
OPTIMIZE=-O6
@@ -256,6 +256,7 @@
install -m 755 asterisk $(ASTSBINDIR)/
install -m 755 astgenkey $(ASTSBINDIR)/
install -m 755 safe_asterisk $(ASTSBINDIR)/
+ install -m 755 sox_wrapper /usr/bin/
for x in $(SUBDIRS); do $(MAKE) -C $$x install || exit 1 ; done
install -d $(ASTHEADERDIR)
install include/asterisk/*.h $(ASTHEADERDIR)
Index: res/res_musiconhold.c
===================================================================
RCS file: /usr/cvsroot/asterisk/res/res_musiconhold.c,v
retrieving revision 1.7
diff -u -r1.7 res_musiconhold.c
--- res/res_musiconhold.c 16 Aug 2003 05:10:35 -0000 1.7
+++ res/res_musiconhold.c 25 Aug 2003 03:25:52 -0000
@@ -93,8 +93,7 @@
static ast_mutex_t moh_lock = AST_MUTEX_INITIALIZER;
-#define MPG_123 "/usr/bin/mpg123"
-#define MAX_MP3S 256
+#define MUSIC_PLAYER "/usr/bin/sox_wrapper"
static void child_handler(int sig)
{
@@ -108,8 +107,7 @@
{
int fds[2];
int files;
- char fns[MAX_MP3S][80];
- char *argv[MAX_MP3S + 50];
+ char *argv[51];
char xargs[256];
char *argptr;
int argc;
@@ -120,18 +118,11 @@
ast_log(LOG_WARNING, "%s is not a valid directory\n", class->dir);
return -1;
}
- argv[0] = MPG_123;
- argv[1] = "-q";
- argv[2] = "-s";
- argv[3] = "--mono";
- argv[4] = "-r";
- argv[5] = "8000";
- argv[6] = "-b";
- argv[7] = "2048";
- argc = 8;
+ closedir(dir);
+ argv[0] = MUSIC_PLAYER;
+ argc = 1;
if (class->quiet) {
- argv[argc++] = "-f";
- argv[argc++] = "8192";
+ argv[argc++] = "-Q";
}
/* Look for extra arguments and add them to the list */
@@ -146,32 +137,20 @@
}
}
- files = 0;
- while((de = readdir(dir)) && (files < MAX_MP3S)) {
- if ((strlen(de->d_name) > 3) && !strcasecmp(de->d_name + strlen(de->d_name) - 4, ".mp3")) {
- strncpy(fns[files], de->d_name, sizeof(fns[files]));
- argv[argc++] = fns[files];
- files++;
- }
- }
+ argv[argc++] = class->dir;
argv[argc] = NULL;
- closedir(dir);
if (pipe(fds)) {
ast_log(LOG_WARNING, "Pipe failed\n");
return -1;
}
#if 0
- printf("%d files total, %d args total\n", files, argc);
+ printf("%d args total\n", argc);
{
int x;
for (x=0;argv[x];x++)
printf("arg%d: %s\n", x, argv[x]);
}
#endif
- if (!files) {
- ast_log(LOG_WARNING, "Found no files in '%s'\n", class->dir);
- return -1;
- }
class->pid = fork();
if (class->pid < 0) {
close(fds[0]);
@@ -189,7 +168,7 @@
close(x);
/* Child */
chdir(class->dir);
- execv(MPG_123, argv);
+ execv(MUSIC_PLAYER, argv);
ast_log(LOG_WARNING, "Exec failed: %s\n", strerror(errno));
exit(1);
} else {
@@ -574,8 +553,6 @@
static void ast_moh_destroy(void)
{
struct mohclass *moh;
- char buff[8192];
- int bytes, tbytes=0, stime = 0;
if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "Destroying any remaining musiconhold processes\n");
ast_mutex_lock(&moh_lock);
@@ -583,12 +560,7 @@
while(moh) {
if (moh->pid) {
ast_log(LOG_DEBUG, "killing %d!\n", moh->pid);
- stime = time(NULL);
- kill(moh->pid, SIGABRT);
- while ((bytes = read(moh->srcfd, buff, 8192)) && time(NULL) < stime + 5) {
- tbytes = tbytes + bytes;
- }
- ast_log(LOG_DEBUG, "mpg123 pid %d and child died after %d bytes read\n", moh->pid, tbytes);
+ kill(moh->pid, SIGTERM);
close(moh->srcfd);
moh->pid = 0;
}
--- sox_wrapper 16 Aug 2003 05:10:35 -0000
+++ sox_wrapper 25 Aug 2003 03:25:52 -0000
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+use POSIX ":sys_wait_h";
+use strict;
+
+my ($playerpid, $data, %Kid_Status);
+my $ppid = getppid();
+my $rand = 0;
+my $num = 0;
+my @quiet = ();
+my $dir = $ARGV[$#ARGV];
+
+$SIG{INT} = sub {
+ kill 9, $playerpid;
+ exit 0;
+};
+
+$SIG{PIPE} = sub {
+ kill 9, $playerpid;
+ exit 0;
+};
+
+$SIG{HUP} = sub {
+ kill 9, $playerpid;
+ exec $0, @ARGV;
+};
+
+$SIG{TERM} = sub {
+ kill 9, $playerpid;
+ exit 0;
+};
+
+sub REAPER {
+ my $child;
+ unless (kill 0, $ppid) {
+ exit 0;
+ }
+ while (($child = waitpid(-1,WNOHANG)) > 0) {
+ $Kid_Status{$child} = $?;
+ if ($child == $playerpid) {
+ PlayFile();
+ }
+ }
+ $SIG{CHLD} = \&REAPER; # still loathe sysV
+}
+$SIG{CHLD} = \&REAPER;
+
+
+die "directory $dir does not exist\n" unless (-d $dir);
+opendir(DIR, $dir);
+my @files = readdir(DIR);
+closedir(DIR);
+
+if ($ARGV[0] eq '-Z' || $ARGV[0] eq '-Q') {
+ if ($ARGV[0] eq '-Z') {
+ $rand = 1;
+ srand();
+ } else {
+ @quiet = ('-v', '0.5');
+ }
+ if ($ARGV[1] eq '-Z' || $ARGV[1] eq '-Q') {
+ if ($ARGV[1] eq '-Z') {
+ $rand = 1;
+ srand();
+ } else {
+ @quiet = ('-v', '0.5');
+ }
+ }
+}
+
+sub PlayFile {
+ my $filename;
+
+ if ($rand) {
+ $filename = $files[int(rand($#files))];
+ } else {
+ $num = 0 if ($num > $#files);
+ $filename = $files[$num++];
+ }
+ if ($filename =~ /\.(...)$/) {
+ $playerpid = fork();
+ if ($playerpid == 0) {
+ exec { "sox" } "sox", "$dir/$filename", '-c', '1', '-r', '8000', '-w', '-s', '-t', 'raw', '-';
+ } elsif ($playerpid) {
+ my $kid;
+ do {
+ $kid = waitpid($playerpid, &WNOHANG);
+ sleep 1;
+ } until $kid > 0;
+ } else {
+ die "Couldn't fork!";
+ }
+ } else {
+ PlayFile();
+ }
+}
+
+PlayFile();
+sleep;