csnd_snd.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/hle/hle.h"
  5. #include "core/hle/kernel/mutex.h"
  6. #include "core/hle/kernel/shared_memory.h"
  7. #include "core/hle/service/csnd_snd.h"
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////
  9. // Namespace CSND_SND
  10. namespace CSND_SND {
  11. const Interface::FunctionInfo FunctionTable[] = {
  12. {0x00010140, Initialize, "Initialize"},
  13. {0x00020000, Shutdown, "Shutdown"},
  14. {0x00030040, ExecuteType0Commands, "ExecuteType0Commands"},
  15. {0x00040080, nullptr, "ExecuteType1Commands"},
  16. {0x00050000, AcquireSoundChannels, "AcquireSoundChannels"},
  17. {0x00060000, nullptr, "ReleaseSoundChannels"},
  18. {0x00070000, nullptr, "AcquireCaptureDevice"},
  19. {0x00080040, nullptr, "ReleaseCaptureDevice"},
  20. {0x00090082, nullptr, "FlushDCache"},
  21. {0x000A0082, nullptr, "StoreDCache"},
  22. {0x000B0082, nullptr, "InvalidateDCache"},
  23. };
  24. ////////////////////////////////////////////////////////////////////////////////////////////////////
  25. // Interface class
  26. Interface::Interface() {
  27. Register(FunctionTable);
  28. }
  29. static Kernel::SharedPtr<Kernel::SharedMemory> shared_memory = nullptr;
  30. static Kernel::SharedPtr<Kernel::Mutex> mutex = nullptr;
  31. void Initialize(Service::Interface* self) {
  32. u32* cmd_buff = Kernel::GetCommandBuffer();
  33. shared_memory = Kernel::SharedMemory::Create(cmd_buff[1],
  34. Kernel::MemoryPermission::ReadWrite,
  35. Kernel::MemoryPermission::ReadWrite, "CSNDSharedMem");
  36. mutex = Kernel::Mutex::Create(false);
  37. cmd_buff[1] = 0;
  38. cmd_buff[2] = 0x4000000;
  39. cmd_buff[3] = Kernel::g_handle_table.Create(mutex).MoveFrom();
  40. cmd_buff[4] = Kernel::g_handle_table.Create(shared_memory).MoveFrom();
  41. }
  42. void ExecuteType0Commands(Service::Interface* self) {
  43. u32* cmd_buff = Kernel::GetCommandBuffer();
  44. if (shared_memory != nullptr) {
  45. struct Type0Command* command = reinterpret_cast<struct Type0Command*>(
  46. shared_memory->GetPointer(cmd_buff[1]));
  47. if (command == nullptr) {
  48. cmd_buff[1] = 1;
  49. }else{
  50. LOG_WARNING(Service, "(STUBBED) CSND_SND::ExecuteType0Commands");
  51. command->finished |= 1;
  52. cmd_buff[1] = 0;
  53. }
  54. }else{
  55. cmd_buff[1] = 1;
  56. }
  57. }
  58. void AcquireSoundChannels(Service::Interface* self) {
  59. u32* cmd_buff = Kernel::GetCommandBuffer();
  60. cmd_buff[1] = 0;
  61. cmd_buff[2] = 0xFFFFFF00;
  62. }
  63. void Shutdown(Service::Interface* self) {
  64. shared_memory = nullptr;
  65. mutex = nullptr;
  66. }
  67. } // namespace