Some optimisation
authorMarcus Tomlinson <themarcustomlinson@gmail.com>
Sat, 22 Apr 2017 18:32:42 +0000 (20:32 +0200)
committerMarcus Tomlinson <themarcustomlinson@gmail.com>
Sat, 22 Apr 2017 18:32:42 +0000 (20:32 +0200)
RtAudio.cpp

index 308a24471919d03e3e0a80842568e386da2d2087..5ab4c780c02675475932ff171db6bc4e16a56beb 100644 (file)
@@ -3917,72 +3917,81 @@ void convertBufferWasapi( char* outBuffer,
     for ( unsigned int outSample = 0; outSample < outSampleCount; outSample++ )\r
     {\r
       unsigned int inSample = ( unsigned int ) inSampleFraction;\r
+      float inSampleDec = inSampleFraction - inSample;\r
+      unsigned int frameInSample = inSample * channelCount;\r
+      unsigned int frameOutSample = outSample * channelCount;\r
 \r
       switch ( format )\r
       {\r
         case RTAUDIO_SINT8:\r
         {\r
+          char* convInBuffer = ( char* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            char fromSample = ( ( char* ) inBuffer )[ ( inSample * channelCount ) + channel ];\r
-            char toSample = ( ( char* ) inBuffer )[ ( ( inSample + 1 ) * channelCount ) + channel ];\r
-            float sampleDiff = ( toSample - fromSample ) * ( inSampleFraction - inSample );\r
-            ( ( char* ) outBuffer )[ ( outSample * channelCount ) + channel ] = fromSample + ( char ) sampleDiff;\r
+            char fromSample = convInBuffer[ frameInSample + channel ];\r
+            char toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            char sampleDiff = ( char ) ( ( toSample - fromSample ) * inSampleDec );\r
+            ( ( char* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
           break;\r
         }\r
         case RTAUDIO_SINT16:\r
         {\r
+          short* convInBuffer = ( short* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            short fromSample = ( ( short* ) inBuffer )[ ( inSample * channelCount ) + channel ];\r
-            short toSample = ( ( short* ) inBuffer )[ ( ( inSample + 1 ) * channelCount ) + channel ];\r
-            float sampleDiff = ( toSample - fromSample ) * ( inSampleFraction - inSample );\r
-            ( ( short* ) outBuffer )[ ( outSample * channelCount ) + channel ] = fromSample + ( short ) sampleDiff;\r
+            short fromSample = convInBuffer[ frameInSample + channel ];\r
+            short toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            short sampleDiff = ( short ) ( ( toSample - fromSample ) * inSampleDec );\r
+            ( ( short* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
           break;\r
         }\r
         case RTAUDIO_SINT24:\r
         {\r
+          S24* convInBuffer = ( S24* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            int fromSample = ( ( S24* ) inBuffer )[ ( inSample * channelCount ) + channel ].asInt();\r
-            int toSample = ( ( S24* ) inBuffer )[ ( ( inSample + 1 ) * channelCount ) + channel ].asInt();\r
-            float sampleDiff = ( toSample - fromSample ) * ( inSampleFraction - inSample );\r
-            ( ( S24* ) outBuffer )[ ( outSample * channelCount ) + channel ] = fromSample + ( int ) sampleDiff;\r
+            int fromSample = convInBuffer[ frameInSample + channel ].asInt();\r
+            int toSample = convInBuffer[ frameInSample + channelCount + channel ].asInt();\r
+            int sampleDiff = ( int ) ( ( toSample - fromSample ) * inSampleDec );\r
+            ( ( S24* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
           break;\r
         }\r
         case RTAUDIO_SINT32:\r
         {\r
+          int* convInBuffer = ( int* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            int fromSample = ( ( int* ) inBuffer )[ ( inSample * channelCount ) + channel ];\r
-            int toSample = ( ( int* ) inBuffer )[ ( ( inSample + 1 ) * channelCount ) + channel ];\r
-            float sampleDiff = ( toSample - fromSample ) * ( inSampleFraction - inSample );\r
-            ( ( int* ) outBuffer )[ ( outSample * channelCount ) + channel ] = fromSample + ( int ) sampleDiff;\r
+            int fromSample = convInBuffer[ frameInSample + channel ];\r
+            int toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            int sampleDiff = ( int ) ( ( toSample - fromSample ) * inSampleDec );\r
+            ( ( int* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
           break;\r
         }\r
         case RTAUDIO_FLOAT32:\r
         {\r
+          float* convInBuffer = ( float* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            float fromSample = ( ( float* ) inBuffer )[ ( inSample * channelCount ) + channel ];\r
-            float toSample = ( ( float* ) inBuffer )[ ( ( inSample + 1 ) * channelCount ) + channel ];\r
-            float sampleDiff = ( toSample - fromSample ) * ( inSampleFraction - inSample );\r
-            ( ( float* ) outBuffer )[ ( outSample * channelCount ) + channel ] = fromSample + sampleDiff;\r
+            float fromSample = convInBuffer[ frameInSample + channel ];\r
+            float toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            float sampleDiff = ( toSample - fromSample ) * inSampleDec;\r
+            ( ( float* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
           break;\r
         }\r
         case RTAUDIO_FLOAT64:\r
         {\r
+          double* convInBuffer = ( double* ) inBuffer;\r
           for ( unsigned int channel = 0; channel < channelCount; channel++ )\r
           {\r
-            double fromSample = ( ( double* ) inBuffer )[ ( inSample * channelCount ) + channel ];\r
-            double toSample = ( ( double* ) inBuffer )[ ( ( inSample + 1 ) * channelCount ) + channel ];\r
-            double sampleDiff = ( toSample - fromSample ) * ( inSampleFraction - inSample );\r
-            ( ( double* ) outBuffer )[ ( outSample * channelCount ) + channel ] = fromSample + sampleDiff;\r
+            double fromSample = convInBuffer[ frameInSample + channel ];\r
+            double toSample = convInBuffer[ frameInSample + channelCount + channel ];\r
+            double sampleDiff = ( toSample - fromSample ) * inSampleDec;\r
+            ( ( double* ) outBuffer )[ frameOutSample + channel ] = fromSample + sampleDiff;\r
           }\r
           break;\r
         }\r