From a612dd6ac60ec04b76a08893dc60e3f970f633cf Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Tue, 29 Jun 2010 20:58:15 +0000 Subject: [PATCH] fixed processor optimization from previous release for non-interleaved host buffers case (for example ASIO) --- src/common/pa_process.c | 60 ++++++++++++++++++++++++++--------------- src/common/pa_process.h | 2 ++ 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/common/pa_process.c b/src/common/pa_process.c index 4ec007a..c346b43 100644 --- a/src/common/pa_process.c +++ b/src/common/pa_process.c @@ -502,6 +502,7 @@ void PaUtil_SetInterleavedInputChannels( PaUtilBufferProcessor* bp, p += bp->bytesPerHostInputSample; bp->hostInputChannels[0][channel+i].stride = channelCount; } + bp->hostInputIsInterleaved[0] = 1; } @@ -512,6 +513,7 @@ void PaUtil_SetNonInterleavedInputChannel( PaUtilBufferProcessor* bp, bp->hostInputChannels[0][channel].data = data; bp->hostInputChannels[0][channel].stride = 1; + bp->hostInputIsInterleaved[0] = 0; } @@ -551,6 +553,7 @@ void PaUtil_Set2ndInterleavedInputChannels( PaUtilBufferProcessor* bp, p += bp->bytesPerHostInputSample; bp->hostInputChannels[1][channel+i].stride = channelCount; } + bp->hostInputIsInterleaved[1] = 1; } @@ -561,6 +564,7 @@ void PaUtil_Set2ndNonInterleavedInputChannel( PaUtilBufferProcessor* bp, bp->hostInputChannels[1][channel].data = data; bp->hostInputChannels[1][channel].stride = 1; + bp->hostInputIsInterleaved[1] = 0; } @@ -611,6 +615,7 @@ void PaUtil_SetInterleavedOutputChannels( PaUtilBufferProcessor* bp, PaUtil_SetOutputChannel( bp, channel + i, p, channelCount ); p += bp->bytesPerHostOutputSample; } + bp->hostOutputIsInterleaved[0] = 1; } @@ -620,6 +625,7 @@ void PaUtil_SetNonInterleavedOutputChannel( PaUtilBufferProcessor* bp, assert( channel < bp->outputChannelCount ); PaUtil_SetOutputChannel( bp, channel, data, 1 ); + bp->hostOutputIsInterleaved[0] = 0; } @@ -659,6 +665,7 @@ void PaUtil_Set2ndInterleavedOutputChannels( PaUtilBufferProcessor* bp, PaUtil_Set2ndOutputChannel( bp, channel + i, p, channelCount ); p += bp->bytesPerHostOutputSample; } + bp->hostOutputIsInterleaved[1] = 1; } @@ -668,6 +675,7 @@ void PaUtil_Set2ndNonInterleavedOutputChannel( PaUtilBufferProcessor* bp, assert( channel < bp->outputChannelCount ); PaUtil_Set2ndOutputChannel( bp, channel, data, 1 ); + bp->hostOutputIsInterleaved[1] = 0; } @@ -751,16 +759,21 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, destChannelStrideBytes = bp->bytesPerUserInputSample; userInput = bp->tempInputBuffer; - /* determine if processing of host buffer can be done directly by callback */ - if( bp->inputConverter == paConverters.Copy_8_To_8 || - bp->inputConverter == paConverters.Copy_16_To_16 || - bp->inputConverter == paConverters.Copy_24_To_24 || - bp->inputConverter == paConverters.Copy_32_To_32 ) - { - /* process host buffer directly */ - userInput = hostInputChannels[0].data; - destBytePtr = (unsigned char *)hostInputChannels[0].data; - } + /* determine if processing of host buffer can be done directly by callback */ + if( bp->inputConverter == paConverters.Copy_16_To_16 || + bp->inputConverter == paConverters.Copy_32_To_32 || + bp->inputConverter == paConverters.Copy_24_To_24 || + bp->inputConverter == paConverters.Copy_8_To_8 ) + { + /* allow when interlieved buffers both on user and host sides */ + if( bp->hostInputFrameCount[0] && !bp->hostInputFrameCount[1] && + bp->hostInputIsInterleaved[0] ) + { + /* process host buffer directly */ + userInput = hostInputChannels[0].data; + destBytePtr = (unsigned char *)hostInputChannels[0].data; + } + } } else /* user input is not interleaved */ { @@ -817,17 +830,22 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, { if( bp->userOutputIsInterleaved ) { - userOutput = bp->tempOutputBuffer; - - /* determine if processing of host buffer can be done directly by callback */ - if( bp->outputConverter == paConverters.Copy_8_To_8 || - bp->outputConverter == paConverters.Copy_16_To_16 || - bp->outputConverter == paConverters.Copy_24_To_24 || - bp->outputConverter == paConverters.Copy_32_To_32 ) - { - /* process host buffer directly */ - userOutput = hostOutputChannels[0].data; - } + userOutput = bp->tempOutputBuffer; + + /* determine if processing of host buffer can be done directly by callback */ + if( bp->outputConverter == paConverters.Copy_16_To_16 || + bp->outputConverter == paConverters.Copy_32_To_32 || + bp->outputConverter == paConverters.Copy_24_To_24 || + bp->outputConverter == paConverters.Copy_8_To_8 ) + { + /* allow when interlieved buffers both on user and host sides */ + if( bp->hostOutputFrameCount[0] && !bp->hostOutputFrameCount[1] && + bp->hostOutputIsInterleaved[0] ) + { + /* process host buffer directly */ + userOutput = hostOutputChannels[0].data; + } + } } else /* user output is not interleaved */ { diff --git a/src/common/pa_process.h b/src/common/pa_process.h index 9aef25e..3bfd4e5 100644 --- a/src/common/pa_process.h +++ b/src/common/pa_process.h @@ -287,12 +287,14 @@ typedef struct { PaStreamCallbackFlags callbackStatusFlags; + int hostInputIsInterleaved[2]; unsigned long hostInputFrameCount[2]; PaUtilChannelDescriptor *hostInputChannels[2]; /**< pointers to arrays of channel descriptors. pointers are NULL for half-duplex output processing. hostInputChannels[i].data is NULL when the caller calls PaUtil_SetNoInput() */ + int hostOutputIsInterleaved[2]; unsigned long hostOutputFrameCount[2]; PaUtilChannelDescriptor *hostOutputChannels[2]; /**< pointers to arrays of channel descriptors. pointers are NULL for half-duplex input processing. -- 2.43.0