diff --git a/Makefile b/Makefile index c4c1510c10c3985ec1b80a900bbd04d0f7c68992..1d985edb6921d10208e6101937ee9f8d4bd153f0 100755 --- a/Makefile +++ b/Makefile @@ -247,6 +247,7 @@ endif ifeq (${OSARCH},Darwin) LIBS+=-lresolv CFLAGS+=-D__Darwin__ +AUDIO_LIBS=-framework CoreAudio endif ifeq (${OSARCH},FreeBSD) LIBS+=-lcrypto @@ -447,7 +448,7 @@ asterisk: editline/libedit.a db1-ast/libdb1.a stdtime/libtime.a $(OBJS) ast_expr $(CC) $(DEBUG) -o asterisk $(ASTLINK) $(OBJS) ast_expr.a $(LIBEDIT) db1-ast/libdb1.a stdtime/libtime.a $(LIBS) muted: muted.o - $(CC) -o muted muted.o + $(CC) $(AUDIO_LIBS) -o muted muted.o subdirs: for x in $(SUBDIRS); do $(MAKE) -C $$x || exit 1 ; done diff --git a/muted.c b/muted.c index b04f77a76b4daf517832b25863e74b46c6dd79b9..fd0b130c005fd50be91054251987fc43df551338 100755 --- a/muted.c +++ b/muted.c @@ -6,12 +6,19 @@ * Copyright (C) 2004 - 2005, Digium Inc. * * Mark Spencer <markster@digium.com> + * + * Updated for Mac OSX CoreAudio + * by Josh Roberson <josh@asteraisgi.com> * * Distributed under the terms of the GNU General Public License version 2.0 * */ +#ifndef __Darwin__ #include <linux/soundcard.h> +#else +#include <CoreAudio/AudioHardware.h> +#endif #include <stdio.h> #include <errno.h> #include <stdlib.h> @@ -35,7 +42,9 @@ static int muted = 0; static int needfork = 1; static int debug = 0; static int stepsize = 3; +#ifndef __Darwin__ static int mixchan = SOUND_MIXER_VOLUME; +#endif struct subchannel { char *name; @@ -148,7 +157,7 @@ static int load_config(void) } static FILE *astf; - +#ifndef __Darwin__ static int mixfd; static int open_mixer(void) @@ -160,6 +169,7 @@ static int open_mixer(void) } return 0; } +#endif /* !__Darwin */ static int connect_asterisk(void) { @@ -290,27 +300,84 @@ static struct channel *find_channel(char *channel) return chan; } +#ifndef __Darwin__ static int getvol(void) { int vol; + if (ioctl(mixfd, MIXER_READ(mixchan), &vol)) { +#else +static float getvol(void) +{ + float volumeL, volumeR, vol; + OSStatus err; + AudioDeviceID device; + UInt32 size; + UInt32 channels[2]; + + size = sizeof(device); + err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device); + size = sizeof(channels); + if (!err) + err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyPreferredChannelsForStereo, &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); + printf("volumeL = %f - volumeR = %f\n", volumeL, volumeR); + if (!err) + vol = (volumeL < volumeR) ? volumeR : volumeL; + else { +#endif fprintf(stderr, "Unable to read mixer volume: %s\n", strerror(errno)); return -1; } return vol; } +#ifndef __Darwin__ static int setvol(int vol) +#else +static int setvol(float vol) +#endif { +#ifndef __Darwin__ if (ioctl(mixfd, MIXER_WRITE(mixchan), &vol)) { +#else + float volumeL = vol; + float volumeR = vol; + OSStatus err; + AudioDeviceID device; + UInt32 size; + UInt32 channels[2]; + + size = sizeof(device); + err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device); + size = sizeof(channels); + err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyPreferredChannelsForStereo, &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) { +#endif + fprintf(stderr, "Unable to write mixer volume: %s\n", strerror(errno)); return -1; + } return 0; } +#ifndef __Darwin__ static int oldvol = 0; static int mutevol = 0; +#else +static float oldvol = 0; +static float mutevol = 0; +#endif static int mutedlevel(int orig, int mutelevel) { @@ -323,7 +390,11 @@ static int mutedlevel(int orig, int mutelevel) static void mute(void) { +#ifndef __Darwin__ int vol; +#else + float vol; +#endif int start; int x; vol = getvol(); @@ -341,19 +412,31 @@ static void mute(void) mutevol = mutedlevel(vol, mutelevel); setvol(mutevol); if (debug) +#ifdef __Darwin__ + printf("Mute from '%f' to '%f'!\n", oldvol, mutevol); +#else printf("Mute from '%04x' to '%04x'!\n", oldvol, mutevol); +#endif muted = 1; } static void unmute(void) { +#ifdef __Darwin__ + float vol; +#else int vol; +#endif int start; int x; vol = getvol(); if (debug) +#ifdef __Darwin__ + printf("Unmute from '%f' (should be '%f') to '%f'!\n", vol, mutevol, oldvol); +#else printf("Unmute from '%04x' (should be '%04x') to '%04x'!\n", vol, mutevol, oldvol); - if (vol == mutevol) { +#endif + if ((int)vol == mutevol) { if (smoothfade) start = mutelevel; else @@ -522,14 +605,20 @@ int main(int argc, char *argv[]) } if (load_config()) exit(1); +#ifndef __Darwin__ if (open_mixer()) exit(1); +#endif if (connect_asterisk()) { +#ifndef __Darwin__ close(mixfd); +#endif exit(1); } if (login_asterisk()) { +#ifndef __Darwin__ close(mixfd); +#endif fclose(astf); exit(1); }