|
|
@@ -3860,50 +3860,50 @@ private: |
|
|
|
// between HW and the user. The convertBufferWasapi function is used to perform this conversion
|
|
|
|
// between HwIn->UserIn and UserOut->HwOut during the stream callback loop.
|
|
|
|
// This sample rate converter works best with conversions between one rate and its multiple.
|
|
|
|
void convertBufferWasapi(char* outBuffer,
|
|
|
|
const char* inBuffer,
|
|
|
|
const unsigned int& channelCount,
|
|
|
|
const unsigned int& inSampleRate,
|
|
|
|
const unsigned int& outSampleRate,
|
|
|
|
const unsigned int& inSampleCount,
|
|
|
|
unsigned int& outSampleCount,
|
|
|
|
const RtAudioFormat& format)
|
|
|
|
void convertBufferWasapi( char* outBuffer,
|
|
|
|
const char* inBuffer,
|
|
|
|
const unsigned int& channelCount,
|
|
|
|
const unsigned int& inSampleRate,
|
|
|
|
const unsigned int& outSampleRate,
|
|
|
|
const unsigned int& inSampleCount,
|
|
|
|
unsigned int& outSampleCount,
|
|
|
|
const RtAudioFormat& format )
|
|
|
|
{
|
|
|
|
// calculate the new outSampleCount and relative sampleStep
|
|
|
|
float sampleRatio = (float)outSampleRate / inSampleRate;
|
|
|
|
float sampleRatioInv = (float)1 / sampleRatio;
|
|
|
|
float sampleRatio = ( float ) outSampleRate / inSampleRate;
|
|
|
|
float sampleRatioInv = ( float ) 1 / sampleRatio;
|
|
|
|
float sampleStep = 1.0f / sampleRatio;
|
|
|
|
float inSampleFraction = 0.0f;
|
|
|
|
|
|
|
|
outSampleCount = (unsigned int)roundf(inSampleCount * sampleRatio);
|
|
|
|
outSampleCount = ( unsigned int ) roundf( inSampleCount * sampleRatio );
|
|
|
|
|
|
|
|
// if inSampleRate is a multiple of outSampleRate (or vice versa) there's no need to interpolate
|
|
|
|
if (floor(sampleRatio) == sampleRatio || floor(sampleRatioInv) == sampleRatioInv)
|
|
|
|
if (floor( sampleRatio ) == sampleRatio || floor( sampleRatioInv ) == sampleRatioInv)
|
|
|
|
{
|
|
|
|
// frame-by-frame, copy each relative input sample into it's corresponding output sample
|
|
|
|
for (unsigned int outSample = 0; outSample < outSampleCount; outSample++)
|
|
|
|
{
|
|
|
|
unsigned int inSample = (unsigned int)inSampleFraction;
|
|
|
|
unsigned int inSample = ( unsigned int ) inSampleFraction;
|
|
|
|
|
|
|
|
switch (format)
|
|
|
|
{
|
|
|
|
case RTAUDIO_SINT8:
|
|
|
|
memcpy(&((char*)outBuffer)[outSample * channelCount], &((char*)inBuffer)[inSample * channelCount], channelCount * sizeof(char));
|
|
|
|
memcpy( &(( char* ) outBuffer)[outSample * channelCount], &(( char* ) inBuffer)[inSample * channelCount], channelCount * sizeof( char ) );
|
|
|
|
break;
|
|
|
|
case RTAUDIO_SINT16:
|
|
|
|
memcpy(&((short*)outBuffer)[outSample * channelCount], &((short*)inBuffer)[inSample * channelCount], channelCount * sizeof(short));
|
|
|
|
memcpy( &(( short* ) outBuffer)[outSample * channelCount], &(( short* ) inBuffer)[inSample * channelCount], channelCount * sizeof( short ) );
|
|
|
|
break;
|
|
|
|
case RTAUDIO_SINT24:
|
|
|
|
memcpy(&((S24*)outBuffer)[outSample * channelCount], &((S24*)inBuffer)[inSample * channelCount], channelCount * sizeof(S24));
|
|
|
|
memcpy( &(( S24* ) outBuffer)[outSample * channelCount], &(( S24* ) inBuffer)[inSample * channelCount], channelCount * sizeof( S24 ) );
|
|
|
|
break;
|
|
|
|
case RTAUDIO_SINT32:
|
|
|
|
memcpy(&((int*)outBuffer)[outSample * channelCount], &((int*)inBuffer)[inSample * channelCount], channelCount * sizeof(int));
|
|
|
|
memcpy( &(( int* ) outBuffer)[outSample * channelCount], &(( int* ) inBuffer)[inSample * channelCount], channelCount * sizeof( int ) );
|
|
|
|
break;
|
|
|
|
case RTAUDIO_FLOAT32:
|
|
|
|
memcpy(&((float*)outBuffer)[outSample * channelCount], &((float*)inBuffer)[inSample * channelCount], channelCount * sizeof(float));
|
|
|
|
memcpy( &(( float* ) outBuffer)[outSample * channelCount], &(( float* ) inBuffer)[inSample * channelCount], channelCount * sizeof( float ) );
|
|
|
|
break;
|
|
|
|
case RTAUDIO_FLOAT64:
|
|
|
|
memcpy(&((double*)outBuffer)[outSample * channelCount], &((double*)inBuffer)[inSample * channelCount], channelCount * sizeof(double));
|
|
|
|
memcpy( &(( double* ) outBuffer)[outSample * channelCount], &(( double* ) inBuffer)[inSample * channelCount], channelCount * sizeof( double ) );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
@@ -3916,7 +3916,7 @@ void convertBufferWasapi(char* outBuffer, |
|
|
|
// frame-by-frame, copy each relative input sample into it's corresponding output sample
|
|
|
|
for (unsigned int outSample = 0; outSample < outSampleCount; outSample++)
|
|
|
|
{
|
|
|
|
unsigned int inSample = (unsigned int)inSampleFraction;
|
|
|
|
unsigned int inSample = ( unsigned int ) inSampleFraction;
|
|
|
|
|
|
|
|
switch (format)
|
|
|
|
{
|
|
|
@@ -3924,10 +3924,10 @@ void convertBufferWasapi(char* outBuffer, |
|
|
|
{
|
|
|
|
for (unsigned int channel = 0; channel < channelCount; channel++)
|
|
|
|
{
|
|
|
|
char fromSample = ((char*)inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
char toSample = ((char*)inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor(inSampleFraction));
|
|
|
|
((char*)outBuffer)[(outSample * channelCount) + channel] = fromSample + (char)sampleDiff;
|
|
|
|
char fromSample = (( char* ) inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
char toSample = (( char* ) inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor( inSampleFraction ));
|
|
|
|
(( char* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( char ) sampleDiff;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
@@ -3935,10 +3935,10 @@ void convertBufferWasapi(char* outBuffer, |
|
|
|
{
|
|
|
|
for (unsigned int channel = 0; channel < channelCount; channel++)
|
|
|
|
{
|
|
|
|
short fromSample = ((short*)inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
short toSample = ((short*)inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor(inSampleFraction));
|
|
|
|
((short*)outBuffer)[(outSample * channelCount) + channel] = fromSample + (short)sampleDiff;
|
|
|
|
short fromSample = (( short* ) inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
short toSample = (( short* ) inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor( inSampleFraction ));
|
|
|
|
(( short* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( short ) sampleDiff;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
@@ -3946,10 +3946,10 @@ void convertBufferWasapi(char* outBuffer, |
|
|
|
{
|
|
|
|
for (unsigned int channel = 0; channel < channelCount; channel++)
|
|
|
|
{
|
|
|
|
int fromSample = ((S24*)inBuffer)[(inSample * channelCount) + channel].asInt();
|
|
|
|
int toSample = ((S24*)inBuffer)[((inSample + 1) * channelCount) + channel].asInt();
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor(inSampleFraction));
|
|
|
|
((S24*)outBuffer)[(outSample * channelCount) + channel] = fromSample + (int)sampleDiff;
|
|
|
|
int fromSample = (( S24* ) inBuffer)[(inSample * channelCount) + channel].asInt();
|
|
|
|
int toSample = (( S24* ) inBuffer)[((inSample + 1) * channelCount) + channel].asInt();
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor( inSampleFraction ));
|
|
|
|
(( S24* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( int ) sampleDiff;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
@@ -3957,10 +3957,10 @@ void convertBufferWasapi(char* outBuffer, |
|
|
|
{
|
|
|
|
for (unsigned int channel = 0; channel < channelCount; channel++)
|
|
|
|
{
|
|
|
|
int fromSample = ((int*)inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
int toSample = ((int*)inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor(inSampleFraction));
|
|
|
|
((int*)outBuffer)[(outSample * channelCount) + channel] = fromSample + (int)sampleDiff;
|
|
|
|
int fromSample = (( int* ) inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
int toSample = (( int* ) inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor( inSampleFraction ));
|
|
|
|
(( int* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + ( int ) sampleDiff;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
@@ -3968,10 +3968,10 @@ void convertBufferWasapi(char* outBuffer, |
|
|
|
{
|
|
|
|
for (unsigned int channel = 0; channel < channelCount; channel++)
|
|
|
|
{
|
|
|
|
float fromSample = ((float*)inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
float toSample = ((float*)inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor(inSampleFraction));
|
|
|
|
((float*)outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;
|
|
|
|
float fromSample = (( float* ) inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
float toSample = (( float* ) inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
float sampleDiff = (toSample - fromSample) * (inSampleFraction - floor( inSampleFraction ));
|
|
|
|
(( float* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
@@ -3979,10 +3979,10 @@ void convertBufferWasapi(char* outBuffer, |
|
|
|
{
|
|
|
|
for (unsigned int channel = 0; channel < channelCount; channel++)
|
|
|
|
{
|
|
|
|
double fromSample = ((double*)inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
double toSample = ((double*)inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
double sampleDiff = (toSample - fromSample) * (inSampleFraction - floor(inSampleFraction));
|
|
|
|
((double*)outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;
|
|
|
|
double fromSample = (( double* ) inBuffer)[(inSample * channelCount) + channel];
|
|
|
|
double toSample = (( double* ) inBuffer)[((inSample + 1) * channelCount) + channel];
|
|
|
|
double sampleDiff = (toSample - fromSample) * (inSampleFraction - floor( inSampleFraction ));
|
|
|
|
(( double* ) outBuffer)[(outSample * channelCount) + channel] = fromSample + sampleDiff;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|