chiark / gitweb /
Synchronize with trunk
[disorder] / lib / coreaudio.c
index c8732d558f3e23a70396cb2df2c8ba9088da8eb5..aafab8612b6f71209102a900170f971993d5ccbc 100644 (file)
@@ -16,7 +16,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /** @file lib/coreaudio.c
- * @brief Support for @ref BACKEND_COREAUDIO
+ * @brief Support for Apple Core Audio
  */
 
 #include "common.h"
 
 #include "coreaudio.h"
 #include "log.h"
+#include "printf.h"
 #include <CoreFoundation/CFString.h>
+/* evil bodge to work around broken header file */
+#undef error
+#include <CoreServices/CoreServices.h>
+#include <stdarg.h>
+
+/** @brief Report an error with an OSStatus */
+void coreaudio_fatal(OSStatus err, const char *fmt, ...) {
+  va_list ap;
+  char *msg;
+
+  va_start(ap, fmt);
+  byte_vasprintf(&msg, fmt, ap);
+  va_end(ap);
+
+  disorder_fatal(0, "%s: error %u", msg, (unsigned)err);
+}
 
 /** @brief Return the default device ID */
 static AudioDeviceID coreaudio_use_default(void) {
@@ -40,17 +57,17 @@ static AudioDeviceID coreaudio_use_default(void) {
   status = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,
                                     &propertySize, &adid);
   if(status)
-    fatal(0, "AudioHardwareGetProperty kAudioHardwarePropertyDefaultOutputDevice: %d", (int)status);
+    coreaudio_fatal(status, "AudioHardwareGetProperty kAudioHardwarePropertyDefaultOutputDevice");
   if(adid == kAudioDeviceUnknown)
-    fatal(0, "no output device");
+    disorder_fatal(0, "no output device");
   return adid;
 }
 
 /** @brief Find a device by some string
  * @param selector Selector for property to look for
- * @param description Property description
  * @param devs List of device IDs
  * @param ndevs Number of device IDs in @p devs
+ * @param dev Desired device name
  * @param resultp Where to put device ID
  * @return 1 if found, 0 if not found
  */
@@ -70,7 +87,7 @@ static int coreaudio_find_device(AudioObjectPropertySelector selector,
                                     selector,
                                     &propertySize, &name);
     if(status)
-      fatal(0, "AudioDeviceGetProperty: %d", (int)status);
+      coreaudio_fatal(status, "AudioDeviceGetProperty");
 #if 0
     UInt8 output[1024];
     CFIndex used;
@@ -79,7 +96,7 @@ static int coreaudio_find_device(AudioObjectPropertySelector selector,
                      '?', FALSE, output, sizeof output,
                      &used);
     output[used] = 0;
-    info("device %u %s: %s", n, description, (char *)output);
+    disorder_info("device %u %s: %s", n, description, (char *)output);
 #endif
     if(CFStringCompare(dev, name,
                        kCFCompareCaseInsensitive|kCFCompareNonliteral)
@@ -113,7 +130,7 @@ AudioDeviceID coreaudio_getdevice(const char *name) {
                                   name,
                                   kCFStringEncodingUTF8);
   if(!dev)
-    fatal(0, "CFStringCreateWithBytes failed");
+    disorder_fatal(0, "CFStringCreateWithBytes failed");
   /* Get a list of available devices */
   AudioDeviceID devs[1024];
   unsigned ndevs;
@@ -122,13 +139,12 @@ AudioDeviceID coreaudio_getdevice(const char *name) {
   status = AudioHardwareGetProperty(kAudioHardwarePropertyDevices,
                                     &propertySize, devs);
   if(status)
-    fatal(0, "AudioHardwareGetProperty kAudioHardwarePropertyDevices: %d",
-          (int)status);
+    coreaudio_fatal(status, "AudioHardwareGetProperty kAudioHardwarePropertyDevices");
   ndevs = propertySize / sizeof *devs;
   if(!ndevs)
-    fatal(0, "no sound devices found");
+    disorder_fatal(0, "no sound devices found");
   /* Try looking up by UID first */
-  found = coreaudio_find_device(kAudioDevicePropertyDeviceUID, //"UID",
+  found = coreaudio_find_device(-1*kAudioDevicePropertyDeviceUID, //"UID",
                                 devs, ndevs, dev, &adid);
   /* Failing that try looking up by name */
   if(!found)
@@ -136,7 +152,7 @@ AudioDeviceID coreaudio_getdevice(const char *name) {
                                   devs, ndevs, dev, &adid);
   CFRelease(dev);
   if(!found)
-    fatal(0, "cannot find device '%s'", name);
+    disorder_fatal(0, "cannot find device '%s'", name);
   return adid;
 }