summaryrefslogtreecommitdiff
path: root/src/audio_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio_core')
-rw-r--r--src/audio_core/stream.cpp13
-rw-r--r--src/audio_core/stream.h4
2 files changed, 9 insertions, 8 deletions
diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp
index abd8576e2..f80ab92e4 100644
--- a/src/audio_core/stream.cpp
+++ b/src/audio_core/stream.cpp
@@ -38,7 +38,7 @@ Stream::Stream(Core::Timing::CoreTiming& core_timing, u32 sample_rate, Format fo
38 sink_stream{sink_stream}, core_timing{core_timing}, name{std::move(name_)} { 38 sink_stream{sink_stream}, core_timing{core_timing}, name{std::move(name_)} {
39 39
40 release_event = Core::Timing::CreateEvent( 40 release_event = Core::Timing::CreateEvent(
41 name, [this](u64 userdata, s64 cycles_late) { ReleaseActiveBuffer(cycles_late); }); 41 name, [this](u64, std::chrono::nanoseconds ns_late) { ReleaseActiveBuffer(ns_late); });
42} 42}
43 43
44void Stream::Play() { 44void Stream::Play() {
@@ -78,7 +78,7 @@ static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) {
78 } 78 }
79} 79}
80 80
81void Stream::PlayNextBuffer(s64 cycles_late) { 81void Stream::PlayNextBuffer(std::chrono::nanoseconds ns_late) {
82 if (!IsPlaying()) { 82 if (!IsPlaying()) {
83 // Ensure we are in playing state before playing the next buffer 83 // Ensure we are in playing state before playing the next buffer
84 sink_stream.Flush(); 84 sink_stream.Flush();
@@ -103,17 +103,18 @@ void Stream::PlayNextBuffer(s64 cycles_late) {
103 103
104 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); 104 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples());
105 105
106 const auto time_stretch_delta = std::chrono::nanoseconds{ 106 const auto time_stretch_delta = Settings::values.enable_audio_stretching.GetValue()
107 Settings::values.enable_audio_stretching.GetValue() ? 0 : cycles_late}; 107 ? std::chrono::nanoseconds::zero()
108 : ns_late;
108 const auto future_time = GetBufferReleaseNS(*active_buffer) - time_stretch_delta; 109 const auto future_time = GetBufferReleaseNS(*active_buffer) - time_stretch_delta;
109 core_timing.ScheduleEvent(future_time, release_event, {}); 110 core_timing.ScheduleEvent(future_time, release_event, {});
110} 111}
111 112
112void Stream::ReleaseActiveBuffer(s64 cycles_late) { 113void Stream::ReleaseActiveBuffer(std::chrono::nanoseconds ns_late) {
113 ASSERT(active_buffer); 114 ASSERT(active_buffer);
114 released_buffers.push(std::move(active_buffer)); 115 released_buffers.push(std::move(active_buffer));
115 release_callback(); 116 release_callback();
116 PlayNextBuffer(cycles_late); 117 PlayNextBuffer(ns_late);
117} 118}
118 119
119bool Stream::QueueBuffer(BufferPtr&& buffer) { 120bool Stream::QueueBuffer(BufferPtr&& buffer) {
diff --git a/src/audio_core/stream.h b/src/audio_core/stream.h
index 2febd647c..6437b8591 100644
--- a/src/audio_core/stream.h
+++ b/src/audio_core/stream.h
@@ -91,10 +91,10 @@ public:
91 91
92private: 92private:
93 /// Plays the next queued buffer in the audio stream, starting playback if necessary 93 /// Plays the next queued buffer in the audio stream, starting playback if necessary
94 void PlayNextBuffer(s64 cycles_late = 0); 94 void PlayNextBuffer(std::chrono::nanoseconds ns_late = {});
95 95
96 /// Releases the actively playing buffer, signalling that it has been completed 96 /// Releases the actively playing buffer, signalling that it has been completed
97 void ReleaseActiveBuffer(s64 cycles_late = 0); 97 void ReleaseActiveBuffer(std::chrono::nanoseconds ns_late = {});
98 98
99 /// Gets the number of core cycles when the specified buffer will be released 99 /// Gets the number of core cycles when the specified buffer will be released
100 std::chrono::nanoseconds GetBufferReleaseNS(const Buffer& buffer) const; 100 std::chrono::nanoseconds GetBufferReleaseNS(const Buffer& buffer) const;