diff --git a/Makefile b/Makefile index 1067b5a62d2edca75e43f606faa04e3e83ecbc47..bc6fdeabb6ff68fa7f8b772514bbc606c65119fa 100644 --- a/Makefile +++ b/Makefile @@ -801,8 +801,17 @@ config: cat contrib/init.d/rc.archlinux.asterisk | sed 's|__ASTERISK_ETC_DIR__|$(ASTETCDIR)|;s|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;s|__ASTERISK_VARRUN_DIR__|$(ASTVARRUNDIR)|;' > contrib/init.d/rc.asterisk.tmp ; \ $(INSTALL) -m 755 contrib/init.d/rc.asterisk.tmp $(DESTDIR)/etc/rc.d/asterisk ; \ rm -f contrib/init.d/rc.asterisk.tmp ; \ - elif [ -d $(DESTDIR)/Library/LaunchDaemons -a ! -f $(DESTDIR)/Library/LaunchDaemons/org.asterisk.asterisk.plist ] ; then \ - $(INSTALL) -m 644 contrib/init.d/org.asterisk.asterisk.plist $(DESTDIR)/Library/LaunchDaemons/org.asterisk.asterisk.plist; \ + elif [ -d $(DESTDIR)/Library/LaunchDaemons ]; then \ + if [ ! -f $(DESTDIR)/Library/LaunchDaemons/org.asterisk.asterisk.plist ]; then \ + sed 's|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;' < contrib/init.d/org.asterisk.asterisk.plist > asterisk.plist ; \ + $(INSTALL) -m 644 asterisk.plist $(DESTDIR)/Library/LaunchDaemons/org.asterisk.asterisk.plist; \ + rm -f asterisk.plist; \ + fi; \ + if [ ! -f $(DESTDIR)/Library/LaunchDaemons/org.asterisk.muted.plist ]; then \ + sed 's|__ASTERISK_SBIN_DIR__|$(ASTSBINDIR)|;' < contrib/init.d/org.asterisk.muted.plist > muted.plist ; \ + $(INSTALL) -m 644 muted.plist $(DESTDIR)/Library/LaunchDaemons/org.asterisk.muted.plist; \ + rm -f muted.plist; \ + fi; \ elif [ -f /etc/slackware-version ]; then \ echo "Slackware is not currently supported, although an init script does exist for it."; \ else \ diff --git a/contrib/init.d/org.asterisk.asterisk.plist b/contrib/init.d/org.asterisk.asterisk.plist index 79fe5d8aa48fb19fa7750cbe64ef7b539bb0124c..e22ce3e22bcac0aef71d96c8405d432bb88f192a 100644 --- a/contrib/init.d/org.asterisk.asterisk.plist +++ b/contrib/init.d/org.asterisk.asterisk.plist @@ -3,7 +3,7 @@ <plist version="1.0"> <dict> <key>Label</key> - <string>org.asterisk.asterisk.launchagent</string> + <string>org.asterisk.asterisk</string> <key>Disabled</key> <false/><!-- Change this to '<true/>' to disable Asterisk --> <key>UserName</key> @@ -19,10 +19,10 @@ <key>Umask</key> <integer>7</integer><!-- 0007 --> <key>Program</key> - <string>/usr/local/sbin/asterisk</string> + <string>__ASTERISK_SBIN_DIR__/asterisk</string> <key>ProgramArguments</key> <array> - <string>/usr/local/sbin/asterisk</string> + <string>__ASTERISK_SBIN_DIR__/asterisk</string> <string>-f</string><!-- Don't fork. This option is mandatory when running with launchd. --> </array> <key>EnvironmentVariables</key> diff --git a/contrib/init.d/org.asterisk.muted.plist b/contrib/init.d/org.asterisk.muted.plist new file mode 100644 index 0000000000000000000000000000000000000000..e3317ca80134eca548237f2de46b75cebc24c02a --- /dev/null +++ b/contrib/init.d/org.asterisk.muted.plist @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Label</key> + <string>org.asterisk.muted</string> + <key>Disabled</key> + <true/> + <key>UserName</key> + <string>asterisk</string> + <key>GroupName</key> + <string>asterisk</string> + <key>KeepAlive</key> + <true/> + <key>RunAtLoad</key> + <true/> + <key>Umask</key> + <integer>7</integer><!-- 0007 --> + <key>Program</key> + <string>__ASTERISK_SBIN_DIR__/muted</string> + <key>ProgramArguments</key> + <array> + <string>__ASTERISK_SBIN_DIR__/muted</string> + <string>-f</string> + </array> + <key>StandardInPath</key> + <string>/dev/null</string> + <key>StandardOutPath</key> + <string>/dev/null</string> + <key>StandardErrorPath</key> + <string>/dev/null</string> +</dict> +</plist> diff --git a/utils/muted.c b/utils/muted.c index 1202237b83903500ad90afe445036465a60f208d..211766e531bb619d7e3f95e054ebd621cf35c13d 100644 --- a/utils/muted.c +++ b/utils/muted.c @@ -39,6 +39,9 @@ #ifdef __Darwin__ #include <CoreAudio/AudioHardware.h> +#include <sys/types.h> +#include <pwd.h> +#include <sys/stat.h> #elif defined(__linux__) || defined(__FreeBSD__) || defined(__GLIBC__) #include <sys/soundcard.h> #endif @@ -54,7 +57,9 @@ #include <netinet/in.h> #include <arpa/inet.h> -static char *config = "/etc/muted.conf"; +#define ast_strlen_zero(a) (!(*(a))) + +static char *config = "/etc/asterisk/muted.conf"; static char host[256] = ""; static char user[256] = ""; @@ -349,17 +354,25 @@ static float getvol(void) AudioDeviceID device; UInt32 size; UInt32 channels[2]; + AudioObjectPropertyAddress OutputAddr = { kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + AudioObjectPropertyAddress ChannelAddr = { kAudioDevicePropertyPreferredChannelsForStereo, kAudioDevicePropertyScopeOutput, kAudioObjectPropertyElementWildcard }; + AudioObjectPropertyAddress VolumeAddr = { kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeOutput, }; size = sizeof(device); - err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device); + err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &OutputAddr, 0, NULL, &size, &device); size = sizeof(channels); - if (!err) - err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyPreferredChannelsForStereo, &size, &channels); + if (!err) { + err = AudioObjectGetPropertyData(device, &ChannelAddr, 0, NULL, &size, &channels); + } size = sizeof(vol); - if (!err) - err = AudioDeviceGetProperty(device, channels[0], false, kAudioDevicePropertyVolumeScalar, &size, &volumeL); - if (!err) - err = AudioDeviceGetProperty(device, channels[1], false, kAudioDevicePropertyVolumeScalar, &size, &volumeR); + if (!err) { + VolumeAddr.mElement = channels[0]; + err = AudioObjectGetPropertyData(device, &VolumeAddr, 0, NULL, &size, &volumeL); + } + if (!err) { + VolumeAddr.mElement = channels[1]; + err = AudioObjectGetPropertyData(device, &VolumeAddr, 0, NULL, &size, &volumeR); + } if (!err) vol = (volumeL < volumeR) ? volumeR : volumeL; else { @@ -385,16 +398,23 @@ static int setvol(float vol) AudioDeviceID device; UInt32 size; UInt32 channels[2]; + AudioObjectPropertyAddress OutputAddr = { kAudioHardwarePropertyDefaultOutputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + AudioObjectPropertyAddress ChannelAddr = { kAudioDevicePropertyPreferredChannelsForStereo, kAudioDevicePropertyScopeOutput, kAudioObjectPropertyElementWildcard }; + AudioObjectPropertyAddress VolumeAddr = { kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeOutput, }; size = sizeof(device); - err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device); + err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &OutputAddr, 0, NULL, &size, &device); size = sizeof(channels); - err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyPreferredChannelsForStereo, &size, &channels); + err = AudioObjectGetPropertyData(device, &ChannelAddr, 0, NULL, &size, &channels); size = sizeof(vol); - if (!err) - err = AudioDeviceSetProperty(device, 0, channels[0], false, kAudioDevicePropertyVolumeScalar, size, &volumeL); - if (!err) - err = AudioDeviceSetProperty(device, 0, channels[1], false, kAudioDevicePropertyVolumeScalar, size, &volumeR); + if (!err) { + VolumeAddr.mElement = channels[0]; + err = AudioObjectSetPropertyData(device, &VolumeAddr, 0, NULL, size, &volumeL); + } + if (!err) { + VolumeAddr.mElement = channels[1]; + err = AudioObjectSetPropertyData(device, &VolumeAddr, 0, NULL, size, &volumeR); + } if (err) { #endif @@ -692,9 +712,33 @@ int main(int argc, char *argv[]) exit(1); } #else - fprintf(stderr, "Mac OS X detected. Use 'launchd -d muted -f' to launch.\n"); + const char *found = NULL, *paths[] = { + "/Library/LaunchAgents/org.asterisk.muted.plist", + "/Library/LaunchDaemons/org.asterisk.muted.plist", + "contrib/init.d/org.asterisk.muted.plist", + "<path-to-asterisk-source>/contrib/init.d/org.asterisk.muted.plist" }; + char userpath[256]; + struct stat unused; + struct passwd *pwd = getpwuid(getuid()); + int i; + + snprintf(userpath, sizeof(userpath), "%s%s", pwd->pw_dir, paths[0]); + if (!stat(userpath, &unused)) { + found = userpath; + } + + if (!found) { + for (i = 0; i < 3; i++) { + if (!stat(paths[i], &unused)) { + found = paths[i]; + break; + } + } + } + + fprintf(stderr, "Mac OS X detected. Use 'launchctl load -w %s' to launch.\n", found ? found : paths[3]); exit(1); -#endif +#endif /* !defined(HAVE_SBIN_LAUNCHD */ } #endif for(;;) {