diff options
| author | Juan Linietsky | 2017-11-20 10:11:08 -0300 |
|---|---|---|
| committer | GitHub | 2017-11-20 10:11:08 -0300 |
| commit | 2e28bd602cc9a87a6989a65ece46f1b02153e418 (patch) | |
| tree | 386b60cd2159a34836790feffe9d5fd87c80adfe /modules/stb_vorbis/audio_stream_ogg_vorbis.cpp | |
| parent | 4d5b82811f23ad1f7a14c18e723611e2cb4a3311 (diff) | |
| download | godot-2e28bd602cc9a87a6989a65ece46f1b02153e418.tar.gz godot-2e28bd602cc9a87a6989a65ece46f1b02153e418.tar.zst godot-2e28bd602cc9a87a6989a65ece46f1b02153e418.zip | |
Diffstat (limited to 'modules/stb_vorbis/audio_stream_ogg_vorbis.cpp')
| -rw-r--r-- | modules/stb_vorbis/audio_stream_ogg_vorbis.cpp | 72 |
1 files changed, 16 insertions, 56 deletions
diff --git a/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp b/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp index 951fc002b..5c252bda8 100644 --- a/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp +++ b/modules/stb_vorbis/audio_stream_ogg_vorbis.cpp @@ -36,54 +36,36 @@ #include "thirdparty/misc/stb_vorbis.c" #pragma GCC diagnostic pop -#ifndef CLAMP -#define CLAMP(m_a, m_min, m_max) (((m_a) < (m_min)) ? (m_min) : (((m_a) > (m_max)) ? m_max : m_a)) -#endif - void AudioStreamPlaybackOGGVorbis::_mix_internal(AudioFrame *p_buffer, int p_frames) { ERR_FAIL_COND(!active); int todo = p_frames; - int start_buffer = 0; + while (todo && active) { - while (todo > 0 && active) { - float *buffer = (float *)p_buffer; - if (start_buffer > 0) { - buffer = (buffer + start_buffer * 2); - } - int mixed = stb_vorbis_get_samples_float_interleaved(ogg_stream, 2, buffer, todo * 2); + int mixed = stb_vorbis_get_samples_float_interleaved(ogg_stream, 2, (float *)p_buffer, todo * 2); if (vorbis_stream->channels == 1 && mixed > 0) { //mix mono to stereo - for (int i = start_buffer; i < mixed; i++) { + for (int i = 0; i < mixed; i++) { p_buffer[i].r = p_buffer[i].l; } } todo -= mixed; frames_mixed += mixed; - if (todo > 0) { + if (todo) { //end of file! if (vorbis_stream->loop) { - //loop to the loop_beginning - seek(vorbis_stream->loop_begin); + //loop + seek(vorbis_stream->loop_offset); loops++; - // we still have buffer to fill, start from this element in the next iteration. - start_buffer = p_frames - todo; } else { - for (int i = p_frames - todo; i < p_frames; i++) { + for (int i = mixed; i < p_frames; i++) { p_buffer[i] = AudioFrame(0, 0); } active = false; - todo = 0; } - } else if (vorbis_stream->loop && frames_mixed >= vorbis_stream->loop_end_frames) { - // We reached loop_end. Loop to loop_begin plus whatever extra length we already mixed - uint32_t frames_to_advance = uint32_t(frames_mixed - vorbis_stream->loop_end_frames); - float start_loop = vorbis_stream->loop_begin + (float(frames_to_advance) / vorbis_stream->sample_rate); - seek(start_loop); - loops++; } } } @@ -217,9 +199,6 @@ void AudioStreamOGGVorbis::set_data(const PoolVector<uint8_t> &p_data) { //print_line("succeeded "+itos(ogg_alloc.alloc_buffer_length_in_bytes)+" setup "+itos(info.setup_memory_required)+" setup temp "+itos(info.setup_temp_memory_required)+" temp "+itos(info.temp_memory_required)+" maxframe"+itos(info.max_frame_size)); length = stb_vorbis_stream_length_in_seconds(ogg_stream); - if (loop_end == 0) { - set_loop_end(length); - } stb_vorbis_close(ogg_stream); data = AudioServer::get_singleton()->audio_data_alloc(src_data_len, src_datar.ptr()); @@ -254,24 +233,12 @@ bool AudioStreamOGGVorbis::has_loop() const { return loop; } -void AudioStreamOGGVorbis::set_loop_begin(float p_seconds) { - p_seconds = CLAMP(p_seconds, 0, length); - loop_begin = p_seconds; - loop_begin_frames = uint32_t(sample_rate * p_seconds); -} - -float AudioStreamOGGVorbis::get_loop_begin() const { - return loop_begin; -} - -void AudioStreamOGGVorbis::set_loop_end(float p_seconds) { - p_seconds = CLAMP(p_seconds, 0, length); - loop_end = p_seconds; - loop_end_frames = uint32_t(sample_rate * p_seconds); +void AudioStreamOGGVorbis::set_loop_offset(float p_seconds) { + loop_offset = p_seconds; } -float AudioStreamOGGVorbis::get_loop_end() const { - return loop_end; +float AudioStreamOGGVorbis::get_loop_offset() const { + return loop_offset; } void AudioStreamOGGVorbis::_bind_methods() { @@ -282,16 +249,12 @@ void AudioStreamOGGVorbis::_bind_methods() { ClassDB::bind_method(D_METHOD("set_loop", "enable"), &AudioStreamOGGVorbis::set_loop); ClassDB::bind_method(D_METHOD("has_loop"), &AudioStreamOGGVorbis::has_loop); - ClassDB::bind_method(D_METHOD("set_loop_begin", "seconds"), &AudioStreamOGGVorbis::set_loop_begin); - ClassDB::bind_method(D_METHOD("get_loop_begin"), &AudioStreamOGGVorbis::get_loop_begin); - - ClassDB::bind_method(D_METHOD("set_loop_end", "seconds"), &AudioStreamOGGVorbis::set_loop_end); - ClassDB::bind_method(D_METHOD("get_loop_end"), &AudioStreamOGGVorbis::get_loop_end); + ClassDB::bind_method(D_METHOD("set_loop_offset", "seconds"), &AudioStreamOGGVorbis::set_loop_offset); + ClassDB::bind_method(D_METHOD("get_loop_offset"), &AudioStreamOGGVorbis::get_loop_offset); ADD_PROPERTY(PropertyInfo(Variant::POOL_BYTE_ARRAY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_data", "get_data"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "loop", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_loop", "has_loop"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "loop_begin", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_loop_begin", "get_loop_begin"); - ADD_PROPERTY(PropertyInfo(Variant::REAL, "loop_end", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_loop_end", "get_loop_end"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "loop_offset", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR), "set_loop_offset", "get_loop_offset"); } AudioStreamOGGVorbis::AudioStreamOGGVorbis() { @@ -300,10 +263,7 @@ AudioStreamOGGVorbis::AudioStreamOGGVorbis() { length = 0; sample_rate = 1; channels = 1; - loop_begin = 0; - loop_end = 0; - loop_begin_frames = 0; - loop_end_frames = 0; + loop_offset = 0; decode_mem_size = 0; - loop = true; + loop = false; } |
