]> Repos - portaudio/commitdiff
fixed processor optimization from previous release for non-interleaved host buffers...
authordmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Tue, 29 Jun 2010 20:58:15 +0000 (20:58 +0000)
committerdmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Tue, 29 Jun 2010 20:58:15 +0000 (20:58 +0000)
src/common/pa_process.c
src/common/pa_process.h

index 4ec007a921013beb934c31812b60ee840170d8c1..c346b43ff35848a41d0bfb494f3b81eb445f8dfe 100644 (file)
@@ -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 */
                 {
index 9aef25e0d4e842f377a03e6b6ab66be1f29399ae..3bfd4e54d627780620a854301ee9dec049a14b84 100644 (file)
@@ -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.