Qt: Add default option for cubeb driver

This commit is contained in:
Stenzek 2024-05-05 12:51:31 +10:00
parent fea00d0149
commit d6e80de3bf
No known key found for this signature in database
5 changed files with 44 additions and 18 deletions

View file

@ -181,7 +181,7 @@ AudioBackend AudioSettingsWidget::getEffectiveBackend() const
void AudioSettingsWidget::updateDriverNames() void AudioSettingsWidget::updateDriverNames()
{ {
const AudioBackend backend = getEffectiveBackend(); const AudioBackend backend = getEffectiveBackend();
const std::vector<std::string> names = AudioStream::GetDriverNames(backend); const std::vector<std::pair<std::string, std::string>> names = AudioStream::GetDriverNames(backend);
m_ui.driver->disconnect(); m_ui.driver->disconnect();
m_ui.driver->clear(); m_ui.driver->clear();
@ -193,11 +193,11 @@ void AudioSettingsWidget::updateDriverNames()
else else
{ {
m_ui.driver->setEnabled(true); m_ui.driver->setEnabled(true);
for (const std::string& name : names) for (const auto& [name, display_name] : names)
m_ui.driver->addItem(QString::fromStdString(name)); m_ui.driver->addItem(QString::fromStdString(display_name), QString::fromStdString(name));
SettingWidgetBinder::BindWidgetToStringSetting(m_dialog->getSettingsInterface(), m_ui.driver, "Audio", "Driver", 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); connect(m_ui.driver, &QComboBox::currentIndexChanged, this, &AudioSettingsWidget::updateDeviceNames);
} }
@ -223,11 +223,22 @@ void AudioSettingsWidget::updateDeviceNames()
else else
{ {
m_ui.outputDevice->setEnabled(true); m_ui.outputDevice->setEnabled(true);
bool is_known_device = false;
for (const AudioStream::DeviceInfo& di : devices) for (const AudioStream::DeviceInfo& di : devices)
{ {
m_ui.outputDevice->addItem(QString::fromStdString(di.display_name), QString::fromStdString(di.name)); m_ui.outputDevice->addItem(QString::fromStdString(di.display_name), QString::fromStdString(di.name));
if (di.name == current_device) if (di.name == current_device)
{
m_output_device_latency = di.minimum_latency_frames; 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", SettingWidgetBinder::BindWidgetToStringSetting(m_dialog->getSettingsInterface(), m_ui.outputDevice, "Audio",

View file

@ -249,7 +249,7 @@
<item> <item>
<widget class="QToolButton" name="resetVolume"> <widget class="QToolButton" name="resetVolume">
<property name="toolTip"> <property name="toolTip">
<string>Stretch Settings</string> <string>Reset Volume</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="refresh-line"/> <iconset theme="refresh-line"/>
@ -298,7 +298,7 @@
<item> <item>
<widget class="QToolButton" name="resetFastForwardVolume"> <widget class="QToolButton" name="resetFastForwardVolume">
<property name="toolTip"> <property name="toolTip">
<string>Stretch Settings</string> <string>Reset Fast Forward Volume</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="refresh-line"/> <iconset theme="refresh-line"/>

View file

@ -70,16 +70,16 @@ std::unique_ptr<AudioStream> AudioStream::CreateNullStream(u32 sample_rate, u32
return stream; return stream;
} }
#ifndef __ANDROID__ std::vector<std::pair<std::string, std::string>> AudioStream::GetDriverNames(AudioBackend backend)
std::vector<std::string> AudioStream::GetDriverNames(AudioBackend backend)
{ {
std::vector<std::string> ret; std::vector<std::pair<std::string, std::string>> ret;
switch (backend) switch (backend)
{ {
#ifndef __ANDROID__
case AudioBackend::Cubeb: case AudioBackend::Cubeb:
ret = GetCubebDriverNames(); ret = GetCubebDriverNames();
break; break;
#endif
default: default:
break; break;
@ -93,9 +93,11 @@ std::vector<AudioStream::DeviceInfo> AudioStream::GetOutputDevices(AudioBackend
std::vector<AudioStream::DeviceInfo> ret; std::vector<AudioStream::DeviceInfo> ret;
switch (backend) switch (backend)
{ {
#ifndef __ANDROID__
case AudioBackend::Cubeb: case AudioBackend::Cubeb:
ret = GetCubebOutputDevices(driver); ret = GetCubebOutputDevices(driver);
break; break;
#endif
default: default:
break; break;
@ -110,11 +112,19 @@ std::unique_ptr<AudioStream> AudioStream::CreateStream(AudioBackend backend, u32
{ {
switch (backend) switch (backend)
{ {
#ifndef __ANDROID__
case AudioBackend::Cubeb: case AudioBackend::Cubeb:
return CreateCubebAudioStream(sample_rate, parameters, driver_name, device_name, error); return CreateCubebAudioStream(sample_rate, parameters, driver_name, device_name, error);
case AudioBackend::SDL: case AudioBackend::SDL:
return CreateSDLAudioStream(sample_rate, parameters, error); 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: case AudioBackend::Null:
return CreateNullStream(sample_rate, parameters.buffer_ms); return CreateNullStream(sample_rate, parameters.buffer_ms);
@ -125,8 +135,6 @@ std::unique_ptr<AudioStream> AudioStream::CreateStream(AudioBackend backend, u32
} }
} }
#endif
u32 AudioStream::GetAlignedBufferSize(u32 size) u32 AudioStream::GetAlignedBufferSize(u32 size)
{ {
static_assert(Common::IsPow2(CHUNK_SIZE)); static_assert(Common::IsPow2(CHUNK_SIZE));

View file

@ -191,7 +191,7 @@ public:
void SetStretchMode(AudioStretchMode mode); void SetStretchMode(AudioStretchMode mode);
static std::vector<std::string> GetDriverNames(AudioBackend backend); static std::vector<std::pair<std::string, std::string>> GetDriverNames(AudioBackend backend);
static std::vector<DeviceInfo> GetOutputDevices(AudioBackend backend, const char* driver); static std::vector<DeviceInfo> GetOutputDevices(AudioBackend backend, const char* driver);
static std::unique_ptr<AudioStream> CreateStream(AudioBackend backend, u32 sample_rate, static std::unique_ptr<AudioStream> CreateStream(AudioBackend backend, u32 sample_rate,
const AudioStreamParameters& parameters, const char* driver_name, const AudioStreamParameters& parameters, const char* driver_name,
@ -241,13 +241,18 @@ private:
static constexpr u32 TARGET_IPS = 691; static constexpr u32 TARGET_IPS = 691;
#ifndef __ANDROID__ #ifndef __ANDROID__
static std::vector<std::string> GetCubebDriverNames(); static std::vector<std::pair<std::string, std::string>> GetCubebDriverNames();
static std::vector<DeviceInfo> GetCubebOutputDevices(const char* driver); static std::vector<DeviceInfo> GetCubebOutputDevices(const char* driver);
static std::unique_ptr<AudioStream> CreateCubebAudioStream(u32 sample_rate, const AudioStreamParameters& parameters, static std::unique_ptr<AudioStream> CreateCubebAudioStream(u32 sample_rate, const AudioStreamParameters& parameters,
const char* driver_name, const char* device_name, const char* driver_name, const char* device_name,
Error* error); Error* error);
static std::unique_ptr<AudioStream> CreateSDLAudioStream(u32 sample_rate, const AudioStreamParameters& parameters, static std::unique_ptr<AudioStream> CreateSDLAudioStream(u32 sample_rate, const AudioStreamParameters& parameters,
Error* error); Error* error);
#else
static std::unique_ptr<AudioStream> CreateAAudioAudioStream(u32 sample_rate, const AudioStreamParameters& parameters,
Error* error);
static std::unique_ptr<AudioStream> CreateOpenSLESAudioStream(u32 sample_rate,
const AudioStreamParameters& parameters, Error* error);
#endif #endif
ALWAYS_INLINE bool IsExpansionEnabled() const { return m_parameters.expansion_mode != AudioExpansionMode::Disabled; } ALWAYS_INLINE bool IsExpansionEnabled() const { return m_parameters.expansion_mode != AudioExpansionMode::Disabled; }

View file

@ -300,19 +300,21 @@ std::unique_ptr<AudioStream> AudioStream::CreateCubebAudioStream(u32 sample_rate
return stream; return stream;
} }
std::vector<std::string> AudioStream::GetCubebDriverNames() std::vector<std::pair<std::string, std::string>> AudioStream::GetCubebDriverNames()
{ {
std::vector<std::string> names; std::vector<std::pair<std::string, std::string>> names;
names.emplace_back(std::string(), TRANSLATE_STR("AudioStream", "Default"));
const char** cubeb_names = cubeb_get_backend_names(); const char** cubeb_names = cubeb_get_backend_names();
for (u32 i = 0; cubeb_names[i] != nullptr; i++) 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; return names;
} }
std::vector<AudioStream::DeviceInfo> AudioStream::GetCubebOutputDevices(const char* driver) std::vector<AudioStream::DeviceInfo> AudioStream::GetCubebOutputDevices(const char* driver)
{ {
std::vector<AudioStream::DeviceInfo> ret; std::vector<AudioStream::DeviceInfo> 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; cubeb* context;
int rv = cubeb_init(&context, "DuckStation", (driver && *driver) ? driver : nullptr); int rv = cubeb_init(&context, "DuckStation", (driver && *driver) ? driver : nullptr);