diff --git a/src/duckstation-qt/audiosettingswidget.cpp b/src/duckstation-qt/audiosettingswidget.cpp index 707c84a4c1..592fed60d8 100644 --- a/src/duckstation-qt/audiosettingswidget.cpp +++ b/src/duckstation-qt/audiosettingswidget.cpp @@ -181,7 +181,7 @@ AudioBackend AudioSettingsWidget::getEffectiveBackend() const void AudioSettingsWidget::updateDriverNames() { const AudioBackend backend = getEffectiveBackend(); - const std::vector names = AudioStream::GetDriverNames(backend); + const std::vector> names = AudioStream::GetDriverNames(backend); m_ui.driver->disconnect(); m_ui.driver->clear(); @@ -193,11 +193,11 @@ void AudioSettingsWidget::updateDriverNames() else { m_ui.driver->setEnabled(true); - for (const std::string& name : names) - m_ui.driver->addItem(QString::fromStdString(name)); + for (const auto& [name, display_name] : names) + m_ui.driver->addItem(QString::fromStdString(display_name), QString::fromStdString(name)); SettingWidgetBinder::BindWidgetToStringSetting(m_dialog->getSettingsInterface(), m_ui.driver, "Audio", "Driver", - std::move(names.front())); + std::move(names.front().first)); connect(m_ui.driver, &QComboBox::currentIndexChanged, this, &AudioSettingsWidget::updateDeviceNames); } @@ -223,11 +223,22 @@ void AudioSettingsWidget::updateDeviceNames() else { m_ui.outputDevice->setEnabled(true); + + bool is_known_device = false; for (const AudioStream::DeviceInfo& di : devices) { m_ui.outputDevice->addItem(QString::fromStdString(di.display_name), QString::fromStdString(di.name)); if (di.name == current_device) + { m_output_device_latency = di.minimum_latency_frames; + is_known_device = true; + } + } + + if (!is_known_device) + { + m_ui.outputDevice->addItem(tr("Unknown Device \"%1\"").arg(QString::fromStdString(current_device)), + QString::fromStdString(current_device)); } SettingWidgetBinder::BindWidgetToStringSetting(m_dialog->getSettingsInterface(), m_ui.outputDevice, "Audio", diff --git a/src/duckstation-qt/audiosettingswidget.ui b/src/duckstation-qt/audiosettingswidget.ui index d03773e960..7f40959705 100644 --- a/src/duckstation-qt/audiosettingswidget.ui +++ b/src/duckstation-qt/audiosettingswidget.ui @@ -249,7 +249,7 @@ - Stretch Settings + Reset Volume @@ -298,7 +298,7 @@ - Stretch Settings + Reset Fast Forward Volume diff --git a/src/util/audio_stream.cpp b/src/util/audio_stream.cpp index 6987484ef9..6808ff06b8 100644 --- a/src/util/audio_stream.cpp +++ b/src/util/audio_stream.cpp @@ -70,16 +70,16 @@ std::unique_ptr AudioStream::CreateNullStream(u32 sample_rate, u32 return stream; } -#ifndef __ANDROID__ - -std::vector AudioStream::GetDriverNames(AudioBackend backend) +std::vector> AudioStream::GetDriverNames(AudioBackend backend) { - std::vector ret; + std::vector> ret; switch (backend) { +#ifndef __ANDROID__ case AudioBackend::Cubeb: ret = GetCubebDriverNames(); break; +#endif default: break; @@ -93,9 +93,11 @@ std::vector AudioStream::GetOutputDevices(AudioBackend std::vector ret; switch (backend) { +#ifndef __ANDROID__ case AudioBackend::Cubeb: ret = GetCubebOutputDevices(driver); break; +#endif default: break; @@ -110,11 +112,19 @@ std::unique_ptr AudioStream::CreateStream(AudioBackend backend, u32 { switch (backend) { +#ifndef __ANDROID__ case AudioBackend::Cubeb: return CreateCubebAudioStream(sample_rate, parameters, driver_name, device_name, error); case AudioBackend::SDL: return CreateSDLAudioStream(sample_rate, parameters, error); +#else + case AudioBackend::AAudio: + return CreateAAudioAudioStream(sample_rate, parameters, error); + + case AudioBackend::OpenSLES: + return CreateOpenSLESAudioStream(sample_rate, parameters, error); +#endif case AudioBackend::Null: return CreateNullStream(sample_rate, parameters.buffer_ms); @@ -125,8 +135,6 @@ std::unique_ptr AudioStream::CreateStream(AudioBackend backend, u32 } } -#endif - u32 AudioStream::GetAlignedBufferSize(u32 size) { static_assert(Common::IsPow2(CHUNK_SIZE)); diff --git a/src/util/audio_stream.h b/src/util/audio_stream.h index c9f6dc99ec..852561e5ee 100644 --- a/src/util/audio_stream.h +++ b/src/util/audio_stream.h @@ -191,7 +191,7 @@ class AudioStream void SetStretchMode(AudioStretchMode mode); - static std::vector GetDriverNames(AudioBackend backend); + static std::vector> GetDriverNames(AudioBackend backend); static std::vector GetOutputDevices(AudioBackend backend, const char* driver); static std::unique_ptr CreateStream(AudioBackend backend, u32 sample_rate, const AudioStreamParameters& parameters, const char* driver_name, @@ -241,13 +241,18 @@ class AudioStream static constexpr u32 TARGET_IPS = 691; #ifndef __ANDROID__ - static std::vector GetCubebDriverNames(); + static std::vector> GetCubebDriverNames(); static std::vector GetCubebOutputDevices(const char* driver); static std::unique_ptr CreateCubebAudioStream(u32 sample_rate, const AudioStreamParameters& parameters, const char* driver_name, const char* device_name, Error* error); static std::unique_ptr CreateSDLAudioStream(u32 sample_rate, const AudioStreamParameters& parameters, Error* error); +#else + static std::unique_ptr CreateAAudioAudioStream(u32 sample_rate, const AudioStreamParameters& parameters, + Error* error); + static std::unique_ptr CreateOpenSLESAudioStream(u32 sample_rate, + const AudioStreamParameters& parameters, Error* error); #endif ALWAYS_INLINE bool IsExpansionEnabled() const { return m_parameters.expansion_mode != AudioExpansionMode::Disabled; } diff --git a/src/util/cubeb_audio_stream.cpp b/src/util/cubeb_audio_stream.cpp index 686a8374db..8bd0f29acf 100644 --- a/src/util/cubeb_audio_stream.cpp +++ b/src/util/cubeb_audio_stream.cpp @@ -300,19 +300,21 @@ std::unique_ptr AudioStream::CreateCubebAudioStream(u32 sample_rate return stream; } -std::vector AudioStream::GetCubebDriverNames() +std::vector> AudioStream::GetCubebDriverNames() { - std::vector names; + std::vector> names; + names.emplace_back(std::string(), TRANSLATE_STR("AudioStream", "Default")); + const char** cubeb_names = cubeb_get_backend_names(); for (u32 i = 0; cubeb_names[i] != nullptr; i++) - names.emplace_back(cubeb_names[i]); + names.emplace_back(cubeb_names[i], cubeb_names[i]); return names; } std::vector AudioStream::GetCubebOutputDevices(const char* driver) { std::vector ret; - ret.emplace_back(std::string(), TRANSLATE_STR("AudioStream", "Default Output Device"), 0); + ret.emplace_back(std::string(), TRANSLATE_STR("AudioStream", "Default"), 0); cubeb* context; int rv = cubeb_init(&context, "DuckStation", (driver && *driver) ? driver : nullptr);