diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/audio_core/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/audio_core/cubeb_sink.cpp | 7 | ||||
| -rw-r--r-- | src/audio_core/null_sink.h | 4 | ||||
| -rw-r--r-- | src/audio_core/sink_stream.h | 2 | ||||
| -rw-r--r-- | src/audio_core/stream.cpp | 1 | ||||
| -rw-r--r-- | src/core/settings.h | 1 | ||||
| -rw-r--r-- | src/core/telemetry_session.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_audio.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_audio.ui | 10 | ||||
| -rw-r--r-- | src/yuzu_cmd/config.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu_cmd/default_ini.h | 6 |
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 | |||
| 24 | create_target_directory_groups(audio_core) | 24 | create_target_directory_groups(audio_core) |
| 25 | 25 | ||
| 26 | target_link_libraries(audio_core PUBLIC common core) | 26 | target_link_libraries(audio_core PUBLIC common core) |
| 27 | target_link_libraries(audio_core PRIVATE SoundTouch) | ||
| 27 | 28 | ||
| 28 | if(ENABLE_CUBEB) | 29 | if(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: | |||
| 21 | private: | 21 | private: |
| 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 | ||
| 30 | using SinkStreamPtr = std::unique_ptr<SinkStream>; | 32 | using 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) |
| 151 | output_engine = | 151 | output_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 | ||
| 157 | enable_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 |
| 155 | output_device = | 161 | output_device = |