X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/e3002eb9f618d7498f21933a2e8552d42ffcc7fc..5d22a5aeb435e90f20e5f8fd77c2256fd21d5f92:/lib/coreaudio.c diff --git a/lib/coreaudio.c b/lib/coreaudio.c index c8732d5..aafab86 100644 --- a/lib/coreaudio.c +++ b/lib/coreaudio.c @@ -16,7 +16,7 @@ * along with this program. If not, see . */ /** @file lib/coreaudio.c - * @brief Support for @ref BACKEND_COREAUDIO + * @brief Support for Apple Core Audio */ #include "common.h" @@ -25,7 +25,24 @@ #include "coreaudio.h" #include "log.h" +#include "printf.h" #include +/* evil bodge to work around broken header file */ +#undef error +#include +#include + +/** @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; }