diff options
Diffstat (limited to 'servers/audio/audio_stream.cpp')
-rw-r--r-- | servers/audio/audio_stream.cpp | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp index f4214838a1..5f77eb54f6 100644 --- a/servers/audio/audio_stream.cpp +++ b/servers/audio/audio_stream.cpp @@ -30,57 +30,53 @@ ////////////////////////////// - - void AudioStreamPlaybackResampled::_begin_resample() { //clear cubic interpolation history - internal_buffer[0]=AudioFrame(0.0,0.0); - internal_buffer[1]=AudioFrame(0.0,0.0); - internal_buffer[2]=AudioFrame(0.0,0.0); - internal_buffer[3]=AudioFrame(0.0,0.0); + internal_buffer[0] = AudioFrame(0.0, 0.0); + internal_buffer[1] = AudioFrame(0.0, 0.0); + internal_buffer[2] = AudioFrame(0.0, 0.0); + internal_buffer[3] = AudioFrame(0.0, 0.0); //mix buffer - _mix_internal(internal_buffer+4,INTERNAL_BUFFER_LEN); - mix_offset=0; + _mix_internal(internal_buffer + 4, INTERNAL_BUFFER_LEN); + mix_offset = 0; } -void AudioStreamPlaybackResampled::mix(AudioFrame* p_buffer,float p_rate_scale,int p_frames) { +void AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) { float target_rate = AudioServer::get_singleton()->get_mix_rate() * p_rate_scale; - uint64_t mix_increment = uint64_t((get_stream_sampling_rate() / double(target_rate)) * double( FP_LEN )); - - for(int i=0;i<p_frames;i++) { - + uint64_t mix_increment = uint64_t((get_stream_sampling_rate() / 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); //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]; + 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]; - float mu2 = mu*mu; + float mu2 = mu * mu; AudioFrame a0 = y3 - y2 - y0 + y1; AudioFrame a1 = y0 - y1 - a0; AudioFrame a2 = y2 - y0; AudioFrame a3 = y1; - p_buffer[i] = (a0*mu*mu2 + a1*mu2 + a2*mu + a3); + p_buffer[i] = (a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3); - mix_offset+=mix_increment; + mix_offset += mix_increment; - while ( (mix_offset >> FP_BITS) >= INTERNAL_BUFFER_LEN ) { + while ((mix_offset >> FP_BITS) >= INTERNAL_BUFFER_LEN) { - internal_buffer[0]=internal_buffer[INTERNAL_BUFFER_LEN+0]; - internal_buffer[1]=internal_buffer[INTERNAL_BUFFER_LEN+1]; - internal_buffer[2]=internal_buffer[INTERNAL_BUFFER_LEN+2]; - internal_buffer[3]=internal_buffer[INTERNAL_BUFFER_LEN+3]; - _mix_internal(internal_buffer+4,INTERNAL_BUFFER_LEN); - mix_offset-=(INTERNAL_BUFFER_LEN<<FP_BITS); + internal_buffer[0] = internal_buffer[INTERNAL_BUFFER_LEN + 0]; + internal_buffer[1] = internal_buffer[INTERNAL_BUFFER_LEN + 1]; + internal_buffer[2] = internal_buffer[INTERNAL_BUFFER_LEN + 2]; + internal_buffer[3] = internal_buffer[INTERNAL_BUFFER_LEN + 3]; + _mix_internal(internal_buffer + 4, INTERNAL_BUFFER_LEN); + mix_offset -= (INTERNAL_BUFFER_LEN << FP_BITS); } } } |