summaryrefslogtreecommitdiff
path: root/src/audio_core/hle/dsp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio_core/hle/dsp.cpp')
-rw-r--r--src/audio_core/hle/dsp.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/audio_core/hle/dsp.cpp b/src/audio_core/hle/dsp.cpp
index 0cdbdb06a..5113ad8ca 100644
--- a/src/audio_core/hle/dsp.cpp
+++ b/src/audio_core/hle/dsp.cpp
@@ -9,6 +9,7 @@
9#include "audio_core/hle/pipe.h" 9#include "audio_core/hle/pipe.h"
10#include "audio_core/hle/source.h" 10#include "audio_core/hle/source.h"
11#include "audio_core/sink.h" 11#include "audio_core/sink.h"
12#include "audio_core/time_stretch.h"
12 13
13namespace DSP { 14namespace DSP {
14namespace HLE { 15namespace HLE {
@@ -48,15 +49,29 @@ static std::array<Source, num_sources> sources = {
48}; 49};
49 50
50static std::unique_ptr<AudioCore::Sink> sink; 51static std::unique_ptr<AudioCore::Sink> sink;
52static AudioCore::TimeStretcher time_stretcher;
51 53
52void Init() { 54void Init() {
53 DSP::HLE::ResetPipes(); 55 DSP::HLE::ResetPipes();
56
54 for (auto& source : sources) { 57 for (auto& source : sources) {
55 source.Reset(); 58 source.Reset();
56 } 59 }
60
61 time_stretcher.Reset();
62 if (sink) {
63 time_stretcher.SetOutputSampleRate(sink->GetNativeSampleRate());
64 }
57} 65}
58 66
59void Shutdown() { 67void Shutdown() {
68 time_stretcher.Flush();
69 while (true) {
70 std::vector<s16> residual_audio = time_stretcher.Process(sink->SamplesInQueue());
71 if (residual_audio.empty())
72 break;
73 sink->EnqueueSamples(residual_audio);
74 }
60} 75}
61 76
62bool Tick() { 77bool Tick() {
@@ -77,6 +92,7 @@ bool Tick() {
77 92
78void SetSink(std::unique_ptr<AudioCore::Sink> sink_) { 93void SetSink(std::unique_ptr<AudioCore::Sink> sink_) {
79 sink = std::move(sink_); 94 sink = std::move(sink_);
95 time_stretcher.SetOutputSampleRate(sink->GetNativeSampleRate());
80} 96}
81 97
82} // namespace HLE 98} // namespace HLE