X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/f5fd9a6b25366f98a20468ca9bda64c4313db09e..8ab2aa9fd51a89e06d92a4f7c3792aaa4a08cc71:/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;
}