diff options
| author | Marcus Tomlinson <themarcustomlinson@gmail.com> | 2017-04-22 19:14:49 +0200 |
|---|---|---|
| committer | Marcus Tomlinson <themarcustomlinson@gmail.com> | 2017-04-22 19:14:49 +0200 |
| commit | 706a281ea84117da2e1afb32e82ed824fc787268 (patch) | |
| tree | 8a043dcbdc31073fa41e605425a9842567f3480f /RtAudio.cpp | |
| parent | dc20fccbbec601cca84adb248d0c9550471990fc (diff) | |
Tabs -> Spaces
Diffstat (limited to 'RtAudio.cpp')
| -rw-r--r-- | RtAudio.cpp | 264 |
1 files changed, 132 insertions, 132 deletions
diff --git a/RtAudio.cpp b/RtAudio.cpp index cdb98d7..9ebe49d 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -3860,138 +3860,138 @@ 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 )
-{
- // calculate the new outSampleCount and relative sampleStep
- 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 );
-
- // if inSampleRate is a multiple of outSampleRate (or vice versa) there's no need to interpolate
- 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;
-
- switch (format)
- {
- case RTAUDIO_SINT8:
- 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));
- break;
- case RTAUDIO_SINT24:
- 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));
- break;
- case RTAUDIO_FLOAT32:
- 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));
- break;
- }
-
- // jump to next in sample
- inSampleFraction += sampleStep;
- }
- }
- else // else interpolate
- {
- // 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;
-
- switch (format)
- {
- case RTAUDIO_SINT8:
- {
- 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;
- }
- break;
- }
- case RTAUDIO_SINT16:
- {
- 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;
- }
- break;
- }
- case RTAUDIO_SINT24:
- {
- 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;
- }
- break;
- }
- case RTAUDIO_SINT32:
- {
- 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;
- }
- break;
- }
- case RTAUDIO_FLOAT32:
- {
- 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;
- }
- break;
- }
- case RTAUDIO_FLOAT64:
- {
- 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;
- }
- break;
- }
- }
-
- // jump to next in sample
- inSampleFraction += sampleStep;
- }
- }
+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 sampleStep = 1.0f / sampleRatio;
+ float inSampleFraction = 0.0f;
+
+ 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)
+ {
+ // 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;
+
+ switch (format)
+ {
+ case RTAUDIO_SINT8:
+ 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));
+ break;
+ case RTAUDIO_SINT24:
+ 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));
+ break;
+ case RTAUDIO_FLOAT32:
+ 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));
+ break;
+ }
+
+ // jump to next in sample
+ inSampleFraction += sampleStep;
+ }
+ }
+ else // else interpolate
+ {
+ // 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;
+
+ switch (format)
+ {
+ case RTAUDIO_SINT8:
+ {
+ 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;
+ }
+ break;
+ }
+ case RTAUDIO_SINT16:
+ {
+ 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;
+ }
+ break;
+ }
+ case RTAUDIO_SINT24:
+ {
+ 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;
+ }
+ break;
+ }
+ case RTAUDIO_SINT32:
+ {
+ 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;
+ }
+ break;
+ }
+ case RTAUDIO_FLOAT32:
+ {
+ 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;
+ }
+ break;
+ }
+ case RTAUDIO_FLOAT64:
+ {
+ 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;
+ }
+ break;
+ }
+ }
+
+ // jump to next in sample
+ inSampleFraction += sampleStep;
+ }
+ }
}
//-----------------------------------------------------------------------------
|
