Properly handle game pause in VideoPlayer
This commit is contained in:
parent
295a79c125
commit
e69f3d527c
@ -174,6 +174,28 @@ void VideoStreamPlayer::_notification(int p_notification) {
|
||||
Size2 s = expand ? get_size() : texture->get_size();
|
||||
draw_texture_rect(texture, Rect2(Point2(), s), false);
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_PAUSED: {
|
||||
if (is_playing() && !is_paused()) {
|
||||
paused_from_tree = true;
|
||||
if (playback.is_valid()) {
|
||||
playback->set_paused(true);
|
||||
set_process_internal(false);
|
||||
}
|
||||
last_audio_time = 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_UNPAUSED: {
|
||||
if (paused_from_tree) {
|
||||
paused_from_tree = false;
|
||||
if (playback.is_valid()) {
|
||||
playback->set_paused(false);
|
||||
set_process_internal(true);
|
||||
}
|
||||
last_audio_time = 0;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -255,6 +277,10 @@ void VideoStreamPlayer::play() {
|
||||
playback->play();
|
||||
set_process_internal(true);
|
||||
last_audio_time = 0;
|
||||
|
||||
if (!can_process()) {
|
||||
_notification(NOTIFICATION_PAUSED);
|
||||
}
|
||||
}
|
||||
|
||||
void VideoStreamPlayer::stop() {
|
||||
@ -281,6 +307,14 @@ bool VideoStreamPlayer::is_playing() const {
|
||||
|
||||
void VideoStreamPlayer::set_paused(bool p_paused) {
|
||||
paused = p_paused;
|
||||
if (!p_paused && !can_process()) {
|
||||
paused_from_tree = true;
|
||||
return;
|
||||
} else if (p_paused && paused_from_tree) {
|
||||
paused_from_tree = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (playback.is_valid()) {
|
||||
playback->set_paused(p_paused);
|
||||
set_process_internal(!p_paused);
|
||||
|
@ -60,6 +60,7 @@ class VideoStreamPlayer : public Control {
|
||||
int wait_resampler_limit = 2;
|
||||
|
||||
bool paused = false;
|
||||
bool paused_from_tree = false;
|
||||
bool autoplay = false;
|
||||
float volume = 1.0;
|
||||
double last_audio_time = 0.0;
|
||||
|
Loading…
Reference in New Issue
Block a user