예제 #1
0
// read a ring buffer into the given row of the destination signal.
//
int MLProcRingBuffer::readToSignal(MLSignal& outSig, int samples, int row)
{
	int lastRead = 0;
	int skipped = 0;
	int available = 0;
	MLSample * outBuffer = outSig.getBuffer() + outSig.row(row);
	void * trashBuffer = (void *)mTrashSignal.getBuffer();
	MLSample * trashbufferAsSamples = reinterpret_cast<MLSample*>(trashBuffer);
	static MLSymbol modeSym("mode");
	int mode = (int)getParam(modeSym);
	bool underTrigger = false;
	MLSample triggerVal = 0.f;
		
	samples = min(samples, (int)outSig.getWidth());
	available = (int)PaUtil_GetRingBufferReadAvailable( &mBuf );
    
    // return if we have not accumulated enough signal.
	if (available < samples) return 0;
	
	// depending on trigger mode, trash samples up to the ones we will return.
	switch(mode)
	{
		default:
		case eMLRingBufferNoTrash:
		break;
		
		case eMLRingBufferUpTrig:		
			while (available >= samples+1)	
			{
				// read buffer
				lastRead = (int)PaUtil_ReadRingBuffer( &mBuf, trashBuffer, 1 );
				skipped += lastRead;
				available = (int)PaUtil_GetRingBufferReadAvailable( &mBuf );
				if(trashbufferAsSamples[0] < triggerVal)
				{
					underTrigger = true;
				}
				else
				{
					if (underTrigger == true) break;
					underTrigger = false;
				}
			}
		break;		

		case eMLRingBufferMostRecent:			
			if (available > samples)
			{
				// TODO modify pa ringbuffer instead of reading to trash buffer. 
				lastRead = (int)PaUtil_ReadRingBuffer( &mBuf, trashBuffer, available - samples );  
				// skipped += lastRead;
			}			
		break;
	}
	
    lastRead = (int)PaUtil_ReadRingBuffer( &mBuf, outBuffer, samples );

	// DEBUG
	/*
	const MLSymbol& myName = getName();
	if (!myName.compare("body_position_x_out"))
	{
		available = PaUtil_GetRingBufferReadAvailable( &mBuf );
		if ((skipped == 0) && (lastRead == 0))
		{
			debug() << "-";
		}
		else
		{
	debug() << getName() << " requested " << samples << " read " << lastRead << ", skipped " << skipped << ", avail. " << available << "\n";
		}
	}
	*/

	return lastRead;
}