mirror of
https://github.com/overte-org/overte.git
synced 2025-07-23 12:24:26 +02:00
disabled SIMD adds in AudioMixer for windows
This commit is contained in:
parent
1047ec7c87
commit
a1b2bf59e9
2 changed files with 34 additions and 2 deletions
|
@ -231,6 +231,12 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
delayBufferSample[0] = correctBufferSample[0] * weakChannelAmplitudeRatio;
|
delayBufferSample[0] = correctBufferSample[0] * weakChannelAmplitudeRatio;
|
||||||
delayBufferSample[1] = correctBufferSample[1] * weakChannelAmplitudeRatio;
|
delayBufferSample[1] = correctBufferSample[1] * weakChannelAmplitudeRatio;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
_clientSamples[s + goodChannelOffset] += correctBufferSample[0];
|
||||||
|
_clientSamples[s + goodChannelOffset + SINGLE_STEREO_OFFSET] += correctBufferSample[1];
|
||||||
|
_clientSamples[delayedChannelIndex] += delayBufferSample[0];
|
||||||
|
_clientSamples[delayedChannelIndex + SINGLE_STEREO_OFFSET] += delayBufferSample[1];
|
||||||
|
#else
|
||||||
__m64 bufferSamples = _mm_set_pi16(_clientSamples[s + goodChannelOffset],
|
__m64 bufferSamples = _mm_set_pi16(_clientSamples[s + goodChannelOffset],
|
||||||
_clientSamples[s + goodChannelOffset + SINGLE_STEREO_OFFSET],
|
_clientSamples[s + goodChannelOffset + SINGLE_STEREO_OFFSET],
|
||||||
_clientSamples[delayedChannelIndex],
|
_clientSamples[delayedChannelIndex],
|
||||||
|
@ -247,6 +253,7 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
_clientSamples[s + goodChannelOffset + SINGLE_STEREO_OFFSET] = shortResults[2];
|
_clientSamples[s + goodChannelOffset + SINGLE_STEREO_OFFSET] = shortResults[2];
|
||||||
_clientSamples[delayedChannelIndex] = shortResults[1];
|
_clientSamples[delayedChannelIndex] = shortResults[1];
|
||||||
_clientSamples[delayedChannelIndex + SINGLE_STEREO_OFFSET] = shortResults[0];
|
_clientSamples[delayedChannelIndex + SINGLE_STEREO_OFFSET] = shortResults[0];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following code is pretty gross and redundant, but AFAIK it's the best way to avoid
|
// The following code is pretty gross and redundant, but AFAIK it's the best way to avoid
|
||||||
|
@ -271,6 +278,13 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
while (i + 3 < numSamplesDelay) {
|
while (i + 3 < numSamplesDelay) {
|
||||||
// handle the first cases where we can MMX add four samples at once
|
// handle the first cases where we can MMX add four samples at once
|
||||||
int parentIndex = i * 2;
|
int parentIndex = i * 2;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
_clientSamples[parentIndex + delayedChannelOffset] += delayNextOutputStart[i] * attenuationAndWeakChannelRatio;
|
||||||
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] += delayNextOutputStart[i + 1] * attenuationAndWeakChannelRatio;
|
||||||
|
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset] += delayNextOutputStart[i + 2] * attenuationAndWeakChannelRatio;
|
||||||
|
_clientSamples[parentIndex + TRIPLE_STEREO_OFFSET + delayedChannelOffset] += delayNextOutputStart[i + 3] * attenuationAndWeakChannelRatio;
|
||||||
|
#else
|
||||||
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset],
|
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset],
|
||||||
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset],
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset],
|
||||||
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset],
|
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset],
|
||||||
|
@ -286,7 +300,8 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[2];
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[2];
|
||||||
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[1];
|
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[1];
|
||||||
_clientSamples[parentIndex + TRIPLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[0];
|
_clientSamples[parentIndex + TRIPLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[0];
|
||||||
|
#endif
|
||||||
|
|
||||||
// push the index
|
// push the index
|
||||||
i += 4;
|
i += 4;
|
||||||
}
|
}
|
||||||
|
@ -296,6 +311,11 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
if (i + 2 < numSamplesDelay) {
|
if (i + 2 < numSamplesDelay) {
|
||||||
// MMX add only three delayed samples
|
// MMX add only three delayed samples
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
_clientSamples[parentIndex + delayedChannelOffset] += delayNextOutputStart[i] * attenuationAndWeakChannelRatio;
|
||||||
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] += delayNextOutputStart[i + 1] * attenuationAndWeakChannelRatio;
|
||||||
|
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset] += delayNextOutputStart[i + 2] * attenuationAndWeakChannelRatio;
|
||||||
|
#else
|
||||||
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset],
|
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset],
|
||||||
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset],
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset],
|
||||||
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset],
|
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset],
|
||||||
|
@ -310,8 +330,15 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
_clientSamples[parentIndex + delayedChannelOffset] = shortResults[3];
|
_clientSamples[parentIndex + delayedChannelOffset] = shortResults[3];
|
||||||
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[2];
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[2];
|
||||||
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[1];
|
_clientSamples[parentIndex + DOUBLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
} else if (i + 1 < numSamplesDelay) {
|
} else if (i + 1 < numSamplesDelay) {
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
_clientSamples[parentIndex + delayedChannelOffset] += delayNextOutputStart[i] * attenuationAndWeakChannelRatio;
|
||||||
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] += delayNextOutputStart[i + 1] * attenuationAndWeakChannelRatio;
|
||||||
|
#else
|
||||||
// MMX add two delayed samples
|
// MMX add two delayed samples
|
||||||
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset],
|
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset],
|
||||||
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset],
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset],
|
||||||
|
@ -324,9 +351,12 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
|
|
||||||
_clientSamples[parentIndex + delayedChannelOffset] = shortResults[3];
|
_clientSamples[parentIndex + delayedChannelOffset] = shortResults[3];
|
||||||
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[2];
|
_clientSamples[parentIndex + SINGLE_STEREO_OFFSET + delayedChannelOffset] = shortResults[2];
|
||||||
|
#endif
|
||||||
} else if (i < numSamplesDelay) {
|
} else if (i < numSamplesDelay) {
|
||||||
// MMX add a single delayed sample
|
// MMX add a single delayed sample
|
||||||
|
#ifdef _WIN32
|
||||||
|
_clientSamples[parentIndex + delayedChannelOffset] += delayNextOutputStart[i] * attenuationAndWeakChannelRatio;
|
||||||
|
#else
|
||||||
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset], 0, 0, 0);
|
__m64 bufferSamples = _mm_set_pi16(_clientSamples[parentIndex + delayedChannelOffset], 0, 0, 0);
|
||||||
__m64 addSamples = _mm_set_pi16(delayNextOutputStart[i] * attenuationAndWeakChannelRatio, 0, 0, 0);
|
__m64 addSamples = _mm_set_pi16(delayNextOutputStart[i] * attenuationAndWeakChannelRatio, 0, 0, 0);
|
||||||
|
|
||||||
|
@ -334,6 +364,7 @@ void AudioMixer::addBufferToMixForListeningNodeWithBuffer(PositionalAudioRingBuf
|
||||||
int16_t* shortResults = reinterpret_cast<int16_t*>(&mmxResult);
|
int16_t* shortResults = reinterpret_cast<int16_t*>(&mmxResult);
|
||||||
|
|
||||||
_clientSamples[parentIndex + delayedChannelOffset] = shortResults[3];
|
_clientSamples[parentIndex + delayedChannelOffset] = shortResults[3];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -149,6 +149,7 @@ void PositionalAudioRingBuffer::updateNextOutputTrailingLoudness() {
|
||||||
// fixes bug on Windows where _nextOutputTrailingLoudness sometimes becomes NaN. In that case,
|
// fixes bug on Windows where _nextOutputTrailingLoudness sometimes becomes NaN. In that case,
|
||||||
// revert _nextOutputTrailingLoudness to its previous value
|
// revert _nextOutputTrailingLoudness to its previous value
|
||||||
if (isNaN(_nextOutputTrailingLoudness)) {
|
if (isNaN(_nextOutputTrailingLoudness)) {
|
||||||
|
printf("next output trailling loudness NaN!! --------------------------------------\n");
|
||||||
_nextOutputTrailingLoudness = oldNextOutputTrailingLoudness;
|
_nextOutputTrailingLoudness = oldNextOutputTrailingLoudness;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue