2 * Copyright (C) 2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "GUIPlaybackControl.h"
11 #include "ServiceBroker.h"
12 #include "games/dialogs/osd/DialogGameOSD.h"
13 #include "guilib/GUIComponent.h"
14 #include "guilib/GUIWindowManager.h"
17 using namespace RETRO
;
19 CGUIPlaybackControl::CGUIPlaybackControl(IPlaybackCallback
& callback
) : m_callback(callback
)
23 CGUIPlaybackControl::~CGUIPlaybackControl() = default;
25 void CGUIPlaybackControl::FrameMove()
27 CGUIComponent
* gui
= CServiceBroker::GetGUI();
31 const int windowId
= gui
->GetWindowManager().GetActiveWindow();
32 const int dialogId
= gui
->GetWindowManager().GetActiveWindowOrDialog();
34 // Check if game has entered fullscreen yet
35 const bool bFullscreen
= (windowId
== WINDOW_FULLSCREEN_GAME
);
37 // Check if game is in the OSD dialog
38 const bool bInMenu
= (dialogId
!= WINDOW_FULLSCREEN_GAME
);
40 // Check if game should play in the background of dialog
41 const bool bInBackground
= GAME::CDialogGameOSD::PlayInBackground(dialogId
);
43 GuiState nextState
= NextState(bFullscreen
, bInMenu
, bInBackground
);
44 if (nextState
!= m_state
)
48 double targetSpeed
= GetTargetSpeed(m_state
);
49 if (m_previousSpeed
!= targetSpeed
)
51 m_previousSpeed
= targetSpeed
;
52 m_callback
.SetPlaybackSpeed(targetSpeed
);
55 m_callback
.EnableInput(AcceptsInput(m_state
));
59 CGUIPlaybackControl::GuiState
CGUIPlaybackControl::NextState(bool bFullscreen
,
63 GuiState newState
= m_state
;
67 case GuiState::UNKNOWN
:
69 // Wait for game to enter fullscreen
71 newState
= GuiState::FULLSCREEN
;
74 case GuiState::FULLSCREEN
:
79 newState
= GuiState::MENU_PLAYING
;
81 newState
= GuiState::MENU_PAUSED
;
85 case GuiState::MENU_PAUSED
:
88 newState
= GuiState::FULLSCREEN
;
89 else if (bInBackground
)
90 newState
= GuiState::MENU_PLAYING
;
93 case GuiState::MENU_PLAYING
:
98 newState
= GuiState::FULLSCREEN
;
100 newState
= GuiState::MENU_PAUSED
;
111 double CGUIPlaybackControl::GetTargetSpeed(GuiState state
)
113 double targetSpeed
= 0.0;
117 case GuiState::FULLSCREEN
:
122 case GuiState::MENU_PAUSED
:
127 case GuiState::MENU_PLAYING
:
139 bool CGUIPlaybackControl::AcceptsInput(GuiState state
)
141 bool bEnableInput
= false;
145 case GuiState::FULLSCREEN
: