1 /*
2  * Copyright © 2016 Mozilla Foundation
3  *
4  * This program is made available under an ISC-style license.  See the
5  * accompanying file LICENSE for details.
6  */
7 
8 #include "cubeb_osx_run_loop.h"
9 #include "cubeb_log.h"
10 #include <AudioUnit/AudioUnit.h>
11 #include <CoreAudio/AudioHardware.h>
12 #include <CoreAudio/HostTime.h>
13 #include <CoreFoundation/CoreFoundation.h>
14 #include <cubeb/cubeb.h>
15 
16 void
cubeb_set_coreaudio_notification_runloop()17 cubeb_set_coreaudio_notification_runloop()
18 {
19   /* This is needed so that AudioUnit listeners get called on this thread, and
20    * not the main thread. If we don't do that, they are not called, or a crash
21    * occur, depending on the OSX version. */
22   AudioObjectPropertyAddress runloop_address = {
23       kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal,
24       kAudioObjectPropertyElementMaster};
25 
26   CFRunLoopRef run_loop = nullptr;
27 
28   OSStatus r;
29   r = AudioObjectSetPropertyData(kAudioObjectSystemObject, &runloop_address, 0,
30                                  NULL, sizeof(CFRunLoopRef), &run_loop);
31   if (r != noErr) {
32     LOG("Could not make global CoreAudio notifications use their own thread.");
33   }
34 }
35