summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2019-04-27 14:05:16 -0300
committerJuan Linietsky <reduzio@gmail.com>2019-04-27 14:05:16 -0300
commitc2027c82334c680e078dae5deb29f4f8e2d64ca2 (patch)
tree77db8701d0be656bedebb0f0cb3a66bb86ceb420
parent040b59c010f3cce63b4c45956c418b74079e24e6 (diff)
Added functions to further improve music timing
-rw-r--r--scene/audio/audio_stream_player.cpp18
-rw-r--r--scene/audio/audio_stream_player.h3
-rw-r--r--servers/audio_server.cpp11
-rw-r--r--servers/audio_server.h1
4 files changed, 31 insertions, 2 deletions
diff --git a/scene/audio/audio_stream_player.cpp b/scene/audio/audio_stream_player.cpp
index e52671139a..b326049458 100644
--- a/scene/audio/audio_stream_player.cpp
+++ b/scene/audio/audio_stream_player.cpp
@@ -94,6 +94,7 @@ void AudioStreamPlayer::_mix_internal(bool p_fadeout) {
//set volume for next mix
mix_volume_db = target_volume;
+ time_mixed += double(buffer_size) / AudioServer::get_singleton()->get_mix_rate();
_mix_to_bus(buffer,buffer_size);
}
@@ -122,17 +123,23 @@ void AudioStreamPlayer::_mix_audio() {
_mix_internal(true);
stream_playback->stop();
setstop=false;
- } else if (setseek >= 0.0) {
+ }
+
+ if (setseek >= 0.0 && !stop_has_priority) {
if (stream_playback->is_playing()) {
//fade out to avoid pops
_mix_internal(true);
+ } else {
+ time_mixed=0;
}
stream_playback->start(setseek);
setseek = -1.0; //reset seek
mix_volume_db = volume_db; //reset ramp
}
+ stop_has_priority = false;
+
_mix_internal(false);
}
@@ -247,7 +254,7 @@ void AudioStreamPlayer::play(float p_from_pos) {
if (stream_playback.is_valid()) {
//mix_volume_db = volume_db; do not reset volume ramp here, can cause clicks
setseek = p_from_pos;
- setstop = false;
+ stop_has_priority=false;
active = true;
set_process_internal(true);
}
@@ -264,6 +271,7 @@ void AudioStreamPlayer::stop() {
if (stream_playback.is_valid() && active) {
setstop=true;
+ stop_has_priority=true;
}
}
@@ -285,6 +293,10 @@ float AudioStreamPlayer::get_playback_position() {
return 0;
}
+float AudioStreamPlayer::get_mix_time() const {
+ return time_mixed;
+}
+
void AudioStreamPlayer::set_bus(const StringName &p_bus) {
//if audio is active, must lock this
@@ -388,6 +400,7 @@ void AudioStreamPlayer::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_playing"), &AudioStreamPlayer::is_playing);
ClassDB::bind_method(D_METHOD("get_playback_position"), &AudioStreamPlayer::get_playback_position);
+ ClassDB::bind_method(D_METHOD("get_mix_time"), &AudioStreamPlayer::get_mix_time);
ClassDB::bind_method(D_METHOD("set_bus", "bus"), &AudioStreamPlayer::set_bus);
ClassDB::bind_method(D_METHOD("get_bus"), &AudioStreamPlayer::get_bus);
@@ -438,6 +451,7 @@ AudioStreamPlayer::AudioStreamPlayer() {
fadeout_buffer.resize(512);
setstop=false;
use_fadeout=false;
+ time_mixed = 0;
AudioServer::get_singleton()->connect("bus_layout_changed", this, "_bus_layout_changed");
}
diff --git a/scene/audio/audio_stream_player.h b/scene/audio/audio_stream_player.h
index 36a437c616..5ff2fdf06c 100644
--- a/scene/audio/audio_stream_player.h
+++ b/scene/audio/audio_stream_player.h
@@ -52,11 +52,13 @@ private:
Vector<AudioFrame> fadeout_buffer;
bool use_fadeout;
+ double time_mixed;
volatile float setseek;
volatile bool active;
volatile bool setstop;
+ volatile bool stop_has_priority;
float mix_volume_db;
float pitch_scale;
@@ -98,6 +100,7 @@ public:
void stop();
bool is_playing() const;
float get_playback_position();
+ float get_mix_time() const;
void set_bus(const StringName &p_bus);
StringName get_bus() const;
diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp
index 604d500fb3..fc3ecedd03 100644
--- a/servers/audio_server.cpp
+++ b/servers/audio_server.cpp
@@ -73,6 +73,11 @@ void AudioDriver::update_mix_time(int p_frames) {
_last_mix_time = OS::get_singleton()->get_ticks_usec();
}
+double AudioDriver::get_time_since_last_mix() const {
+
+ return (OS::get_singleton()->get_ticks_usec() - _last_mix_time) / 1000000.0;
+}
+
double AudioDriver::get_time_to_next_mix() const {
double total = (OS::get_singleton()->get_ticks_usec() - _last_mix_time) / 1000000.0;
@@ -1110,6 +1115,11 @@ double AudioServer::get_time_to_next_mix() const {
return AudioDriver::get_singleton()->get_time_to_next_mix();
}
+double AudioServer::get_time_since_last_mix() const {
+
+ return AudioDriver::get_singleton()->get_time_since_last_mix();
+}
+
AudioServer *AudioServer::singleton = NULL;
void *AudioServer::audio_data_alloc(uint32_t p_data_len, const uint8_t *p_from_data) {
@@ -1352,6 +1362,7 @@ void AudioServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_device", "device"), &AudioServer::set_device);
ClassDB::bind_method(D_METHOD("get_time_to_next_mix"), &AudioServer::get_time_to_next_mix);
+ ClassDB::bind_method(D_METHOD("get_time_since_last_mix"), &AudioServer::get_time_since_last_mix);
ClassDB::bind_method(D_METHOD("get_output_latency"), &AudioServer::get_output_latency);
ClassDB::bind_method(D_METHOD("capture_get_device_list"), &AudioServer::capture_get_device_list);
diff --git a/servers/audio_server.h b/servers/audio_server.h
index 59ad4c1dc8..e56d87ce84 100644
--- a/servers/audio_server.h
+++ b/servers/audio_server.h
@@ -357,6 +357,7 @@ public:
virtual double get_output_latency() const;
virtual double get_time_to_next_mix() const;
+ virtual double get_time_since_last_mix() const;
void *audio_data_alloc(uint32_t p_data_len, const uint8_t *p_from_data = NULL);
void audio_data_free(void *p_data);