summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/CMakeLists.txt1
-rw-r--r--src/audio_core/cubeb_sink.cpp7
-rw-r--r--src/audio_core/null_sink.h4
-rw-r--r--src/audio_core/sink_stream.h2
-rw-r--r--src/audio_core/stream.cpp1
-rw-r--r--src/core/settings.h1
-rw-r--r--src/core/telemetry_session.cpp3
-rw-r--r--src/yuzu/configuration/config.cpp3
-rw-r--r--src/yuzu/configuration/configure_audio.cpp3
-rw-r--r--src/yuzu/configuration/configure_audio.ui10
-rw-r--r--src/yuzu_cmd/config.cpp2
-rw-r--r--src/yuzu_cmd/default_ini.h6
12 files changed, 43 insertions, 0 deletions
diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt
index 82e4850f7..de5c291ce 100644
--- a/src/audio_core/CMakeLists.txt
+++ b/src/audio_core/CMakeLists.txt
@@ -24,6 +24,7 @@ add_library(audio_core STATIC
24create_target_directory_groups(audio_core) 24create_target_directory_groups(audio_core)
25 25
26target_link_libraries(audio_core PUBLIC common core) 26target_link_libraries(audio_core PUBLIC common core)
27target_link_libraries(audio_core PRIVATE SoundTouch)
27 28
28if(ENABLE_CUBEB) 29if(ENABLE_CUBEB)
29 target_link_libraries(audio_core PRIVATE cubeb) 30 target_link_libraries(audio_core PRIVATE cubeb)
diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp
index 5a1177d0c..0f77fd162 100644
--- a/src/audio_core/cubeb_sink.cpp
+++ b/src/audio_core/cubeb_sink.cpp
@@ -85,6 +85,13 @@ public:
85 } 85 }
86 } 86 }
87 87
88 size_t SamplesInQueue(u32 num_channels) const {
89 if (!ctx)
90 return 0;
91
92 return queue.size() / num_channels;
93 }
94
88 u32 GetNumChannels() const { 95 u32 GetNumChannels() const {
89 return num_channels; 96 return num_channels;
90 } 97 }
diff --git a/src/audio_core/null_sink.h b/src/audio_core/null_sink.h
index f235d93e5..fbb1bc225 100644
--- a/src/audio_core/null_sink.h
+++ b/src/audio_core/null_sink.h
@@ -21,6 +21,10 @@ public:
21private: 21private:
22 struct NullSinkStreamImpl final : SinkStream { 22 struct NullSinkStreamImpl final : SinkStream {
23 void EnqueueSamples(u32 /*num_channels*/, const std::vector<s16>& /*samples*/) override {} 23 void EnqueueSamples(u32 /*num_channels*/, const std::vector<s16>& /*samples*/) override {}
24
25 size_t SamplesInQueue(u32 /*num_channels*/) const override {
26 return 0;
27 }
24 } null_sink_stream; 28 } null_sink_stream;
25}; 29};
26 30
diff --git a/src/audio_core/sink_stream.h b/src/audio_core/sink_stream.h
index 41b6736d8..743a743a3 100644
--- a/src/audio_core/sink_stream.h
+++ b/src/audio_core/sink_stream.h
@@ -25,6 +25,8 @@ public:
25 * @param samples Samples in interleaved stereo PCM16 format. 25 * @param samples Samples in interleaved stereo PCM16 format.
26 */ 26 */
27 virtual void EnqueueSamples(u32 num_channels, const std::vector<s16>& samples) = 0; 27 virtual void EnqueueSamples(u32 num_channels, const std::vector<s16>& samples) = 0;
28
29 virtual std::size_t SamplesInQueue(u32 num_channels) const = 0;
28}; 30};
29 31
30using SinkStreamPtr = std::unique_ptr<SinkStream>; 32using SinkStreamPtr = std::unique_ptr<SinkStream>;
diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp
index dbae75d8c..49c6efc85 100644
--- a/src/audio_core/stream.cpp
+++ b/src/audio_core/stream.cpp
@@ -90,6 +90,7 @@ void Stream::PlayNextBuffer() {
90 queued_buffers.pop(); 90 queued_buffers.pop();
91 91
92 VolumeAdjustSamples(active_buffer->Samples()); 92 VolumeAdjustSamples(active_buffer->Samples());
93
93 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); 94 sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples());
94 95
95 CoreTiming::ScheduleEventThreadsafe(GetBufferReleaseCycles(*active_buffer), release_event, {}); 96 CoreTiming::ScheduleEventThreadsafe(GetBufferReleaseCycles(*active_buffer), release_event, {});
diff --git a/src/core/settings.h b/src/core/settings.h
index 5bf1863e6..c25f8ba70 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -146,6 +146,7 @@ struct Values {
146 146
147 // Audio 147 // Audio
148 std::string sink_id; 148 std::string sink_id;
149 bool enable_audio_stretching;
149 std::string audio_device_id; 150 std::string audio_device_id;
150 float volume; 151 float volume;
151 152
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 3730e85b8..b0df154ca 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -120,6 +120,9 @@ TelemetrySession::TelemetrySession() {
120 Telemetry::AppendOSInfo(field_collection); 120 Telemetry::AppendOSInfo(field_collection);
121 121
122 // Log user configuration information 122 // Log user configuration information
123 AddField(Telemetry::FieldType::UserConfig, "Audio_SinkId", Settings::values.sink_id);
124 AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching",
125 Settings::values.enable_audio_stretching);
123 AddField(Telemetry::FieldType::UserConfig, "Core_UseCpuJit", Settings::values.use_cpu_jit); 126 AddField(Telemetry::FieldType::UserConfig, "Core_UseCpuJit", Settings::values.use_cpu_jit);
124 AddField(Telemetry::FieldType::UserConfig, "Core_UseMultiCore", 127 AddField(Telemetry::FieldType::UserConfig, "Core_UseMultiCore",
125 Settings::values.use_multi_core); 128 Settings::values.use_multi_core);
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index c43e79e78..d229225b4 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -95,6 +95,8 @@ void Config::ReadValues() {
95 95
96 qt_config->beginGroup("Audio"); 96 qt_config->beginGroup("Audio");
97 Settings::values.sink_id = qt_config->value("output_engine", "auto").toString().toStdString(); 97 Settings::values.sink_id = qt_config->value("output_engine", "auto").toString().toStdString();
98 Settings::values.enable_audio_stretching =
99 qt_config->value("enable_audio_stretching", true).toBool();
98 Settings::values.audio_device_id = 100 Settings::values.audio_device_id =
99 qt_config->value("output_device", "auto").toString().toStdString(); 101 qt_config->value("output_device", "auto").toString().toStdString();
100 Settings::values.volume = qt_config->value("volume", 1).toFloat(); 102 Settings::values.volume = qt_config->value("volume", 1).toFloat();
@@ -230,6 +232,7 @@ void Config::SaveValues() {
230 232
231 qt_config->beginGroup("Audio"); 233 qt_config->beginGroup("Audio");
232 qt_config->setValue("output_engine", QString::fromStdString(Settings::values.sink_id)); 234 qt_config->setValue("output_engine", QString::fromStdString(Settings::values.sink_id));
235 qt_config->setValue("enable_audio_stretching", Settings::values.enable_audio_stretching);
233 qt_config->setValue("output_device", QString::fromStdString(Settings::values.audio_device_id)); 236 qt_config->setValue("output_device", QString::fromStdString(Settings::values.audio_device_id));
234 qt_config->setValue("volume", Settings::values.volume); 237 qt_config->setValue("volume", Settings::values.volume);
235 qt_config->endGroup(); 238 qt_config->endGroup();
diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp
index fbb813f6c..6ea59f2a3 100644
--- a/src/yuzu/configuration/configure_audio.cpp
+++ b/src/yuzu/configuration/configure_audio.cpp
@@ -46,6 +46,8 @@ void ConfigureAudio::setConfiguration() {
46 } 46 }
47 ui->output_sink_combo_box->setCurrentIndex(new_sink_index); 47 ui->output_sink_combo_box->setCurrentIndex(new_sink_index);
48 48
49 ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching);
50
49 // The device list cannot be pre-populated (nor listed) until the output sink is known. 51 // The device list cannot be pre-populated (nor listed) until the output sink is known.
50 updateAudioDevices(new_sink_index); 52 updateAudioDevices(new_sink_index);
51 53
@@ -67,6 +69,7 @@ void ConfigureAudio::applyConfiguration() {
67 Settings::values.sink_id = 69 Settings::values.sink_id =
68 ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex()) 70 ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex())
69 .toStdString(); 71 .toStdString();
72 Settings::values.enable_audio_stretching = ui->toggle_audio_stretching->isChecked();
70 Settings::values.audio_device_id = 73 Settings::values.audio_device_id =
71 ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex()) 74 ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex())
72 .toStdString(); 75 .toStdString();
diff --git a/src/yuzu/configuration/configure_audio.ui b/src/yuzu/configuration/configure_audio.ui
index ef67890dc..a29a0e265 100644
--- a/src/yuzu/configuration/configure_audio.ui
+++ b/src/yuzu/configuration/configure_audio.ui
@@ -31,6 +31,16 @@
31 </item> 31 </item>
32 </layout> 32 </layout>
33 </item> 33 </item>
34 <item>
35 <widget class="QCheckBox" name="toggle_audio_stretching">
36 <property name="toolTip">
37 <string>This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency.</string>
38 </property>
39 <property name="text">
40 <string>Enable audio stretching</string>
41 </property>
42 </widget>
43 </item>
34 <item> 44 <item>
35 <layout class="QHBoxLayout"> 45 <layout class="QHBoxLayout">
36 <item> 46 <item>
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index f00b5a66b..991abda2e 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -108,6 +108,8 @@ void Config::ReadValues() {
108 108
109 // Audio 109 // Audio
110 Settings::values.sink_id = sdl2_config->Get("Audio", "output_engine", "auto"); 110 Settings::values.sink_id = sdl2_config->Get("Audio", "output_engine", "auto");
111 Settings::values.enable_audio_stretching =
112 sdl2_config->GetBoolean("Audio", "enable_audio_stretching", true);
111 Settings::values.audio_device_id = sdl2_config->Get("Audio", "output_device", "auto"); 113 Settings::values.audio_device_id = sdl2_config->Get("Audio", "output_device", "auto");
112 Settings::values.volume = sdl2_config->GetReal("Audio", "volume", 1); 114 Settings::values.volume = sdl2_config->GetReal("Audio", "volume", 1);
113 115
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h
index 6ed9e7962..002a4ec15 100644
--- a/src/yuzu_cmd/default_ini.h
+++ b/src/yuzu_cmd/default_ini.h
@@ -150,6 +150,12 @@ swap_screen =
150# auto (default): Auto-select, null: No audio output, cubeb: Cubeb audio engine (if available) 150# auto (default): Auto-select, null: No audio output, cubeb: Cubeb audio engine (if available)
151output_engine = 151output_engine =
152 152
153# Whether or not to enable the audio-stretching post-processing effect.
154# This effect adjusts audio speed to match emulation speed and helps prevent audio stutter,
155# at the cost of increasing audio latency.
156# 0: No, 1 (default): Yes
157enable_audio_stretching =
158
153# Which audio device to use. 159# Which audio device to use.
154# auto (default): Auto-select 160# auto (default): Auto-select
155output_device = 161output_device =