mirror of https://github.com/OpenRCT2/OpenRCT2.git
Make effect buffer lazy and dynamic
This commit is contained in:
parent
7d16685d58
commit
324dea94bc
|
@ -618,7 +618,6 @@ class AudioMixer : public IAudioMixer
|
||||||
private:
|
private:
|
||||||
SDL_AudioDeviceID deviceid = 0;
|
SDL_AudioDeviceID deviceid = 0;
|
||||||
AudioFormat format = { 0 };
|
AudioFormat format = { 0 };
|
||||||
uint8 * effectbuffer = nullptr;
|
|
||||||
std::list<IAudioChannel *> channels;
|
std::list<IAudioChannel *> channels;
|
||||||
Source_Null source_null;
|
Source_Null source_null;
|
||||||
float volume = 1.0f;
|
float volume = 1.0f;
|
||||||
|
@ -634,6 +633,8 @@ private:
|
||||||
size_t _channelBufferCapacity = 0;
|
size_t _channelBufferCapacity = 0;
|
||||||
void * _convertBuffer = nullptr;
|
void * _convertBuffer = nullptr;
|
||||||
size_t _convertBufferCapacity = 0;
|
size_t _convertBufferCapacity = 0;
|
||||||
|
void * _effectBuffer = nullptr;
|
||||||
|
size_t _effectBufferCapacity = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AudioMixer()
|
AudioMixer()
|
||||||
|
@ -677,7 +678,6 @@ public:
|
||||||
delete source_sample;
|
delete source_sample;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
effectbuffer = new uint8[(have.samples * format.BytesPerSample() * format.channels)];
|
|
||||||
SDL_PauseAudioDevice(deviceid, 0);
|
SDL_PauseAudioDevice(deviceid, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -702,12 +702,9 @@ public:
|
||||||
musicsources[i] = 0;
|
musicsources[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (effectbuffer) {
|
|
||||||
delete[] effectbuffer;
|
|
||||||
effectbuffer = 0;
|
|
||||||
}
|
|
||||||
SafeFree(_channelBuffer);
|
SafeFree(_channelBuffer);
|
||||||
SafeFree(_convertBuffer);
|
SafeFree(_convertBuffer);
|
||||||
|
SafeFree(_effectBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Lock() override
|
void Lock() override
|
||||||
|
@ -873,7 +870,6 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply effects
|
// Apply effects
|
||||||
bool effectbufferloaded = false;
|
|
||||||
if (rate != 1 && format.format == AUDIO_S16SYS)
|
if (rate != 1 && format.format == AUDIO_S16SYS)
|
||||||
{
|
{
|
||||||
int in_len = (int)((double)bufferLen / samplesize);
|
int in_len = (int)((double)bufferLen / samplesize);
|
||||||
|
@ -895,10 +891,22 @@ private:
|
||||||
// reached end of stream so we cant use buffer length as resampling ratio
|
// reached end of stream so we cant use buffer length as resampling ratio
|
||||||
speex_resampler_set_rate(resampler, format.freq, (int)(format.freq * (1 / rate)));
|
speex_resampler_set_rate(resampler, format.freq, (int)(format.freq * (1 / rate)));
|
||||||
}
|
}
|
||||||
speex_resampler_process_interleaved_int(resampler, (const spx_int16_t*)buffer, (spx_uint32_t*)&in_len, (spx_int16_t*)effectbuffer, (spx_uint32_t*)&out_len);
|
|
||||||
effectbufferloaded = true;
|
size_t effectBufferReqLen = out_len * samplesize;
|
||||||
buffer = effectbuffer;
|
if (_effectBuffer == nullptr || _effectBufferCapacity < effectBufferReqLen)
|
||||||
bufferLen = (out_len * samplesize);
|
{
|
||||||
|
_effectBuffer = realloc(_effectBuffer, effectBufferReqLen);
|
||||||
|
_effectBufferCapacity = effectBufferReqLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
speex_resampler_process_interleaved_int(
|
||||||
|
resampler,
|
||||||
|
(const spx_int16_t *)buffer,
|
||||||
|
(spx_uint32_t *)&in_len,
|
||||||
|
(spx_int16_t *)_effectBuffer,
|
||||||
|
(spx_uint32_t *)&out_len);
|
||||||
|
buffer = _effectBuffer;
|
||||||
|
bufferLen = effectBufferReqLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplyPan(channel, buffer, bufferLen, samplesize);
|
ApplyPan(channel, buffer, bufferLen, samplesize);
|
||||||
|
|
Loading…
Reference in New Issue