Convert Movie to a class with a static instance, and other fixes based on B3n30 feedback.
This commit is contained in:
parent
04541150b1
commit
0238e0c5e7
7 changed files with 129 additions and 81 deletions
|
@ -241,6 +241,7 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
if (!movie_record.empty() && !movie_play.empty()) {
|
if (!movie_record.empty() && !movie_play.empty()) {
|
||||||
LOG_CRITICAL(Frontend, "Cannot both play and record a movie");
|
LOG_CRITICAL(Frontend, "Cannot both play and record a movie");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_filter.ParseFilterString(Settings::values.log_filter);
|
log_filter.ParseFilterString(Settings::values.log_filter);
|
||||||
|
|
|
@ -161,7 +161,7 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
|
||||||
Service::Init();
|
Service::Init();
|
||||||
AudioCore::Init();
|
AudioCore::Init();
|
||||||
GDBStub::Init();
|
GDBStub::Init();
|
||||||
Movie::Init();
|
Movie::GetInstance().Init();
|
||||||
|
|
||||||
if (!VideoCore::Init(emu_window)) {
|
if (!VideoCore::Init(emu_window)) {
|
||||||
return ResultStatus::ErrorVideoCore;
|
return ResultStatus::ErrorVideoCore;
|
||||||
|
@ -187,7 +187,7 @@ void System::Shutdown() {
|
||||||
perf_results.frametime * 1000.0);
|
perf_results.frametime * 1000.0);
|
||||||
|
|
||||||
// Shutdown emulation session
|
// Shutdown emulation session
|
||||||
Movie::Shutdown();
|
Movie::GetInstance().Shutdown();
|
||||||
GDBStub::Shutdown();
|
GDBStub::Shutdown();
|
||||||
AudioCore::Shutdown();
|
AudioCore::Shutdown();
|
||||||
VideoCore::Shutdown();
|
VideoCore::Shutdown();
|
||||||
|
|
|
@ -138,7 +138,7 @@ static void UpdatePadCallback(u64 userdata, int cycles_late) {
|
||||||
s16 circle_pad_x = static_cast<s16>(circle_pad_x_f * MAX_CIRCLEPAD_POS);
|
s16 circle_pad_x = static_cast<s16>(circle_pad_x_f * MAX_CIRCLEPAD_POS);
|
||||||
s16 circle_pad_y = static_cast<s16>(circle_pad_y_f * MAX_CIRCLEPAD_POS);
|
s16 circle_pad_y = static_cast<s16>(circle_pad_y_f * MAX_CIRCLEPAD_POS);
|
||||||
|
|
||||||
Movie::HandlePadAndCircleStatus(state, circle_pad_x, circle_pad_y);
|
Core::Movie::GetInstance().HandlePadAndCircleStatus(state, circle_pad_x, circle_pad_y);
|
||||||
|
|
||||||
const DirectionState direction = GetStickDirectionState(circle_pad_x, circle_pad_y);
|
const DirectionState direction = GetStickDirectionState(circle_pad_x, circle_pad_y);
|
||||||
state.circle_up.Assign(direction.up);
|
state.circle_up.Assign(direction.up);
|
||||||
|
@ -185,7 +185,7 @@ static void UpdatePadCallback(u64 userdata, int cycles_late) {
|
||||||
touch_entry.y = static_cast<u16>(y * Core::kScreenBottomHeight);
|
touch_entry.y = static_cast<u16>(y * Core::kScreenBottomHeight);
|
||||||
touch_entry.valid.Assign(pressed ? 1 : 0);
|
touch_entry.valid.Assign(pressed ? 1 : 0);
|
||||||
|
|
||||||
Movie::HandleTouchStatus(touch_entry);
|
Core::Movie::GetInstance().HandleTouchStatus(touch_entry);
|
||||||
|
|
||||||
// TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which
|
// TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which
|
||||||
// supposedly is "Touch-screen entry, which contains the raw coordinate data prior to being
|
// supposedly is "Touch-screen entry, which contains the raw coordinate data prior to being
|
||||||
|
@ -225,7 +225,7 @@ static void UpdateAccelerometerCallback(u64 userdata, int cycles_late) {
|
||||||
accelerometer_entry.y = static_cast<s16>(accel.y);
|
accelerometer_entry.y = static_cast<s16>(accel.y);
|
||||||
accelerometer_entry.z = static_cast<s16>(accel.z);
|
accelerometer_entry.z = static_cast<s16>(accel.z);
|
||||||
|
|
||||||
Movie::HandleAccelerometerStatus(accelerometer_entry);
|
Core::Movie::GetInstance().HandleAccelerometerStatus(accelerometer_entry);
|
||||||
|
|
||||||
// Make up "raw" entry
|
// Make up "raw" entry
|
||||||
// TODO(wwylele):
|
// TODO(wwylele):
|
||||||
|
@ -265,7 +265,7 @@ static void UpdateGyroscopeCallback(u64 userdata, int cycles_late) {
|
||||||
gyroscope_entry.y = static_cast<s16>(gyro.y);
|
gyroscope_entry.y = static_cast<s16>(gyro.y);
|
||||||
gyroscope_entry.z = static_cast<s16>(gyro.z);
|
gyroscope_entry.z = static_cast<s16>(gyro.z);
|
||||||
|
|
||||||
Movie::HandleGyroscopeStatus(gyroscope_entry);
|
Core::Movie::GetInstance().HandleGyroscopeStatus(gyroscope_entry);
|
||||||
|
|
||||||
// Make up "raw" entry
|
// Make up "raw" entry
|
||||||
mem->gyroscope.raw_entry.x = gyroscope_entry.x;
|
mem->gyroscope.raw_entry.x = gyroscope_entry.x;
|
||||||
|
|
|
@ -194,7 +194,7 @@ void ExtraHID::SendHIDStatus() {
|
||||||
response.buttons.r_not_held.Assign(1);
|
response.buttons.r_not_held.Assign(1);
|
||||||
response.unknown = 0;
|
response.unknown = 0;
|
||||||
|
|
||||||
Movie::HandleExtraHidResponse(response);
|
Core::Movie::GetInstance().HandleExtraHidResponse(response);
|
||||||
|
|
||||||
std::vector<u8> response_buffer(sizeof(response));
|
std::vector<u8> response_buffer(sizeof(response));
|
||||||
memcpy(response_buffer.data(), &response, sizeof(response));
|
memcpy(response_buffer.data(), &response, sizeof(response));
|
||||||
|
|
|
@ -65,7 +65,7 @@ void IR_RST::UpdateCallback(u64 userdata, int cycles_late) {
|
||||||
s16 c_stick_x = static_cast<s16>(c_stick_x_f * MAX_CSTICK_RADIUS);
|
s16 c_stick_x = static_cast<s16>(c_stick_x_f * MAX_CSTICK_RADIUS);
|
||||||
s16 c_stick_y = static_cast<s16>(c_stick_y_f * MAX_CSTICK_RADIUS);
|
s16 c_stick_y = static_cast<s16>(c_stick_y_f * MAX_CSTICK_RADIUS);
|
||||||
|
|
||||||
Movie::HandleIrRst(state, c_stick_x, c_stick_y);
|
Core::Movie::GetInstance().HandleIrRst(state, c_stick_x, c_stick_y);
|
||||||
|
|
||||||
if (!raw_c_stick) {
|
if (!raw_c_stick) {
|
||||||
const HID::DirectionState direction = HID::GetStickDirectionState(c_stick_x, c_stick_y);
|
const HID::DirectionState direction = HID::GetStickDirectionState(c_stick_x, c_stick_y);
|
||||||
|
|
|
@ -19,7 +19,9 @@
|
||||||
#include "core/hle/service/ir/ir_rst.h"
|
#include "core/hle/service/ir/ir_rst.h"
|
||||||
#include "core/movie.h"
|
#include "core/movie.h"
|
||||||
|
|
||||||
namespace Movie {
|
namespace Core {
|
||||||
|
|
||||||
|
/*static*/ Movie Movie::s_instance;
|
||||||
|
|
||||||
enum class PlayMode { None, Recording, Playing };
|
enum class PlayMode { None, Recording, Playing };
|
||||||
|
|
||||||
|
@ -116,25 +118,21 @@ struct CTMHeader {
|
||||||
static_assert(sizeof(CTMHeader) == 256, "CTMHeader should be 256 bytes");
|
static_assert(sizeof(CTMHeader) == 256, "CTMHeader should be 256 bytes");
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
static PlayMode play_mode = PlayMode::None;
|
bool Movie::IsPlayingInput() {
|
||||||
static std::vector<u8> recorded_input;
|
|
||||||
static size_t current_byte = 0;
|
|
||||||
|
|
||||||
static bool IsPlayingInput() {
|
|
||||||
return play_mode == PlayMode::Playing;
|
return play_mode == PlayMode::Playing;
|
||||||
}
|
}
|
||||||
static bool IsRecordingInput() {
|
bool Movie::IsRecordingInput() {
|
||||||
return play_mode == PlayMode::Recording;
|
return play_mode == PlayMode::Recording;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CheckInputEnd() {
|
void Movie::CheckInputEnd() {
|
||||||
if (current_byte + sizeof(ControllerState) > recorded_input.size()) {
|
if (current_byte + sizeof(ControllerState) > recorded_input.size()) {
|
||||||
LOG_INFO(Movie, "Playback finished");
|
LOG_INFO(Movie, "Playback finished");
|
||||||
play_mode = PlayMode::None;
|
play_mode = PlayMode::None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Play(Service::HID::PadState& pad_state, s16& circle_pad_x, s16& circle_pad_y) {
|
void Movie::Play(Service::HID::PadState& pad_state, s16& circle_pad_x, s16& circle_pad_y) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
@ -163,7 +161,7 @@ static void Play(Service::HID::PadState& pad_state, s16& circle_pad_x, s16& circ
|
||||||
circle_pad_y = s.pad_and_circle.circle_pad_y;
|
circle_pad_y = s.pad_and_circle.circle_pad_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Play(Service::HID::TouchDataEntry& touch_data) {
|
void Movie::Play(Service::HID::TouchDataEntry& touch_data) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
@ -180,7 +178,7 @@ static void Play(Service::HID::TouchDataEntry& touch_data) {
|
||||||
touch_data.valid.Assign(s.touch.valid);
|
touch_data.valid.Assign(s.touch.valid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Play(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
void Movie::Play(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
@ -197,7 +195,7 @@ static void Play(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
||||||
accelerometer_data.z = s.accelerometer.z;
|
accelerometer_data.z = s.accelerometer.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Play(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
void Movie::Play(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
@ -214,7 +212,7 @@ static void Play(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
gyroscope_data.z = s.gyroscope.z;
|
gyroscope_data.z = s.gyroscope.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Play(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y) {
|
void Movie::Play(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
@ -232,7 +230,7 @@ static void Play(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_
|
||||||
pad_state.zr.Assign(s.ir_rst.zr);
|
pad_state.zr.Assign(s.ir_rst.zr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Play(Service::IR::ExtraHIDResponse& extra_hid_response) {
|
void Movie::Play(Service::IR::ExtraHIDResponse& extra_hid_response) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
std::memcpy(&s, &recorded_input[current_byte], sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
|
@ -252,13 +250,13 @@ static void Play(Service::IR::ExtraHIDResponse& extra_hid_response) {
|
||||||
extra_hid_response.buttons.zr_not_held.Assign(s.extra_hid_response.zr_not_held);
|
extra_hid_response.buttons.zr_not_held.Assign(s.extra_hid_response.zr_not_held);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Record(const ControllerState& controller_state) {
|
void Movie::Record(const ControllerState& controller_state) {
|
||||||
recorded_input.resize(current_byte + sizeof(ControllerState));
|
recorded_input.resize(current_byte + sizeof(ControllerState));
|
||||||
std::memcpy(&recorded_input[current_byte], &controller_state, sizeof(ControllerState));
|
std::memcpy(&recorded_input[current_byte], &controller_state, sizeof(ControllerState));
|
||||||
current_byte += sizeof(ControllerState);
|
current_byte += sizeof(ControllerState);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Record(const Service::HID::PadState& pad_state, const s16& circle_pad_x,
|
void Movie::Record(const Service::HID::PadState& pad_state, const s16& circle_pad_x,
|
||||||
const s16& circle_pad_y) {
|
const s16& circle_pad_y) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
s.type = ControllerStateType::PadAndCircle;
|
s.type = ControllerStateType::PadAndCircle;
|
||||||
|
@ -282,7 +280,7 @@ static void Record(const Service::HID::PadState& pad_state, const s16& circle_pa
|
||||||
Record(s);
|
Record(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Record(const Service::HID::TouchDataEntry& touch_data) {
|
void Movie::Record(const Service::HID::TouchDataEntry& touch_data) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
s.type = ControllerStateType::Touch;
|
s.type = ControllerStateType::Touch;
|
||||||
|
|
||||||
|
@ -293,7 +291,7 @@ static void Record(const Service::HID::TouchDataEntry& touch_data) {
|
||||||
Record(s);
|
Record(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Record(const Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
void Movie::Record(const Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
s.type = ControllerStateType::Accelerometer;
|
s.type = ControllerStateType::Accelerometer;
|
||||||
|
|
||||||
|
@ -304,7 +302,7 @@ static void Record(const Service::HID::AccelerometerDataEntry& accelerometer_dat
|
||||||
Record(s);
|
Record(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Record(const Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
void Movie::Record(const Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
s.type = ControllerStateType::Gyroscope;
|
s.type = ControllerStateType::Gyroscope;
|
||||||
|
|
||||||
|
@ -315,7 +313,7 @@ static void Record(const Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
Record(s);
|
Record(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Record(const Service::IR::PadState& pad_state, const s16& c_stick_x,
|
void Movie::Record(const Service::IR::PadState& pad_state, const s16& c_stick_x,
|
||||||
const s16& c_stick_y) {
|
const s16& c_stick_y) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
s.type = ControllerStateType::IrRst;
|
s.type = ControllerStateType::IrRst;
|
||||||
|
@ -328,7 +326,7 @@ static void Record(const Service::IR::PadState& pad_state, const s16& c_stick_x,
|
||||||
Record(s);
|
Record(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Record(const Service::IR::ExtraHIDResponse& extra_hid_response) {
|
void Movie::Record(const Service::IR::ExtraHIDResponse& extra_hid_response) {
|
||||||
ControllerState s;
|
ControllerState s;
|
||||||
s.type = ControllerStateType::ExtraHidResponse;
|
s.type = ControllerStateType::ExtraHidResponse;
|
||||||
|
|
||||||
|
@ -342,7 +340,7 @@ static void Record(const Service::IR::ExtraHIDResponse& extra_hid_response) {
|
||||||
Record(s);
|
Record(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ValidateHeader(const CTMHeader& header) {
|
bool Movie::ValidateHeader(const CTMHeader& header) {
|
||||||
if (header_magic_bytes != header.filetype) {
|
if (header_magic_bytes != header.filetype) {
|
||||||
LOG_ERROR(Movie, "Playback file does not have valid header");
|
LOG_ERROR(Movie, "Playback file does not have valid header");
|
||||||
return false;
|
return false;
|
||||||
|
@ -366,7 +364,7 @@ static bool ValidateHeader(const CTMHeader& header) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SaveMovie() {
|
void Movie::SaveMovie() {
|
||||||
LOG_INFO(Movie, "Saving movie");
|
LOG_INFO(Movie, "Saving movie");
|
||||||
FileUtil::IOFile save_record(Settings::values.movie_record, "wb");
|
FileUtil::IOFile save_record(Settings::values.movie_record, "wb");
|
||||||
|
|
||||||
|
@ -393,7 +391,7 @@ static void SaveMovie() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Init() {
|
void Movie::Init() {
|
||||||
if (!Settings::values.movie_play.empty()) {
|
if (!Settings::values.movie_play.empty()) {
|
||||||
LOG_INFO(Movie, "Loading Movie for playback");
|
LOG_INFO(Movie, "Loading Movie for playback");
|
||||||
FileUtil::IOFile save_record(Settings::values.movie_play, "rb");
|
FileUtil::IOFile save_record(Settings::values.movie_play, "rb");
|
||||||
|
@ -420,21 +418,20 @@ void Init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown() {
|
void Movie::Shutdown() {
|
||||||
if (!IsRecordingInput()) {
|
if (IsRecordingInput()) {
|
||||||
return;
|
SaveMovie();
|
||||||
}
|
}
|
||||||
|
|
||||||
SaveMovie();
|
|
||||||
|
|
||||||
play_mode = PlayMode::None;
|
play_mode = PlayMode::None;
|
||||||
recorded_input.resize(0);
|
recorded_input.resize(0);
|
||||||
current_byte = 0;
|
current_byte = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Targs>
|
template <typename... Targs>
|
||||||
static void Handle(Targs&... Fargs) {
|
void Movie::Handle(Targs&... Fargs) {
|
||||||
if (IsPlayingInput()) {
|
if (IsPlayingInput()) {
|
||||||
|
ASSERT(current_byte + sizeof(ControllerState) <= recorded_input.size());
|
||||||
Play(Fargs...);
|
Play(Fargs...);
|
||||||
CheckInputEnd();
|
CheckInputEnd();
|
||||||
} else if (IsRecordingInput()) {
|
} else if (IsRecordingInput()) {
|
||||||
|
@ -442,28 +439,28 @@ static void Handle(Targs&... Fargs) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandlePadAndCircleStatus(Service::HID::PadState& pad_state, s16& circle_pad_x,
|
void Movie::HandlePadAndCircleStatus(Service::HID::PadState& pad_state, s16& circle_pad_x,
|
||||||
s16& circle_pad_y) {
|
s16& circle_pad_y) {
|
||||||
Handle(pad_state, circle_pad_x, circle_pad_y);
|
Handle(pad_state, circle_pad_x, circle_pad_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleTouchStatus(Service::HID::TouchDataEntry& touch_data) {
|
void Movie::HandleTouchStatus(Service::HID::TouchDataEntry& touch_data) {
|
||||||
Handle(touch_data);
|
Handle(touch_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleAccelerometerStatus(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
void Movie::HandleAccelerometerStatus(Service::HID::AccelerometerDataEntry& accelerometer_data) {
|
||||||
Handle(accelerometer_data);
|
Handle(accelerometer_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleGyroscopeStatus(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
void Movie::HandleGyroscopeStatus(Service::HID::GyroscopeDataEntry& gyroscope_data) {
|
||||||
Handle(gyroscope_data);
|
Handle(gyroscope_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleIrRst(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y) {
|
void Movie::HandleIrRst(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y) {
|
||||||
Handle(pad_state, c_stick_x, c_stick_y);
|
Handle(pad_state, c_stick_x, c_stick_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleExtraHidResponse(Service::IR::ExtraHIDResponse& extra_hid_response) {
|
void Movie::HandleExtraHidResponse(Service::IR::ExtraHIDResponse& extra_hid_response) {
|
||||||
Handle(extra_hid_response);
|
Handle(extra_hid_response);
|
||||||
}
|
}
|
||||||
}
|
}; // namespace Core
|
||||||
|
|
120
src/core/movie.h
120
src/core/movie.h
|
@ -19,46 +19,96 @@ union PadState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Movie {
|
namespace Core {
|
||||||
|
struct CTMHeader;
|
||||||
|
struct ControllerState;
|
||||||
|
enum class PlayMode;
|
||||||
|
|
||||||
void Init();
|
class Movie {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Gets the instance of the Movie singleton class.
|
||||||
|
* @returns Reference to the instance of the Movie singleton class.
|
||||||
|
*/
|
||||||
|
static Movie& GetInstance() {
|
||||||
|
return s_instance;
|
||||||
|
}
|
||||||
|
|
||||||
void Shutdown();
|
void Init();
|
||||||
|
|
||||||
/**
|
void Shutdown();
|
||||||
* When recording: Takes a copy of the given input states so they can be used for playback
|
|
||||||
* When playing: Replaces the given input states with the ones stored in the playback file
|
|
||||||
*/
|
|
||||||
void HandlePadAndCircleStatus(Service::HID::PadState& pad_state, s16& circle_pad_x,
|
|
||||||
s16& circle_pad_y);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When recording: Takes a copy of the given input states so they can be used for playback
|
* When recording: Takes a copy of the given input states so they can be used for playback
|
||||||
* When playing: Replaces the given input states with the ones stored in the playback file
|
* When playing: Replaces the given input states with the ones stored in the playback file
|
||||||
*/
|
*/
|
||||||
void HandleTouchStatus(Service::HID::TouchDataEntry& touch_data);
|
void HandlePadAndCircleStatus(Service::HID::PadState& pad_state, s16& circle_pad_x,
|
||||||
|
s16& circle_pad_y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When recording: Takes a copy of the given input states so they can be used for playback
|
* When recording: Takes a copy of the given input states so they can be used for playback
|
||||||
* When playing: Replaces the given input states with the ones stored in the playback file
|
* When playing: Replaces the given input states with the ones stored in the playback file
|
||||||
*/
|
*/
|
||||||
void HandleAccelerometerStatus(Service::HID::AccelerometerDataEntry& accelerometer_data);
|
void HandleTouchStatus(Service::HID::TouchDataEntry& touch_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When recording: Takes a copy of the given input states so they can be used for playback
|
* When recording: Takes a copy of the given input states so they can be used for playback
|
||||||
* When playing: Replaces the given input states with the ones stored in the playback file
|
* When playing: Replaces the given input states with the ones stored in the playback file
|
||||||
*/
|
*/
|
||||||
void HandleGyroscopeStatus(Service::HID::GyroscopeDataEntry& gyroscope_data);
|
void HandleAccelerometerStatus(Service::HID::AccelerometerDataEntry& accelerometer_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When recording: Takes a copy of the given input states so they can be used for playback
|
* When recording: Takes a copy of the given input states so they can be used for playback
|
||||||
* When playing: Replaces the given input states with the ones stored in the playback file
|
* When playing: Replaces the given input states with the ones stored in the playback file
|
||||||
*/
|
*/
|
||||||
void HandleIrRst(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y);
|
void HandleGyroscopeStatus(Service::HID::GyroscopeDataEntry& gyroscope_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When recording: Takes a copy of the given input states so they can be used for playback
|
* When recording: Takes a copy of the given input states so they can be used for playback
|
||||||
* When playing: Replaces the given input states with the ones stored in the playback file
|
* When playing: Replaces the given input states with the ones stored in the playback file
|
||||||
*/
|
*/
|
||||||
void HandleExtraHidResponse(Service::IR::ExtraHIDResponse& extra_hid_response);
|
void HandleIrRst(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y);
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* When recording: Takes a copy of the given input states so they can be used for playback
|
||||||
|
* When playing: Replaces the given input states with the ones stored in the playback file
|
||||||
|
*/
|
||||||
|
void HandleExtraHidResponse(Service::IR::ExtraHIDResponse& extra_hid_response);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static Movie s_instance;
|
||||||
|
|
||||||
|
bool IsPlayingInput();
|
||||||
|
|
||||||
|
bool IsRecordingInput();
|
||||||
|
|
||||||
|
void CheckInputEnd();
|
||||||
|
|
||||||
|
template <typename... Targs>
|
||||||
|
void Handle(Targs&... Fargs);
|
||||||
|
|
||||||
|
void Play(Service::HID::PadState& pad_state, s16& circle_pad_x, s16& circle_pad_y);
|
||||||
|
void Play(Service::HID::TouchDataEntry& touch_data);
|
||||||
|
void Play(Service::HID::AccelerometerDataEntry& accelerometer_data);
|
||||||
|
void Play(Service::HID::GyroscopeDataEntry& gyroscope_data);
|
||||||
|
void Play(Service::IR::PadState& pad_state, s16& c_stick_x, s16& c_stick_y);
|
||||||
|
void Play(Service::IR::ExtraHIDResponse& extra_hid_response);
|
||||||
|
|
||||||
|
void Record(const ControllerState& controller_state);
|
||||||
|
void Record(const Service::HID::PadState& pad_state, const s16& circle_pad_x,
|
||||||
|
const s16& circle_pad_y);
|
||||||
|
void Record(const Service::HID::TouchDataEntry& touch_data);
|
||||||
|
void Record(const Service::HID::AccelerometerDataEntry& accelerometer_data);
|
||||||
|
void Record(const Service::HID::GyroscopeDataEntry& gyroscope_data);
|
||||||
|
void Record(const Service::IR::PadState& pad_state, const s16& c_stick_x, const s16& c_stick_y);
|
||||||
|
void Record(const Service::IR::ExtraHIDResponse& extra_hid_response);
|
||||||
|
|
||||||
|
bool ValidateHeader(const CTMHeader& header);
|
||||||
|
|
||||||
|
void SaveMovie();
|
||||||
|
|
||||||
|
PlayMode play_mode;
|
||||||
|
std::vector<u8> recorded_input;
|
||||||
|
size_t current_byte = 0;
|
||||||
|
};
|
||||||
|
} // namespace Core
|
Loading…
Reference in a new issue