audio_core.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Copyright 2016 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <array>
  5. #include <memory>
  6. #include <string>
  7. #include "audio_core/audio_core.h"
  8. #include "audio_core/hle/dsp.h"
  9. #include "audio_core/hle/pipe.h"
  10. #include "audio_core/null_sink.h"
  11. #include "audio_core/sink.h"
  12. #include "audio_core/sink_details.h"
  13. #include "common/common_types.h"
  14. #include "core/core_timing.h"
  15. #include "core/hle/service/dsp_dsp.h"
  16. namespace AudioCore {
  17. // Audio Ticks occur about every 5 miliseconds.
  18. static CoreTiming::EventType* tick_event; ///< CoreTiming event
  19. static constexpr u64 audio_frame_ticks = 1310252ull; ///< Units: ARM11 cycles
  20. static void AudioTickCallback(u64 /*userdata*/, int cycles_late) {
  21. if (DSP::HLE::Tick()) {
  22. // TODO(merry): Signal all the other interrupts as appropriate.
  23. Service::DSP_DSP::SignalPipeInterrupt(DSP::HLE::DspPipe::Audio);
  24. // HACK(merry): Added to prevent regressions. Will remove soon.
  25. Service::DSP_DSP::SignalPipeInterrupt(DSP::HLE::DspPipe::Binary);
  26. }
  27. // Reschedule recurrent event
  28. CoreTiming::ScheduleEvent(audio_frame_ticks - cycles_late, tick_event);
  29. }
  30. void Init() {
  31. DSP::HLE::Init();
  32. tick_event = CoreTiming::RegisterEvent("AudioCore::tick_event", AudioTickCallback);
  33. CoreTiming::ScheduleEvent(audio_frame_ticks, tick_event);
  34. }
  35. std::array<u8, Memory::DSP_RAM_SIZE>& GetDspMemory() {
  36. return DSP::HLE::g_dsp_memory.raw_memory;
  37. }
  38. void SelectSink(std::string sink_id) {
  39. const SinkDetails& sink_details = GetSinkDetails(sink_id);
  40. DSP::HLE::SetSink(sink_details.factory());
  41. }
  42. void EnableStretching(bool enable) {
  43. DSP::HLE::EnableStretching(enable);
  44. }
  45. void Shutdown() {
  46. CoreTiming::UnscheduleEvent(tick_event, 0);
  47. DSP::HLE::Shutdown();
  48. }
  49. } // namespace AudioCore