summaryrefslogtreecommitdiffstats
path: root/src/audio_core
diff options
context:
space:
mode:
authorKelebek1 <eeeedddccc@hotmail.co.uk>2022-09-04 06:41:06 +0200
committerKelebek1 <eeeedddccc@hotmail.co.uk>2022-09-04 06:41:06 +0200
commit2129d040a509754839b82b1ff6d387cb4f84f168 (patch)
treedcbc4edfb20e70e4c22566193c802ea2f4b9979e /src/audio_core
parentRework audio output, connecting AudioOut into coretiming to fix desync during heavy loads. (diff)
downloadyuzu-2129d040a509754839b82b1ff6d387cb4f84f168.tar
yuzu-2129d040a509754839b82b1ff6d387cb4f84f168.tar.gz
yuzu-2129d040a509754839b82b1ff6d387cb4f84f168.tar.bz2
yuzu-2129d040a509754839b82b1ff6d387cb4f84f168.tar.lz
yuzu-2129d040a509754839b82b1ff6d387cb4f84f168.tar.xz
yuzu-2129d040a509754839b82b1ff6d387cb4f84f168.tar.zst
yuzu-2129d040a509754839b82b1ff6d387cb4f84f168.zip
Diffstat (limited to 'src/audio_core')
-rw-r--r--src/audio_core/audio_core.cpp8
-rw-r--r--src/audio_core/audio_core.h14
-rw-r--r--src/audio_core/sink/sink_stream.cpp8
3 files changed, 29 insertions, 1 deletions
diff --git a/src/audio_core/audio_core.cpp b/src/audio_core/audio_core.cpp
index cf7e763e6..9feec1829 100644
--- a/src/audio_core/audio_core.cpp
+++ b/src/audio_core/audio_core.cpp
@@ -57,4 +57,12 @@ void AudioCore::PauseSinks(const bool pausing) const {
}
}
+void AudioCore::SetNVDECActive(bool active) {
+ nvdec_active = active;
+}
+
+bool AudioCore::IsNVDECActive() const {
+ return nvdec_active;
+}
+
} // namespace AudioCore
diff --git a/src/audio_core/audio_core.h b/src/audio_core/audio_core.h
index fd1e43356..ac9afefaa 100644
--- a/src/audio_core/audio_core.h
+++ b/src/audio_core/audio_core.h
@@ -65,6 +65,18 @@ public:
*/
void PauseSinks(bool pausing) const;
+ /**
+ * Toggle NVDEC state, used to avoid stall in playback.
+ *
+ * @param active - Set true if nvdec is active, otherwise false.
+ */
+ void SetNVDECActive(bool active);
+
+ /**
+ * Get NVDEC state.
+ */
+ bool IsNVDECActive() const;
+
private:
/**
* Create the sinks on startup.
@@ -79,6 +91,8 @@ private:
std::unique_ptr<Sink::Sink> input_sink;
/// The ADSP in the sysmodule
std::unique_ptr<AudioRenderer::ADSP::ADSP> adsp;
+ /// Is NVDec currently active?
+ bool nvdec_active{false};
};
} // namespace AudioCore
diff --git a/src/audio_core/sink/sink_stream.cpp b/src/audio_core/sink/sink_stream.cpp
index 3770c515d..24636e512 100644
--- a/src/audio_core/sink/sink_stream.cpp
+++ b/src/audio_core/sink/sink_stream.cpp
@@ -9,6 +9,7 @@
#include <span>
#include <vector>
+#include "audio_core/audio_core.h"
#include "audio_core/common/common.h"
#include "audio_core/sink/sink_stream.h"
#include "common/common_types.h"
@@ -194,7 +195,12 @@ void SinkStream::ProcessAudioOutAndRender(std::span<s16> output_buffer, std::siz
const std::size_t frame_size_bytes = frame_size * sizeof(s16);
size_t frames_written{0};
- if (queued_buffers > max_queue_size) {
+ // Due to many frames being queued up with nvdec (5 frames or so?), a lot of buffers also get
+ // queued up (30+) but not all at once, which causes constant stalling here, so just let the
+ // video play out without attempting to stall.
+ // Can hopefully remove this later with a more complete NVDEC implementation.
+ const auto nvdec_active{system.AudioCore().IsNVDECActive()};
+ if (!nvdec_active && queued_buffers > max_queue_size) {
Stall();
}