diff options
Diffstat (limited to 'src/output/osx_plugin.c')
-rw-r--r-- | src/output/osx_plugin.c | 174 |
1 files changed, 85 insertions, 89 deletions
diff --git a/src/output/osx_plugin.c b/src/output/osx_plugin.c index 97ecb8e94..ff6ee870c 100644 --- a/src/output/osx_plugin.c +++ b/src/output/osx_plugin.c @@ -24,34 +24,19 @@ #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "osx" -typedef struct _OsxData { +struct osx_output { AudioUnit au; GMutex *mutex; GCond *condition; char *buffer; - size_t bufferSize; + size_t buffer_size; size_t pos; size_t len; int started; -} OsxData; - -static OsxData *newOsxData(void) -{ - OsxData *ret = g_new(OsxData, 1); - - ret->mutex = g_mutex_new(); - ret->condition = g_cond_new(); - - ret->pos = 0; - ret->len = 0; - ret->started = 0; - ret->buffer = NULL; - ret->bufferSize = 0; - - return ret; -} +}; -static bool osx_testDefault(void) +static bool +osx_output_test_default_device(void) { /*AudioUnit au; ComponentDescription desc; @@ -80,38 +65,45 @@ static bool osx_testDefault(void) } static void * -osx_initDriver(G_GNUC_UNUSED const struct audio_format *audio_format, - G_GNUC_UNUSED const struct config_param *param) +osx_output_init(G_GNUC_UNUSED const struct audio_format *audio_format, + G_GNUC_UNUSED const struct config_param *param) { - return newOsxData(); + struct osx_output *oo = g_new(struct osx_output, 1); + + oo->mutex = g_mutex_new(); + oo->condition = g_cond_new(); + + oo->pos = 0; + oo->len = 0; + oo->started = 0; + oo->buffer = NULL; + oo->buffer_size = 0; + + return oo; } -static void freeOsxData(OsxData * od) +static void osx_output_finish(void *data) { + struct osx_output *od = data; + g_free(od->buffer); g_mutex_free(od->mutex); g_cond_free(od->condition); g_free(od); } -static void osx_finishDriver(void *data) -{ - OsxData *od = data; - freeOsxData(od); -} - -static void osx_dropBufferedAudio(void *data) +static void osx_output_cancel(void *data) { - OsxData *od = data; + struct osx_output *od = data; g_mutex_lock(od->mutex); od->len = 0; g_mutex_unlock(od->mutex); } -static void osx_closeDevice(void *data) +static void osx_output_close(void *data) { - OsxData *od = data; + struct osx_output *od = data; g_mutex_lock(od->mutex); while (od->len) { @@ -130,45 +122,47 @@ static void osx_closeDevice(void *data) static OSStatus osx_render(void *vdata, - G_GNUC_UNUSED AudioUnitRenderActionFlags * ioActionFlags, - G_GNUC_UNUSED const AudioTimeStamp * inTimeStamp, - G_GNUC_UNUSED UInt32 inBusNumber, - G_GNUC_UNUSED UInt32 inNumberFrames, - AudioBufferList * bufferList) + G_GNUC_UNUSED AudioUnitRenderActionFlags *io_action_flags, + G_GNUC_UNUSED const AudioTimeStamp *in_timestamp, + G_GNUC_UNUSED UInt32 in_bus_number, + G_GNUC_UNUSED UInt32 in_number_frames, + AudioBufferList *buffer_list) { - OsxData *od = (OsxData *) vdata; - AudioBuffer *buffer = &bufferList->mBuffers[0]; - size_t bufferSize = buffer->mDataByteSize; - size_t bytesToCopy; - size_t bytes; - int curpos = 0; + struct osx_output *od = (struct osx_output *) vdata; + AudioBuffer *buffer = &buffer_list->mBuffers[0]; + size_t buffer_size = buffer->mDataByteSize; + size_t bytes_to_copy; + size_t trailer_length; + size_t dest_pos = 0; g_mutex_lock(od->mutex); - bytesToCopy = MIN(od->len, bufferSize); - bufferSize = bytesToCopy; - od->len -= bytesToCopy; + bytes_to_copy = MIN(od->len, buffer_size); + buffer_size = bytes_to_copy; + od->len -= bytes_to_copy; - bytes = od->bufferSize - od->pos; - if (bytesToCopy > bytes) { - memcpy((unsigned char*)buffer->mData + curpos, od->buffer + od->pos, bytes); + trailer_length = od->buffer_size - od->pos; + if (bytes_to_copy > trailer_length) { + memcpy((unsigned char*)buffer->mData + dest_pos, + od->buffer + od->pos, trailer_length); od->pos = 0; - curpos += bytes; - bytesToCopy -= bytes; + dest_pos += trailer_length; + bytes_to_copy -= trailer_length; } - memcpy((unsigned char*)buffer->mData + curpos, od->buffer + od->pos, bytesToCopy); - od->pos += bytesToCopy; + memcpy((unsigned char*)buffer->mData + dest_pos, + od->buffer + od->pos, bytes_to_copy); + od->pos += bytes_to_copy; - if (od->pos >= od->bufferSize) + if (od->pos >= od->buffer_size) od->pos = 0; g_mutex_unlock(od->mutex); g_cond_signal(od->condition); - buffer->mDataByteSize = bufferSize; + buffer->mDataByteSize = buffer_size; - if (!bufferSize) { + if (!buffer_size) { g_usleep(1000); } @@ -176,16 +170,16 @@ osx_render(void *vdata, } static bool -osx_openDevice(void *data, struct audio_format *audioFormat) +osx_output_open(void *data, struct audio_format *audio_format) { - OsxData *od = data; + struct osx_output *od = data; ComponentDescription desc; Component comp; AURenderCallbackStruct callback; - AudioStreamBasicDescription streamDesc; + AudioStreamBasicDescription stream_description; - if (audioFormat->bits > 16) - audioFormat->bits = 16; + if (audio_format->bits > 16) + audio_format->bits = 16; desc.componentType = kAudioUnitType_Output; desc.componentSubType = kAudioUnitSubType_DefaultOutput; @@ -222,22 +216,24 @@ osx_openDevice(void *data, struct audio_format *audioFormat) return false; } - streamDesc.mSampleRate = audioFormat->sample_rate; - streamDesc.mFormatID = kAudioFormatLinearPCM; - streamDesc.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; + stream_description.mSampleRate = audio_format->sample_rate; + stream_description.mFormatID = kAudioFormatLinearPCM; + stream_description.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; #if G_BYTE_ORDER == G_BIG_ENDIAN - streamDesc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; + stream_description.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; #endif - streamDesc.mBytesPerPacket = audio_format_frame_size(audioFormat); - streamDesc.mFramesPerPacket = 1; - streamDesc.mBytesPerFrame = streamDesc.mBytesPerPacket; - streamDesc.mChannelsPerFrame = audioFormat->channels; - streamDesc.mBitsPerChannel = audioFormat->bits; + stream_description.mBytesPerPacket = + audio_format_frame_size(audio_format); + stream_description.mFramesPerPacket = 1; + stream_description.mBytesPerFrame = stream_description.mBytesPerPacket; + stream_description.mChannelsPerFrame = audio_format->channels; + stream_description.mBitsPerChannel = audio_format->bits; if (AudioUnitSetProperty(od->au, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, - &streamDesc, sizeof(streamDesc)) != 0) { + &stream_description, + sizeof(stream_description)) != 0) { AudioUnitUninitialize(od->au); CloseComponent(od->au); g_warning("Unable to set format on OS X device\n"); @@ -245,9 +241,9 @@ osx_openDevice(void *data, struct audio_format *audioFormat) } /* create a buffer of 1s */ - od->bufferSize = (audioFormat->sample_rate) * - audio_format_frame_size(audioFormat); - od->buffer = g_realloc(od->buffer, od->bufferSize); + od->buffer_size = (audio_format->sample_rate) * + audio_format_frame_size(audio_format); + od->buffer = g_realloc(od->buffer, od->buffer_size); od->pos = 0; od->len = 0; @@ -256,9 +252,9 @@ osx_openDevice(void *data, struct audio_format *audioFormat) } static size_t -osx_play(void *data, const void *chunk, size_t size) +osx_output_play(void *data, const void *chunk, size_t size) { - OsxData *od = data; + struct osx_output *od = data; size_t start, nbytes; if (!od->started) { @@ -273,17 +269,17 @@ osx_play(void *data, const void *chunk, size_t size) g_mutex_lock(od->mutex); - while (od->len >= od->bufferSize) + while (od->len >= od->buffer_size) /* wait for some free space in the buffer */ g_cond_wait(od->condition, od->mutex); start = od->pos + od->len; - if (start >= od->bufferSize) - start -= od->bufferSize; + if (start >= od->buffer_size) + start -= od->buffer_size; nbytes = start < od->pos ? od->pos - start - : od->bufferSize - start; + : od->buffer_size - start; assert(nbytes > 0); @@ -300,11 +296,11 @@ osx_play(void *data, const void *chunk, size_t size) const struct audio_output_plugin osxPlugin = { .name = "osx", - .test_default_device = osx_testDefault, - .init = osx_initDriver, - .finish = osx_finishDriver, - .open = osx_openDevice, - .play = osx_play, - .cancel = osx_dropBufferedAudio, - .close = osx_closeDevice, + .test_default_device = osx_output_test_default_device, + .init = osx_output_init, + .finish = osx_output_finish, + .open = osx_output_open, + .close = osx_output_close, + .play = osx_output_play, + .cancel = osx_output_cancel, }; |