コード例 #1
0
ファイル: CARingBuffer.cpp プロジェクト: atg/liveloops
CARingBufferError	CARingBuffer::Fetch(AudioBufferList *abl, UInt32 nFrames, SampleTime startRead)
{
	SampleTime endRead = startRead + nFrames;

	SampleTime startRead0 = startRead;
	SampleTime endRead0 = endRead;
		
	CARingBufferError err = ClipTimeBounds(startRead, endRead);
    SampleTime readSizeFrames = endRead - startRead;
    if (err) {
        if ( readSizeFrames <= 0 ) { CARB_DEBUG( "POS1 read size frames too little. (%ld)\n", err ); return err; }
    }
	
	SInt32 destStartFrameOffset = startRead - startRead0; 
	if ( destStartFrameOffset > 0 ) {
        CARB_DEBUG( "Fetch - Zeroing start bound\n" );
		ZeroABL(abl, 0, destStartFrameOffset * mBytesPerFrame);
	}

	SInt32 destEndSize = endRead0 - endRead; 
	if ( destEndSize > 0 ) {
        CARB_DEBUG( "Fetch - Zeroing end bound (%ld frames off)\n", destEndSize );
		ZeroABL(abl, ( destStartFrameOffset + readSizeFrames ) * mBytesPerFrame, destEndSize * mBytesPerFrame);
	}
	
	Byte **buffers = mBuffers;
	int offset0 = FrameOffset(startRead);
	int offset1 = FrameOffset(endRead);
    int destStartByteOffset = destStartFrameOffset * mBytesPerFrame;
	int nbytes;
    
	if ( offset0 < offset1 ) {
        nbytes = offset1 - offset0;
		FetchABL( abl, destStartByteOffset         , buffers, offset0, nbytes );
	} else {
		nbytes = mCapacityBytes - offset0;
		FetchABL( abl, destStartByteOffset         , buffers, offset0, nbytes  );
		FetchABL( abl, destStartByteOffset + nbytes, buffers, 0      , offset1 );
		nbytes += offset1;
	}

	int nchannels = abl->mNumberBuffers;
	AudioBuffer *dest = abl->mBuffers;
	while (--nchannels >= 0) {
		dest->mDataByteSize = nbytes;
		dest++;
	}
    
    OSStatus err2 = ClipTimeBounds( startRead, endRead );
    err2 = worse( err, err2 );
    readSizeFrames = endRead - startRead;
    if ( err2 ) {
        if ( readSizeFrames <= 0 ) { CARB_DEBUG( "POS2 read size frames too little. (%ld)\n", err2 ); return err2; }
    }

    if ( err2 ) {
        CARB_DEBUG( "Returning error %ld.\n", err2 );
    }
	return err2;
}
コード例 #2
0
ファイル: dominance.c プロジェクト: renaudlr/hbda
int bi_weak_dom_restrict (const cost_t * v1, const cost_t * v2, uint dims) {
	assert (dims > 0);
	uint k = ffs(dims);
	dims >>= k;
	int i = k-1;
	/*printf("v1; ");
	println_double_tab (v1, 4);
	printf("v2; ");
	println_double_tab (v2, 4);*/
	while (v1[i] == v2[i]) {
		if (dims <= 0)
			return -1;
		k = ffs(dims); dims >>= k;
		i += k;
	}
	if (better (v1[i], v2[i])) {
		// return 0 or 1
		while (dims > 0)  {
			k = ffs(dims); dims >>= k;
			i += k;
			if (worse (v1[i], v2[i]))
				return 0;
		}
		return 1;
	}
	else {
		// return 0 or -1
		while (dims > 0)  {
コード例 #3
0
ファイル: CARingBuffer.cpp プロジェクト: kybernetyk/SSUIKit
CARingBufferError	CARingBuffer::Fetch(AudioBufferList *abl, UInt32 nFrames, SampleTime startRead, bool outOfBoundsOK)
{
	SampleTime endRead = startRead + nFrames;

	SampleTime startRead0 = startRead;
	SampleTime endRead0 = endRead;
	SampleTime size;
		
	CARingBufferError err = CheckTimeBounds(startRead, endRead);
	size = endRead - startRead;
	if (err) {
		if (!outOfBoundsOK) return err;
		if (size <= 0) return err; // there is nothing to read
	}
	
	SInt32 destStartOffset = startRead - startRead0; 
	if (destStartOffset > 0) {
		ZeroABL(abl, 0, destStartOffset * mBytesPerFrame);
	}

	SInt32 destEndSize = endRead0 - endRead; 
	if (destEndSize > 0) {
		ZeroABL(abl, destStartOffset + size, destEndSize * mBytesPerFrame);
	}
	
	Byte **buffers = mBuffers;
	int offset0 = FrameOffset(startRead);
	int offset1 = FrameOffset(endRead);
	int nbytes;
	
	if (offset0 < offset1) {
		FetchABL(abl, destStartOffset, buffers, offset0, nbytes = offset1 - offset0);
	} else {
		nbytes = mCapacityBytes - offset0;
		FetchABL(abl, destStartOffset, buffers, offset0, nbytes);
		FetchABL(abl, destStartOffset + nbytes, buffers, 0, offset1);
		nbytes += offset1;
	}

	int nchannels = abl->mNumberBuffers;
	AudioBuffer *dest = abl->mBuffers;
	while (--nchannels >= 0)
	{
		dest->mDataByteSize = nbytes;
		dest++;
	}

	// have to check bounds again because the data may have been overwritten before we could finish reading it. 
	OSStatus err2 = CheckTimeBounds(startRead, endRead);
	err2 = worse(err, err2);
	size = endRead - startRead;
	if (err2) {
		if (!outOfBoundsOK) return err2;
		if (size <= 0) return err2; // there is nothing to read
	}
	return err2;
}
コード例 #4
0
ファイル: dominance.c プロジェクト: renaudlr/hbda
bool weak_dom (const cost_t * v1, const cost_t * v2, int p) {
	int i;
	for (i=0; i < p; i++) {
#ifdef DOM_COUNT_COMP
		other_comp++;
#endif
		if (worse (v1[i], v2[i]))
			return false;
	}
	return true;
}
コード例 #5
0
ファイル: dominance.c プロジェクト: renaudlr/hbda
bool dom (const cost_t * v1, const cost_t * v2, int p) {
	int i;
	bool one_ineq = false;
	for (i=0; i < p; i++) {
#ifdef DOM_COUNT_COMP
		other_comp++;
#endif
		if (worse (v1[i], v2[i]))
			return false;
		else if (better (v1[i], v2[i]))
			one_ineq = true;
	}
	return one_ineq;
}
コード例 #6
0
ファイル: dominance.c プロジェクト: renaudlr/hbda
int bi_weak_dom (const cost_t * v1, const cost_t * v2, int dim) {
	int i = 0;
	while (v1[i] == v2[i]) {
		i++;
		if (i == dim)
			return 1;
	}
	// i < first + p
	if (better (v1[i], v2[i])) {
		// return 0 or 1
		for ( ; i<dim; i++)
			if (worse (v1[i], v2[i]))
				return 0;
		return 1;
	}
	else {
		// return 0 or -1
		for ( ; i<dim; i++)
			if (better (v1[i], v2[i]))
				return 0;
		return -1;
	}
}