// ---------------------------------------------------------- ofxAudioUnitInput::ofxAudioUnitInput(unsigned int samplesToBuffer) : _impl(new InputImpl) // ---------------------------------------------------------- { _desc = inputDesc; initUnit(); AudioStreamBasicDescription ASBD = {0}; UInt32 ASBD_size = sizeof(ASBD); OFXAU_PRINT(AudioUnitGetProperty(*_unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &ASBD, &ASBD_size), "getting input ASBD"); _impl->ctx.inputUnit = _unit; _impl->ctx.bufferList = AudioBufferListRef(AudioBufferListAlloc(ASBD.mChannelsPerFrame, 1024), AudioBufferListRelease); _impl->ctx.circularBuffers.resize(ASBD.mChannelsPerFrame); _impl->isReady = false; #if !TARGET_OS_IPHONE _impl->inputDeviceID = DefaultAudioInputDevice(); #endif for(int i = 0; i < ASBD.mChannelsPerFrame; i++) { TPCircularBufferInit(&_impl->ctx.circularBuffers[i], samplesToBuffer * sizeof(Float32)); } }
void AKTimelineInit(AKTimeline *timeline, AudioStreamBasicDescription format, AKTimelineCallback callback, void *callbackRef) { memset(timeline, 0, sizeof(AKTimeline)); timeline->format = format; TPCircularBufferInit(&timeline->messageQueue, sizeof(AKTimelineMessage) * 32); pthread_mutex_init(&timeline->messageQueueLock, NULL); timeline->callBack = callback; timeline->callbackRef = callbackRef; }
void setCircularBufferCount(UInt32 bufferCount) { for(int i = 0; i < circularBuffers.size(); i++) { TPCircularBufferCleanup(&circularBuffers[i]); } circularBuffers.resize(bufferCount); for(int i = 0; i < circularBuffers.size(); i++) { TPCircularBufferInit(&circularBuffers[i], samplesToTrack * sizeof(AudioUnitSampleType)); } }
int ca_Initialize(audio_output_t *p_aout, const audio_sample_format_t *fmt, mtime_t i_dev_latency_us) { struct aout_sys_common *p_sys = (struct aout_sys_common *) p_aout->sys; atomic_init(&p_sys->i_underrun_size, 0); atomic_init(&p_sys->b_paused, false); p_sys->i_rate = fmt->i_rate; p_sys->i_bytes_per_frame = fmt->i_bytes_per_frame; p_sys->i_frame_length = fmt->i_frame_length; p_sys->chans_to_reorder = 0; msg_Dbg(p_aout, "Current device has a latency of %lld us", i_dev_latency_us); /* TODO VLC can't handle latency higher than 1 seconds */ if (i_dev_latency_us > 1000000) { i_dev_latency_us = 1000000; msg_Warn(p_aout, "VLC can't handle this device latency, lowering it to " "%lld", i_dev_latency_us); } p_sys->i_dev_latency_us = i_dev_latency_us; /* setup circular buffer */ size_t i_audiobuffer_size = fmt->i_rate * fmt->i_bytes_per_frame / p_sys->i_frame_length; if (fmt->channel_type == AUDIO_CHANNEL_TYPE_AMBISONICS) { /* low latency: 40 ms of buffering */ i_audiobuffer_size = i_audiobuffer_size / 25; } else { /* 2 seconds of buffering */ i_audiobuffer_size = i_audiobuffer_size * AOUT_MAX_ADVANCE_TIME / CLOCK_FREQ; } fprintf(stderr, "i_audiobuffer_size: %zu\n", i_audiobuffer_size); if (!TPCircularBufferInit(&p_sys->circular_buffer, i_audiobuffer_size)) return VLC_EGENERIC; p_aout->play = ca_Play; p_aout->pause = ca_Pause; p_aout->flush = ca_Flush; p_aout->time_get = ca_TimeGet; return VLC_SUCCESS; }
int coreaudio_object_open(struct audio_object *object, enum audio_object_format format, uint32_t rate, uint8_t channels) { struct coreaudio_object *self = to_coreaudio_object(object); OSStatus err = noErr; if (self->initialized) return noErr; memset(&(self->format), 0, sizeof(AudioStreamBasicDescription)); (self->format).mSampleRate = rate; (self->format).mChannelsPerFrame = channels; (self->format).mFramesPerPacket = 1; switch (format) { case AUDIO_OBJECT_FORMAT_S16LE: (self->format).mFormatID = kAudioFormatLinearPCM; (self->format).mBitsPerChannel = 16; (self->format).mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; break; default: return -1; } // guess the remaining of the AudioBasicStreamDescription structure UInt32 procSize = sizeof(AudioStreamBasicDescription); err = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &procSize, &(self->format)); if(err != noErr) { goto cleanup; } // Find default output AudioComponentDescription outputcd = {0,}; outputcd.componentType = kAudioUnitType_Output; outputcd.componentSubType = kAudioUnitSubType_DefaultOutput; outputcd.componentManufacturer = kAudioUnitManufacturer_Apple; // Create a component AudioComponent outputComponent = AudioComponentFindNext(NULL, &outputcd); err = AudioComponentInstanceNew(outputComponent, &(self->outputUnit)); if(err != noErr) { goto cleanup; } // set render callback AURenderCallbackStruct callbackStruct; callbackStruct.inputProcRefCon = self; callbackStruct.inputProc = graphRenderProc; size_t propSize = sizeof(AURenderCallbackStruct); err = AudioUnitSetProperty(self->outputUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Output, 0, &callbackStruct, propSize); if(err != noErr) { goto cleanup; } // set output unit input format propSize = sizeof(AudioStreamBasicDescription); err = AudioUnitSetProperty(self->outputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &(self->format), propSize); if(err != noErr) { goto cleanup; } err = AudioUnitInitialize(self->outputUnit); if(err != noErr) { goto cleanup; } // create a circular buffer to produce and consume audio TPCircularBufferInit(&(self->circularBuffer), COREAUDIO_BUFFER_SIZE); self->initialized = TRUE; return noErr; cleanup: if(self->outputUnit) { AudioUnitUninitialize(self->outputUnit); AudioComponentInstanceDispose(self->outputUnit); } return err; }