X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/4fd3886810d93a7d3d2c2505e8b9ac38df2430d1..fde67de26e36cf02d5632d934623bbc054a3c1d9:/lib/uaudio-coreaudio.c diff --git a/lib/uaudio-coreaudio.c b/lib/uaudio-coreaudio.c index 5c11ce4..6ca3f70 100644 --- a/lib/uaudio-coreaudio.c +++ b/lib/uaudio-coreaudio.c @@ -26,6 +26,7 @@ #include "mem.h" #include "log.h" #include "syscalls.h" +#include "configuration.h" /** @brief Callback to request sample data */ static uaudio_callback *coreaudio_callback; @@ -69,9 +70,9 @@ static OSStatus coreaudio_adioproc while(nsamples > 0) { /* Integer-format input buffer */ unsigned char input[1024]; - const int maxsamples = sizeof input / uaudio_sample_size; + const size_t maxsamples = sizeof input / uaudio_sample_size; /* How many samples we'll ask for */ - const int ask = nsamples > maxsamples ? maxsamples : (int)nsamples; + const size_t ask = nsamples > maxsamples ? maxsamples : nsamples; /* How many we get */ int got; @@ -80,13 +81,13 @@ static OSStatus coreaudio_adioproc nsamples -= got; if(uaudio_signed) { if(uaudio_bits == 16) { - const int16_t *ptr = input; + const int16_t *ptr = (int16_t *)input; while(got > 0) { --got; *samples++ = *ptr++ * (0.5 / 32767); } } else { - const int8_t *ptr = input; + const int8_t *ptr = (int8_t *)input; while(got > 0) { --got; *samples++ = *ptr++ * (0.5 / 127); @@ -94,13 +95,13 @@ static OSStatus coreaudio_adioproc } } else { if(uaudio_bits == 16) { - const uint16_t *ptr = input; + const uint16_t *ptr = (uint16_t *)input; while(got > 0) { --got; *samples++ = ((int)*ptr++ - 32768) * (0.5 / 32767); } } else { - const uint8_t *ptr = input; + const uint8_t *ptr = (uint8_t *)input; while(got > 0) { --got; *samples++ = ((int)*ptr++ - 128) * (0.5 / 127); @@ -123,11 +124,11 @@ static void coreaudio_start(uaudio_callback *callback, const char *device; if(uaudio_bits != 8 && uaudio_bits != 16) - disorder_fatal("asked for %d bits/channel but only support 8 and 16", + disorder_fatal(0, "asked for %d bits/channel but only support 8 and 16", uaudio_bits); coreaudio_callback = callback; coreaudio_userdata = userdata; - device = uaudio_get("device"); + device = uaudio_get("device", "default"); coreaudio_adid = coreaudio_getdevice(device); /* Get the device properties */ propertySize = sizeof asbd; @@ -137,25 +138,25 @@ static void coreaudio_start(uaudio_callback *callback, if(status) coreaudio_fatal(status, "AudioHardwareGetProperty"); D(("mSampleRate %f", asbd.mSampleRate)); - D(("mFormatID %08lx", asbd.mFormatID)); - D(("mFormatFlags %08lx", asbd.mFormatFlags)); - D(("mBytesPerPacket %08lx", asbd.mBytesPerPacket)); - D(("mFramesPerPacket %08lx", asbd.mFramesPerPacket)); - D(("mBytesPerFrame %08lx", asbd.mBytesPerFrame)); - D(("mChannelsPerFrame %08lx", asbd.mChannelsPerFrame)); - D(("mBitsPerChannel %08lx", asbd.mBitsPerChannel)); - D(("mReserved %08lx", asbd.mReserved)); + D(("mFormatID %08"PRIx32, asbd.mFormatID)); + D(("mFormatFlags %08"PRIx32, asbd.mFormatFlags)); + D(("mBytesPerPacket %08"PRIx32, asbd.mBytesPerPacket)); + D(("mFramesPerPacket %08"PRIx32, asbd.mFramesPerPacket)); + D(("mBytesPerFrame %08"PRIx32, asbd.mBytesPerFrame)); + D(("mChannelsPerFrame %08"PRIx32, asbd.mChannelsPerFrame)); + D(("mBitsPerChannel %08"PRIx32, asbd.mBitsPerChannel)); + D(("mReserved %08"PRIx32, asbd.mReserved)); /* Check that everything adds up */ if(asbd.mFormatID != kAudioFormatLinearPCM) disorder_fatal(0, "audio device does not support kAudioFormatLinearPCM"); if(asbd.mSampleRate != uaudio_rate - || asbd.mChannelsPerFrame != uaudio_channels) { + || asbd.mChannelsPerFrame != (unsigned)uaudio_channels) { disorder_fatal(0, "want %dHz %d channels " - "but got %"PRIu32"Hz %"PRIu32" channels", + "but got %gHz %"PRIu32" channels", uaudio_rate, uaudio_channels, - asbd.mSampleRate, - asbd.mChannelsPerFrame); + (double)asbd.mSampleRate, + (uint32_t)asbd.mChannelsPerFrame); } /* Add a collector callback */ status = AudioDeviceAddIOProc(coreaudio_adid, coreaudio_adioproc, 0); @@ -182,13 +183,18 @@ static void coreaudio_deactivate(void) { coreaudio_fatal(status, "AudioDeviceStop"); } +static void coreaudio_configure(void) { + uaudio_set("device", config->device); +} + const struct uaudio uaudio_coreaudio = { .name = "coreaudio", .options = coreaudio_options, .start = coreaudio_start, .stop = coreaudio_stop, .activate = coreaudio_activate, - .deactivate = coreaudio_deactivate + .deactivate = coreaudio_deactivate, + .configure = coreaudio_configure, }; #endif