diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2022-06-22 23:33:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-22 23:33:51 +0200 |
commit | d1dac8427a6a41e8fc0a76807887a57a8fe6fd10 (patch) | |
tree | 8d23b28484ab0712abeeb2e6134f4ed9ceba36cc /servers/audio | |
parent | e9ca15b6a6788fd739e85ba3f6ed3ee21c246257 (diff) | |
parent | afd2bbaa5f8bda7ad1e830d75d80fbdffbbd08ec (diff) |
Merge pull request #55846 from ellenhp/fix_ogg_edge_cases
Fix ogg edge cases
Diffstat (limited to 'servers/audio')
-rw-r--r-- | servers/audio/audio_stream.cpp | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp index 3983bc5cb1..5d9a9e61dc 100644 --- a/servers/audio/audio_stream.cpp +++ b/servers/audio/audio_stream.cpp @@ -135,9 +135,10 @@ int AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, uint64_t mix_increment = uint64_t(((get_stream_sampling_rate() * p_rate_scale * playback_speed_scale) / double(target_rate)) * double(FP_LEN)); - int mixed_frames_total = p_frames; + int mixed_frames_total = -1; - for (int i = 0; i < p_frames; i++) { + int i; + for (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. @@ -147,7 +148,7 @@ int AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, AudioFrame y2 = internal_buffer[idx - 1]; AudioFrame y3 = internal_buffer[idx - 0]; - if (idx <= internal_buffer_end && idx >= internal_buffer_end && mixed_frames_total == p_frames) { + if (idx >= internal_buffer_end && mixed_frames_total == -1) { // The internal buffer ends somewhere in this range, and we haven't yet recorded the number of good frames we have. mixed_frames_total = i; } @@ -167,24 +168,20 @@ int AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, 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]; - if (is_playing()) { - int mixed_frames = _mix_internal(internal_buffer + 4, INTERNAL_BUFFER_LEN); - if (mixed_frames != INTERNAL_BUFFER_LEN) { - // internal_buffer[mixed_frames] is the first frame of silence. - internal_buffer_end = mixed_frames; - } else { - // The internal buffer does not contain the first frame of silence. - internal_buffer_end = -1; - } + int mixed_frames = _mix_internal(internal_buffer + 4, INTERNAL_BUFFER_LEN); + if (mixed_frames != INTERNAL_BUFFER_LEN) { + // internal_buffer[mixed_frames] is the first frame of silence. + internal_buffer_end = mixed_frames; } else { - //fill with silence, not playing - for (int j = 0; j < INTERNAL_BUFFER_LEN; ++j) { - internal_buffer[j + 4] = AudioFrame(0, 0); - } + // The internal buffer does not contain the first frame of silence. + internal_buffer_end = -1; } mix_offset -= (INTERNAL_BUFFER_LEN << FP_BITS); } } + if (mixed_frames_total == -1 && i == p_frames) { + mixed_frames_total = p_frames; + } return mixed_frames_total; } |