SDL: Select audio device (#2403)

* Initial Commit

Added Device logic to Sinks
Started on UI for selecting devices

Removed redundant import

* Audio Core: Complete Device Switching

Complete the device switching implementation by allowing the output
device to be loaded, changed and saved through the configurations menu.

Worked with the Sink abstraction and tuned the "Device Selection"
configuration so that the Device List is automatically populated when
the Sink is changed.
This hopefully addresses the concerns and recommendations mentioned in
the comments of the PR.

* Clean original implementation.

* Refactor GetSinkDetails
This commit is contained in:
Kloen Lansfiel 2017-01-26 04:33:26 +01:00 committed by Sebastian Valle
parent 3feb3ce283
commit f852369986
14 changed files with 129 additions and 18 deletions

View file

@ -63,6 +63,8 @@ void Config::ReadValues() {
Settings::values.sink_id = qt_config->value("output_engine", "auto").toString().toStdString();
Settings::values.enable_audio_stretching =
qt_config->value("enable_audio_stretching", true).toBool();
Settings::values.audio_device_id =
qt_config->value("output_device", "auto").toString().toStdString();
qt_config->endGroup();
qt_config->beginGroup("Data Storage");
@ -169,6 +171,7 @@ void Config::SaveValues() {
qt_config->beginGroup("Audio");
qt_config->setValue("output_engine", QString::fromStdString(Settings::values.sink_id));
qt_config->setValue("enable_audio_stretching", Settings::values.enable_audio_stretching);
qt_config->setValue("output_device", QString::fromStdString(Settings::values.audio_device_id));
qt_config->endGroup();
qt_config->beginGroup("Data Storage");

View file

@ -2,6 +2,9 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include <memory>
#include "audio_core/audio_core.h"
#include "audio_core/sink.h"
#include "audio_core/sink_details.h"
#include "citra_qt/configure_audio.h"
#include "core/settings.h"
@ -18,6 +21,8 @@ ConfigureAudio::ConfigureAudio(QWidget* parent)
}
this->setConfiguration();
connect(ui->output_sink_combo_box, SIGNAL(currentIndexChanged(int)), this,
SLOT(updateAudioDevices(int)));
}
ConfigureAudio::~ConfigureAudio() {}
@ -33,6 +38,19 @@ void ConfigureAudio::setConfiguration() {
ui->output_sink_combo_box->setCurrentIndex(new_sink_index);
ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching);
// The device list cannot be pre-populated (nor listed) until the output sink is known.
updateAudioDevices(new_sink_index);
int new_device_index = -1;
for (int index = 0; index < ui->audio_device_combo_box->count(); index++) {
if (ui->audio_device_combo_box->itemText(index).toStdString() ==
Settings::values.audio_device_id) {
new_device_index = index;
break;
}
}
ui->audio_device_combo_box->setCurrentIndex(new_device_index);
}
void ConfigureAudio::applyConfiguration() {
@ -40,5 +58,20 @@ void ConfigureAudio::applyConfiguration() {
ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex())
.toStdString();
Settings::values.enable_audio_stretching = ui->toggle_audio_stretching->isChecked();
Settings::values.audio_device_id =
ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex())
.toStdString();
Settings::Apply();
}
void ConfigureAudio::updateAudioDevices(int sink_index) {
ui->audio_device_combo_box->clear();
ui->audio_device_combo_box->addItem("auto");
std::string sink_id = ui->output_sink_combo_box->itemText(sink_index).toStdString();
std::vector<std::string> device_list =
AudioCore::GetSinkDetails(sink_id).factory()->GetDeviceList();
for (const auto& device : device_list) {
ui->audio_device_combo_box->addItem(device.c_str());
}
}

View file

@ -20,6 +20,9 @@ public:
void applyConfiguration();
public slots:
void updateAudioDevices(int sink_index);
private:
void setConfiguration();

View file

@ -35,6 +35,21 @@
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QLabel">
<property name="text">
<string>Audio Device:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="audio_device_combo_box">
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>