audio_core.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2016 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <memory>
  5. #include <string>
  6. #include "audio_core/audio_core.h"
  7. #include "audio_core/hle/dsp.h"
  8. #include "audio_core/hle/pipe.h"
  9. #include "audio_core/null_sink.h"
  10. #include "audio_core/sink.h"
  11. #include "audio_core/sink_details.h"
  12. #include "core/core_timing.h"
  13. #include "core/hle/kernel/vm_manager.h"
  14. #include "core/hle/service/dsp_dsp.h"
  15. namespace AudioCore {
  16. // Audio Ticks occur about every 5 miliseconds.
  17. static int tick_event; ///< CoreTiming event
  18. static constexpr u64 audio_frame_ticks = 1310252ull; ///< Units: ARM11 cycles
  19. static void AudioTickCallback(u64 /*userdata*/, int cycles_late) {
  20. if (DSP::HLE::Tick()) {
  21. // TODO(merry): Signal all the other interrupts as appropriate.
  22. Service::DSP_DSP::SignalPipeInterrupt(DSP::HLE::DspPipe::Audio);
  23. // HACK(merry): Added to prevent regressions. Will remove soon.
  24. Service::DSP_DSP::SignalPipeInterrupt(DSP::HLE::DspPipe::Binary);
  25. }
  26. // Reschedule recurrent event
  27. CoreTiming::ScheduleEvent(audio_frame_ticks - cycles_late, tick_event);
  28. }
  29. void Init() {
  30. DSP::HLE::Init();
  31. tick_event = CoreTiming::RegisterEvent("AudioCore::tick_event", AudioTickCallback);
  32. CoreTiming::ScheduleEvent(audio_frame_ticks, tick_event);
  33. }
  34. void AddAddressSpace(Kernel::VMManager& address_space) {
  35. auto r0_vma = address_space
  36. .MapBackingMemory(DSP::HLE::region0_base,
  37. reinterpret_cast<u8*>(&DSP::HLE::g_regions[0]),
  38. sizeof(DSP::HLE::SharedMemory), Kernel::MemoryState::IO)
  39. .MoveFrom();
  40. address_space.Reprotect(r0_vma, Kernel::VMAPermission::ReadWrite);
  41. auto r1_vma = address_space
  42. .MapBackingMemory(DSP::HLE::region1_base,
  43. reinterpret_cast<u8*>(&DSP::HLE::g_regions[1]),
  44. sizeof(DSP::HLE::SharedMemory), Kernel::MemoryState::IO)
  45. .MoveFrom();
  46. address_space.Reprotect(r1_vma, Kernel::VMAPermission::ReadWrite);
  47. }
  48. void SelectSink(std::string sink_id) {
  49. const SinkDetails& sink_details = GetSinkDetails(sink_id);
  50. DSP::HLE::SetSink(sink_details.factory());
  51. }
  52. void EnableStretching(bool enable) {
  53. DSP::HLE::EnableStretching(enable);
  54. }
  55. void Shutdown() {
  56. CoreTiming::UnscheduleEvent(tick_event, 0);
  57. DSP::HLE::Shutdown();
  58. }
  59. } // namespace AudioCore