コード例 #1
0
// ----------------------------------------------------------
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));
	}
}
コード例 #2
0
ファイル: AKTimeline.c プロジェクト: hsin919/AudioKit
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;
}
コード例 #3
0
	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));
		}
	}
コード例 #4
0
ファイル: coreaudio_common.c プロジェクト: chouquette/vlc
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;
}
コード例 #5
0
ファイル: coreaudio.c プロジェクト: CMB/pcaudiolib
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;
}