summaryrefslogtreecommitdiff
path: root/servers/audio/audio_stream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'servers/audio/audio_stream.cpp')
-rw-r--r--servers/audio/audio_stream.cpp22
1 files changed, 11 insertions, 11 deletions
diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp
index aec6932326..f3fa857682 100644
--- a/servers/audio/audio_stream.cpp
+++ b/servers/audio/audio_stream.cpp
@@ -48,27 +48,27 @@ void AudioStreamPlaybackResampled::_begin_resample() {
void AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) {
float target_rate = AudioServer::get_singleton()->get_mix_rate();
- float global_rate_scale = AudioServer::get_singleton()->get_global_rate_scale();
+ float playback_speed_scale = AudioServer::get_singleton()->get_playback_speed_scale();
- uint64_t mix_increment = uint64_t(((get_stream_sampling_rate() * p_rate_scale) / double(target_rate * global_rate_scale)) * double(FP_LEN));
+ uint64_t mix_increment = uint64_t(((get_stream_sampling_rate() * p_rate_scale * playback_speed_scale) / double(target_rate)) * double(FP_LEN));
for (int i = 0; i < p_frames; i++) {
uint32_t idx = CUBIC_INTERP_HISTORY + uint32_t(mix_offset >> FP_BITS);
- // 4 point, 4th order optimal resampling algorithm from: http://yehar.com/blog/wp-content/uploads/2009/08/deip.pdf
+ //standard cubic interpolation (great quality/performance ratio)
+ //this used to be moved to a LUT for greater performance, but nowadays CPU speed is generally faster than memory.
float mu = (mix_offset & FP_MASK) / float(FP_LEN);
AudioFrame y0 = internal_buffer[idx - 3];
AudioFrame y1 = internal_buffer[idx - 2];
AudioFrame y2 = internal_buffer[idx - 1];
AudioFrame y3 = internal_buffer[idx - 0];
- AudioFrame even1 = y2 + y1, odd1 = y2 - y1;
- AudioFrame even2 = y3 + y0, odd2 = y3 - y0;
- AudioFrame c0 = even1 * 0.46835497211269561 + even2 * 0.03164502784253309;
- AudioFrame c1 = odd1 * 0.56001293337091440 + odd2 * 0.14666238593949288;
- AudioFrame c2 = even1 * -0.250038759826233691 + even2 * 0.25003876124297131;
- AudioFrame c3 = odd1 * -0.49949850957839148 + odd2 * 0.16649935475113800;
- AudioFrame c4 = even1 * 0.00016095224137360 + even2 * -0.00016095810460478;
- p_buffer[i] = (((c4 * mu + c3) * mu + c2) * mu + c1) * mu + c0;
+ float mu2 = mu * mu;
+ AudioFrame a0 = 3 * y1 - 3 * y2 + y3 - y0;
+ AudioFrame a1 = 2 * y0 - 5 * y1 + 4 * y2 - y3;
+ AudioFrame a2 = y2 - y0;
+ AudioFrame a3 = 2 * y1;
+
+ p_buffer[i] = (a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3) / 2;
mix_offset += mix_increment;