From 9a4ae4cbd5ff324c354a3decbe1bae414d92e6a9 Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Mon, 14 Mar 2011 13:39:30 +0100 Subject: [PATCH 1/5] module-coreaudio-detect: fix variable assignment in pa__done() Do not dereference 'u' prior to its assignment. --- src/modules/coreaudio/module-coreaudio-detect.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/coreaudio/module-coreaudio-detect.c b/src/modules/coreaudio/module-coreaudio-detect.c index 1d26b84e4..263fc72d0 100644 --- a/src/modules/coreaudio/module-coreaudio-detect.c +++ b/src/modules/coreaudio/module-coreaudio-detect.c @@ -232,12 +232,14 @@ fail: void pa__done(pa_module *m) { struct userdata *u; - struct ca_device *dev = u->devices; + struct ca_device *dev; AudioObjectPropertyAddress property_address; pa_assert(m); pa_assert_se(u = m->userdata); + dev = u->devices; + property_address.mSelector = kAudioHardwarePropertyDevices; property_address.mScope = kAudioObjectPropertyScopeGlobal; property_address.mElement = kAudioObjectPropertyElementMaster; From 249384c7a2bf0f17f8869998ea019c9d3d22b0da Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Mon, 14 Mar 2011 14:05:04 +0100 Subject: [PATCH 2/5] osx: re-order module locations move all Mac OS X related modules to own location. --- src/Makefile.am | 6 +++--- src/modules/{ => macosx}/module-bonjour-publish.c | 0 src/modules/{coreaudio => macosx}/module-coreaudio-detect.c | 0 src/modules/{coreaudio => macosx}/module-coreaudio-device.c | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/modules/{ => macosx}/module-bonjour-publish.c (100%) rename src/modules/{coreaudio => macosx}/module-coreaudio-detect.c (100%) rename src/modules/{coreaudio => macosx}/module-coreaudio-device.c (100%) diff --git a/src/Makefile.am b/src/Makefile.am index 78ee231f2..ff98ddb1d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1541,13 +1541,13 @@ module_oss_la_LIBADD = $(MODULE_LIBADD) liboss-util.la # COREAUDIO -module_coreaudio_detect_la_SOURCES = modules/coreaudio/module-coreaudio-detect.c +module_coreaudio_detect_la_SOURCES = modules/macosx/module-coreaudio-detect.c module_coreaudio_detect_la_LDFLAGS = $(MODULE_LDFLAGS) \ -Wl,-framework -Wl,Cocoa -framework CoreAudio \ -Wl,-framework -Wl,AudioUnit -framework AudioUnit module_coreaudio_detect_la_LIBADD = $(MODULE_LIBADD) -module_coreaudio_device_la_SOURCES = modules/coreaudio/module-coreaudio-device.c +module_coreaudio_device_la_SOURCES = modules/macosx/module-coreaudio-device.c module_coreaudio_device_la_LDFLAGS = $(MODULE_LDFLAGS) \ -Wl,-framework -Wl,Cocoa -framework CoreAudio \ -Wl,-framework -Wl,AudioUnit -framework AudioUnit @@ -1618,7 +1618,7 @@ module_zeroconf_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) # Bonjour -module_bonjour_publish_la_SOURCES = modules/module-bonjour-publish.c +module_bonjour_publish_la_SOURCES = modules/macosx/module-bonjour-publish.c module_bonjour_publish_la_LDFLAGS = $(MODULE_LDFLAGS) \ -Wl,-framework -Wl,CoreFoundation -framework CoreFoundation module_bonjour_publish_la_LIBADD = $(MODULE_LIBADD) diff --git a/src/modules/module-bonjour-publish.c b/src/modules/macosx/module-bonjour-publish.c similarity index 100% rename from src/modules/module-bonjour-publish.c rename to src/modules/macosx/module-bonjour-publish.c diff --git a/src/modules/coreaudio/module-coreaudio-detect.c b/src/modules/macosx/module-coreaudio-detect.c similarity index 100% rename from src/modules/coreaudio/module-coreaudio-detect.c rename to src/modules/macosx/module-coreaudio-detect.c diff --git a/src/modules/coreaudio/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c similarity index 100% rename from src/modules/coreaudio/module-coreaudio-device.c rename to src/modules/macosx/module-coreaudio-device.c From 00d96c04dcf73fd1c79b2ac6956592e9ba17aebf Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Thu, 17 Mar 2011 12:40:26 +0100 Subject: [PATCH 3/5] osx: add -headerpad_max_install_names to LDFLAGS This is needed for sufficient padding of library names in linked binaries. --- src/Makefile.am | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index ff98ddb1d..dc49bc19a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -78,6 +78,10 @@ AM_LDFLAGS+=-Wl,--export-all-symbols,--enable-auto-import -no-undefined WINSOCK_LIBS=-lwsock32 -lws2_32 -lwininet endif +if OS_IS_DARWIN +AM_LDFLAGS+=-headerpad_max_install_names +endif + FOREIGN_CFLAGS = -w MODULE_LDFLAGS = $(AM_LDFLAGS) -module -disable-static -avoid-version $(LDFLAGS_NOUNDEFINED) MODULE_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la From 85c5a2d7492cfa58fdbf9fcf747a2c86dc42378b Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Fri, 18 Mar 2011 15:53:38 +0100 Subject: [PATCH 4/5] configure.ac: add --mac-universal directive for OS X On a system with all depency libs built as multi-arch binaries, this option can now be used to build fat Mach-O binaries for multiple architectures. --- configure.ac | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/configure.ac b/configure.ac index 5a78ffb9b..78b37c4ca 100644 --- a/configure.ac +++ b/configure.ac @@ -169,6 +169,11 @@ AC_ARG_ENABLE([atomic-arm-memory-barrier], esac ],) +AC_ARG_ENABLE(mac-universal, + AS_HELP_STRING([--enable-mac-universal], [Build Mac universal binaries]), + enable_mac_universal=$enableval, enable_mac_universal="no") + + AC_MSG_CHECKING([target operating system]) case $host in *-*-linux*) @@ -178,6 +183,14 @@ case $host in *-*-darwin*) AC_MSG_RESULT([darwin]) pulse_target_os=darwin + + if test "x$enable_mac_universal" = "xyes" ; then + mac_version_min="-mmacosx-version-min=10.5" + mac_arches="-arch i386 -arch x86_64" + mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.5.sdk" + LDFLAGS="$LDFLAGS $mac_arches $mac_sysroot $mac_version_min" + CFLAGS="$CFLAGS $CFLAGS $mac_arches $mac_sysroot $mac_version_min" + fi ;; *) AC_MSG_RESULT([unknown]) From fc339a608e0a295312a1887b6cfb78883f7c556c Mon Sep 17 00:00:00 2001 From: Daniel Mack Date: Sun, 20 Mar 2011 17:57:49 +0100 Subject: [PATCH 5/5] osx: add routines for real-time thread scheduling Code sniplets are based on examples provided by Apple. See http://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html --- src/pulsecore/core-util.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index a713cae04..7d239186c 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -107,6 +107,10 @@ #ifdef __APPLE__ #include +#include +#include +#include +#include #endif #ifdef HAVE_DBUS @@ -685,7 +689,39 @@ static int set_scheduler(int rtprio) { * the thread is already realtime, don't do anything. */ int pa_make_realtime(int rtprio) { -#ifdef _POSIX_PRIORITY_SCHEDULING +#if defined(OS_IS_DARWIN) + struct thread_time_constraint_policy ttcpolicy; + uint64_t freq = 0; + size_t size = sizeof(freq); + int ret; + + ret = sysctlbyname("hw.cpufrequency", &freq, &size, NULL, 0); + if (ret < 0) { + pa_log_info("Unable to read CPU frequency, acquisition of real-time scheduling failed."); + return -1; + } + + pa_log_debug("sysctl for hw.cpufrequency: %llu", freq); + + /* See http://developer.apple.com/library/mac/#documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html */ + ttcpolicy.period = freq / 160; + ttcpolicy.computation = freq / 3300; + ttcpolicy.constraint = freq / 2200; + ttcpolicy.preemptible = 1; + + ret = thread_policy_set(mach_thread_self(), + THREAD_TIME_CONSTRAINT_POLICY, + (thread_policy_t) &ttcpolicy, + THREAD_TIME_CONSTRAINT_POLICY_COUNT); + if (ret) { + pa_log_info("Unable to set real-time thread priority (%08x).", ret); + return -1; + } + + pa_log_info("Successfully acquired real-time thread priority."); + return 0; + +#elif _POSIX_PRIORITY_SCHEDULING int p; if (set_scheduler(rtprio) >= 0) {