|
@@ -3,6 +3,8 @@
|
|
|
// Refer to the license.txt file included.
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#include "core/hle/hle.h"
|
|
#include "core/hle/hle.h"
|
|
|
|
|
+#include "core/hle/kernel/mutex.h"
|
|
|
|
|
+#include "core/hle/kernel/shared_memory.h"
|
|
|
#include "core/hle/service/csnd_snd.h"
|
|
#include "core/hle/service/csnd_snd.h"
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
@@ -11,11 +13,11 @@
|
|
|
namespace CSND_SND {
|
|
namespace CSND_SND {
|
|
|
|
|
|
|
|
const Interface::FunctionInfo FunctionTable[] = {
|
|
const Interface::FunctionInfo FunctionTable[] = {
|
|
|
- {0x00010140, nullptr, "Initialize"},
|
|
|
|
|
- {0x00020000, nullptr, "Shutdown"},
|
|
|
|
|
- {0x00030040, nullptr, "ExecuteType0Commands"},
|
|
|
|
|
|
|
+ {0x00010140, Initialize, "Initialize"},
|
|
|
|
|
+ {0x00020000, Shutdown, "Shutdown"},
|
|
|
|
|
+ {0x00030040, ExecuteType0Commands, "ExecuteType0Commands"},
|
|
|
{0x00040080, nullptr, "ExecuteType1Commands"},
|
|
{0x00040080, nullptr, "ExecuteType1Commands"},
|
|
|
- {0x00050000, nullptr, "AcquireSoundChannels"},
|
|
|
|
|
|
|
+ {0x00050000, AcquireSoundChannels, "AcquireSoundChannels"},
|
|
|
{0x00060000, nullptr, "ReleaseSoundChannels"},
|
|
{0x00060000, nullptr, "ReleaseSoundChannels"},
|
|
|
{0x00070000, nullptr, "AcquireCaptureDevice"},
|
|
{0x00070000, nullptr, "AcquireCaptureDevice"},
|
|
|
{0x00080040, nullptr, "ReleaseCaptureDevice"},
|
|
{0x00080040, nullptr, "ReleaseCaptureDevice"},
|
|
@@ -31,4 +33,51 @@ Interface::Interface() {
|
|
|
Register(FunctionTable);
|
|
Register(FunctionTable);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory = nullptr;
|
|
|
|
|
+static Kernel::SharedPtr<Kernel::Mutex> mutex = nullptr;
|
|
|
|
|
+
|
|
|
|
|
+void Initialize(Service::Interface* self) {
|
|
|
|
|
+ u32* cmd_buff = Kernel::GetCommandBuffer();
|
|
|
|
|
+
|
|
|
|
|
+ shared_memory = Kernel::SharedMemory::Create(cmd_buff[1],
|
|
|
|
|
+ Kernel::MemoryPermission::ReadWrite,
|
|
|
|
|
+ Kernel::MemoryPermission::ReadWrite, "CSNDSharedMem");
|
|
|
|
|
+
|
|
|
|
|
+ mutex = Kernel::Mutex::Create(false);
|
|
|
|
|
+
|
|
|
|
|
+ cmd_buff[1] = 0;
|
|
|
|
|
+ cmd_buff[2] = 0x4000000;
|
|
|
|
|
+ cmd_buff[3] = Kernel::g_handle_table.Create(mutex).MoveFrom();
|
|
|
|
|
+ cmd_buff[4] = Kernel::g_handle_table.Create(shared_memory).MoveFrom();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void ExecuteType0Commands(Service::Interface* self) {
|
|
|
|
|
+ u32* cmd_buff = Kernel::GetCommandBuffer();
|
|
|
|
|
+
|
|
|
|
|
+ if (shared_memory != nullptr) {
|
|
|
|
|
+ struct Type0Command* command = reinterpret_cast<struct Type0Command*>(
|
|
|
|
|
+ shared_memory->GetPointer(cmd_buff[1]));
|
|
|
|
|
+ if (command == nullptr) {
|
|
|
|
|
+ cmd_buff[1] = 1;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ LOG_WARNING(Service, "(STUBBED) CSND_SND::ExecuteType0Commands");
|
|
|
|
|
+ command->finished |= 1;
|
|
|
|
|
+ cmd_buff[1] = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }else{
|
|
|
|
|
+ cmd_buff[1] = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void AcquireSoundChannels(Service::Interface* self) {
|
|
|
|
|
+ u32* cmd_buff = Kernel::GetCommandBuffer();
|
|
|
|
|
+ cmd_buff[1] = 0;
|
|
|
|
|
+ cmd_buff[2] = 0xFFFFFF00;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void Shutdown(Service::Interface* self) {
|
|
|
|
|
+ shared_memory = nullptr;
|
|
|
|
|
+ mutex = nullptr;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
} // namespace
|
|
} // namespace
|