summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2023-11-13 05:10:53 +0100
committerLiam <byteslice@airmail.cc>2023-11-13 05:10:53 +0100
commitecaa038b4da24fe75d3da6a4a18034285faac69d (patch)
tree1bde4040130e452c19f508b48055cc8e09494e8c
parentMerge pull request #11980 from german77/moment (diff)
downloadyuzu-ecaa038b4da24fe75d3da6a4a18034285faac69d.tar
yuzu-ecaa038b4da24fe75d3da6a4a18034285faac69d.tar.gz
yuzu-ecaa038b4da24fe75d3da6a4a18034285faac69d.tar.bz2
yuzu-ecaa038b4da24fe75d3da6a4a18034285faac69d.tar.lz
yuzu-ecaa038b4da24fe75d3da6a4a18034285faac69d.tar.xz
yuzu-ecaa038b4da24fe75d3da6a4a18034285faac69d.tar.zst
yuzu-ecaa038b4da24fe75d3da6a4a18034285faac69d.zip
-rw-r--r--src/audio_core/sink/cubeb_sink.cpp2
-rw-r--r--src/audio_core/sink/sdl2_sink.cpp2
-rw-r--r--src/audio_core/sink/sink_stream.cpp12
-rw-r--r--src/audio_core/sink/sink_stream.h6
4 files changed, 18 insertions, 4 deletions
diff --git a/src/audio_core/sink/cubeb_sink.cpp b/src/audio_core/sink/cubeb_sink.cpp
index bbb598bc5..51a23fe15 100644
--- a/src/audio_core/sink/cubeb_sink.cpp
+++ b/src/audio_core/sink/cubeb_sink.cpp
@@ -146,7 +146,7 @@ public:
return;
}
- paused = true;
+ SignalPause();
if (cubeb_stream_stop(stream_backend) != CUBEB_OK) {
LOG_CRITICAL(Audio_Sink, "Error stopping cubeb stream");
}
diff --git a/src/audio_core/sink/sdl2_sink.cpp b/src/audio_core/sink/sdl2_sink.cpp
index 7b89151de..96e0efce2 100644
--- a/src/audio_core/sink/sdl2_sink.cpp
+++ b/src/audio_core/sink/sdl2_sink.cpp
@@ -111,7 +111,7 @@ public:
if (device == 0 || paused) {
return;
}
- paused = true;
+ SignalPause();
SDL_PauseAudioDevice(device, 1);
}
diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp
index d66d04fae..2a09db599 100644
--- a/src/audio_core/sink/sink_stream.cpp
+++ b/src/audio_core/sink/sink_stream.cpp
@@ -282,11 +282,19 @@ u64 SinkStream::GetExpectedPlayedSampleCount() {
void SinkStream::WaitFreeSpace(std::stop_token stop_token) {
std::unique_lock lk{release_mutex};
release_cv.wait_for(lk, std::chrono::milliseconds(5),
- [this]() { return queued_buffers < max_queue_size; });
+ [this]() { return paused || queued_buffers < max_queue_size; });
if (queued_buffers > max_queue_size + 3) {
Common::CondvarWait(release_cv, lk, stop_token,
- [this] { return queued_buffers < max_queue_size; });
+ [this] { return paused || queued_buffers < max_queue_size; });
}
}
+void SinkStream::SignalPause() {
+ {
+ std::scoped_lock lk{release_mutex};
+ paused = true;
+ }
+ release_cv.notify_one();
+}
+
} // namespace AudioCore::Sink
diff --git a/src/audio_core/sink/sink_stream.h b/src/audio_core/sink/sink_stream.h
index 6a4996ca3..f2ccd19b8 100644
--- a/src/audio_core/sink/sink_stream.h
+++ b/src/audio_core/sink/sink_stream.h
@@ -214,6 +214,12 @@ public:
void WaitFreeSpace(std::stop_token stop_token);
protected:
+ /**
+ * Unblocks the ADSP if the stream is paused.
+ */
+ void SignalPause();
+
+protected:
/// Core system
Core::System& system;
/// Type of this stream