HLE/Applets: Implemented a dummy Mii Selector applet.
This prevents some games (like Super Mario 3D Land) from freezing when trying to launch it, however, it's not complete and won't let you go past Mii selection as the parameter structure hasn't been reverse engineered yet.
This commit is contained in:
parent
644d1e7ca3
commit
0f8be2d2cc
7 changed files with 156 additions and 2 deletions
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include "core/core_timing.h"
|
||||
#include "core/hle/applets/applet.h"
|
||||
#include "core/hle/applets/mii_selector.h"
|
||||
#include "core/hle/applets/swkbd.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/apt/apt.h"
|
||||
|
@ -47,7 +48,12 @@ ResultCode Applet::Create(Service::APT::AppletId id) {
|
|||
case Service::APT::AppletId::SoftwareKeyboard2:
|
||||
applets[id] = std::make_shared<SoftwareKeyboard>(id);
|
||||
break;
|
||||
case Service::APT::AppletId::Ed1:
|
||||
case Service::APT::AppletId::Ed2:
|
||||
applets[id] = std::make_shared<MiiSelector>(id);
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR(Service_APT, "Could not create applet %u", id);
|
||||
// TODO(Subv): Find the right error code
|
||||
return ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, ErrorSummary::NotSupported, ErrorLevel::Permanent);
|
||||
}
|
||||
|
|
75
src/core/hle/applets/mii_selector.cpp
Normal file
75
src/core/hle/applets/mii_selector.cpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
// Copyright 2016 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
|
||||
#include "common/assert.h"
|
||||
#include "common/logging/log.h"
|
||||
#include "common/string_util.h"
|
||||
|
||||
#include "core/hle/applets/mii_selector.h"
|
||||
#include "core/hle/kernel/kernel.h"
|
||||
#include "core/hle/kernel/shared_memory.h"
|
||||
#include "core/hle/result.h"
|
||||
|
||||
#include "video_core/video_core.h"
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace HLE {
|
||||
namespace Applets {
|
||||
|
||||
MiiSelector::MiiSelector(Service::APT::AppletId id) : Applet(id), started(false) {
|
||||
// Create the SharedMemory that will hold the framebuffer data
|
||||
// TODO(Subv): What size should we use here?
|
||||
using Kernel::MemoryPermission;
|
||||
framebuffer_memory = Kernel::SharedMemory::Create(0x1000, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite, "MiiSelector Memory");
|
||||
}
|
||||
|
||||
ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& parameter) {
|
||||
if (parameter.signal != static_cast<u32>(Service::APT::SignalType::LibAppJustStarted)) {
|
||||
LOG_ERROR(Service_APT, "unsupported signal %u", parameter.signal);
|
||||
UNIMPLEMENTED();
|
||||
// TODO(Subv): Find the right error code
|
||||
return ResultCode(-1);
|
||||
}
|
||||
|
||||
Service::APT::MessageParameter result;
|
||||
// The buffer passed in parameter contains the data returned by GSPGPU::ImportDisplayCaptureInfo
|
||||
result.signal = static_cast<u32>(Service::APT::SignalType::LibAppFinished);
|
||||
result.data = nullptr;
|
||||
result.buffer_size = 0;
|
||||
result.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
|
||||
result.sender_id = static_cast<u32>(id);
|
||||
result.object = framebuffer_memory;
|
||||
|
||||
Service::APT::SendParameter(result);
|
||||
return RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& parameter) {
|
||||
started = true;
|
||||
|
||||
// TODO(Subv): Set the expected fields in the response buffer before resending it to the application.
|
||||
// TODO(Subv): Reverse the parameter format for the Mii Selector
|
||||
|
||||
// Let the application know that we're closing
|
||||
Service::APT::MessageParameter message;
|
||||
message.buffer_size = parameter.buffer_size;
|
||||
message.data = parameter.data;
|
||||
message.signal = static_cast<u32>(Service::APT::SignalType::LibAppClosed);
|
||||
message.destination_id = static_cast<u32>(Service::APT::AppletId::Application);
|
||||
message.sender_id = static_cast<u32>(id);
|
||||
Service::APT::SendParameter(message);
|
||||
|
||||
started = false;
|
||||
return RESULT_SUCCESS;
|
||||
}
|
||||
|
||||
void MiiSelector::Update() {
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace
|
37
src/core/hle/applets/mii_selector.h
Normal file
37
src/core/hle/applets/mii_selector.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
// Copyright 2016 Citra Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "common/common_types.h"
|
||||
#include "common/common_funcs.h"
|
||||
|
||||
#include "core/hle/applets/applet.h"
|
||||
#include "core/hle/kernel/kernel.h"
|
||||
#include "core/hle/kernel/shared_memory.h"
|
||||
#include "core/hle/result.h"
|
||||
#include "core/hle/service/apt/apt.h"
|
||||
|
||||
namespace HLE {
|
||||
namespace Applets {
|
||||
|
||||
class MiiSelector final : public Applet {
|
||||
public:
|
||||
MiiSelector(Service::APT::AppletId id);
|
||||
|
||||
ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override;
|
||||
ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override;
|
||||
void Update() override;
|
||||
bool IsRunning() const override { return started; }
|
||||
|
||||
/// TODO(Subv): Find out what this is actually used for.
|
||||
/// It is believed that the application stores the current screen image here.
|
||||
Kernel::SharedPtr<Kernel::SharedMemory> framebuffer_memory;
|
||||
|
||||
/// Whether this applet is currently running instead of the host application or not.
|
||||
bool started;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace
|
Loading…
Add table
Add a link
Reference in a new issue