unsigned int& outSampleCount,\r
const RtAudioFormat& format )\r
{\r
- // calculate the new outSampleCount and relative sampleStep\r
- float sampleRatio = ( float ) outSampleRate / inSampleRate;\r
- float sampleRatioInv = ( float ) 1 / sampleRatio;\r
- float sampleStep = 1.0f / sampleRatio;\r
- float inSampleFraction = 0.0f;\r
+ // calculate the new outSampleCount and relative sampleStep\r
+ float sampleRatio = ( float ) outSampleRate / inSampleRate;\r
+ float sampleRatioInv = ( float ) 1 / sampleRatio;\r
+ float sampleStep = 1.0f / sampleRatio;\r
+ float inSampleFraction = 0.0f;\r
\r
- outSampleCount = ( unsigned int ) roundf( inSampleCount * sampleRatio );\r
+ outSampleCount = ( unsigned int ) roundf( inSampleCount * sampleRatio );\r
\r
- // if inSampleRate is a multiple of outSampleRate (or vice versa) there's no need to interpolate\r
- if (floor( sampleRatio ) == sampleRatio || floor( sampleRatioInv ) == sampleRatioInv)\r
+ // if inSampleRate is a multiple of outSampleRate (or vice versa) there's no need to interpolate\r
+ if (floor( sampleRatio ) == sampleRatio || floor( sampleRatioInv ) == sampleRatioInv)\r
+ {\r
+ // frame-by-frame, copy each relative input sample into it's corresponding output sample\r
+ for (unsigned int outSample = 0; outSample < outSampleCount; outSample++)\r
{\r
- // frame-by-frame, copy each relative input sample into it's corresponding output sample\r
- for (unsigned int outSample = 0; outSample < outSampleCount; outSample++)\r
- {\r
- unsigned int inSample = ( unsigned int ) inSampleFraction;\r
-\r
- switch (format)\r
- {\r
- case RTAUDIO_SINT8:\r
- memcpy( &(( char* ) outBuffer)[outSample * channelCount], &(( char* ) inBuffer)[inSample * channelCount], channelCount * sizeof( char ) );\r
- break;\r
- case RTAUDIO_SINT16:\r
- memcpy( &(( short* ) outBuffer)[outSample * channelCount], &(( short* ) inBuffer)[inSample * channelCount], channelCount * sizeof( short ) );\r
- break;\r
- case RTAUDIO_SINT24:\r
- memcpy( &(( S24* ) outBuffer)[outSample * channelCount], &(( S24* ) inBuffer)[inSample * channelCount], channelCount * sizeof( S24 ) );\r
- break;\r
- case RTAUDIO_SINT32:\r
- memcpy( &(( int* ) outBuffer)[outSample * channelCount], &(( int* ) inBuffer)[inSample * channelCount], channelCount * sizeof( int ) );\r
- break;\r
- case RTAUDIO_FLOAT32:\r
- memcpy( &(( float* ) outBuffer)[outSample * channelCount], &(( float* ) inBuffer)[inSample * channelCount], channelCount * sizeof( float ) );\r
- break;\r
- case RTAUDIO_FLOAT64:\r
- memcpy( &(( double* ) outBuffer)[outSample * channelCount], &(( double* ) inBuffer)[inSample * channelCount], channelCount * sizeof( double ) );\r
- break;\r
- }\r
+ unsigned int inSample = ( unsigned int ) inSampleFraction;\r
\r
- // jump to next in sample\r
- inSampleFraction += sampleStep;\r
- }\r
+ switch (format)\r
+ {\r
+ case RTAUDIO_SINT8:\r
+ memcpy( &(( char* ) outBuffer)[outSample * channelCount], &(( char* ) inBuffer)[inSample * channelCount], channelCount * sizeof( char ) );\r
+ break;\r
+ case RTAUDIO_SINT16:\r
+ memcpy( &(( short* ) outBuffer)[outSample * channelCount], &(( short* ) inBuffer)[inSample * channelCount], channelCount * sizeof( short ) );\r
+ break;\r
+ case RTAUDIO_SINT24:\r
+ memcpy( &(( S24* ) outBuffer)[outSample * channelCount], &(( S24* ) inBuffer)[inSample * channelCount], channelCount * sizeof( S24 ) );\r
+ break;\r
+ case RTAUDIO_SINT32:\r
+ memcpy( &(( int* ) outBuffer)[outSample * channelCount], &(( int* ) inBuffer)[inSample * channelCount], channelCount * sizeof( int ) );\r
+ break;\r
+ case RTAUDIO_FLOAT32:\r
+ memcpy( &(( float* ) outBuffer)[outSample * channelCount], &(( float* ) inBuffer)[inSample * channelCount], channelCount * sizeof( float ) );\r
+ break;\r
+ case RTAUDIO_FLOAT64:\r
+ memcpy( &(( double* ) outBuffer)[outSample * channelCount], &(( double* ) inBuffer)[inSample * channelCount], channelCount * sizeof( double ) );\r
+ break;\r
+ }\r
+\r
+ // jump to next in sample\r
+ inSampleFraction += sampleStep;\r
}\r
- else // else interpolate\r
+ }\r
+ else // else interpolate\r
+ {\r
+ // frame-by-frame, copy each relative input sample into it's corresponding output sample\r
+ for (unsigned int outSample = 0; outSample < outSampleCount; outSample++)\r
{\r
- // frame-by-frame, copy each relative input sample into it's corresponding output sample\r
- for (unsigned int outSample = 0; outSample < outSampleCount; outSample++)\r
- {\r
- unsigned int inSample = ( unsigned int ) inSampleFraction;\r
-\r
- switch (format)\r
- {\r
- case RTAUDIO_SINT8:\r
- {\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 - floor( inSampleFraction ));\r
- (( char* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( char ) sampleDiff;\r
- }\r
- break;\r
- }\r
- case RTAUDIO_SINT16:\r
- {\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 - floor( inSampleFraction ));\r
- (( short* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( short ) sampleDiff;\r
- }\r
- break;\r
- }\r
- case RTAUDIO_SINT24:\r
- {\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 - floor( inSampleFraction ));\r
- (( S24* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( int ) sampleDiff;\r
- }\r
- break;\r
- }\r
- case RTAUDIO_SINT32:\r
- {\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 - floor( inSampleFraction ));\r
- (( int* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( int ) sampleDiff;\r
- }\r
- break;\r
- }\r
- case RTAUDIO_FLOAT32:\r
- {\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 - floor( inSampleFraction ));\r
- (( float* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;\r
- }\r
- break;\r
- }\r
- case RTAUDIO_FLOAT64:\r
- {\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 - floor( inSampleFraction ));\r
- (( double* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;\r
- }\r
- break;\r
- }\r
- }\r
+ unsigned int inSample = ( unsigned int ) inSampleFraction;\r
\r
- // jump to next in sample\r
- inSampleFraction += sampleStep;\r
+ switch (format)\r
+ {\r
+ case RTAUDIO_SINT8:\r
+ {\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 - floor( inSampleFraction ));\r
+ (( char* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( char ) sampleDiff;\r
+ }\r
+ break;\r
+ }\r
+ case RTAUDIO_SINT16:\r
+ {\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 - floor( inSampleFraction ));\r
+ (( short* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( short ) sampleDiff;\r
+ }\r
+ break;\r
+ }\r
+ case RTAUDIO_SINT24:\r
+ {\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 - floor( inSampleFraction ));\r
+ (( S24* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( int ) sampleDiff;\r
+ }\r
+ break;\r
+ }\r
+ case RTAUDIO_SINT32:\r
+ {\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 - floor( inSampleFraction ));\r
+ (( int* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( int ) sampleDiff;\r
}\r
+ break;\r
+ }\r
+ case RTAUDIO_FLOAT32:\r
+ {\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 - floor( inSampleFraction ));\r
+ (( float* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;\r
+ }\r
+ break;\r
+ }\r
+ case RTAUDIO_FLOAT64:\r
+ {\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 - floor( inSampleFraction ));\r
+ (( double* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ // jump to next in sample\r
+ inSampleFraction += sampleStep;\r
}\r
+ }\r
}\r
\r
//-----------------------------------------------------------------------------\r