mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	audio_core: Implement OpenAL backend (#6450)
This commit is contained in:
		
							parent
							
								
									ce553ab995
								
							
						
					
					
						commit
						055a58f01e
					
				
					 48 changed files with 1042 additions and 576 deletions
				
			
		|  | @ -10,7 +10,6 @@ | |||
| #include "citra_qt/configuration/config.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/frontend/mic.h" | ||||
| #include "core/hle/service/service.h" | ||||
| #include "input_common/main.h" | ||||
| #include "input_common/udp/client.h" | ||||
|  | @ -276,10 +275,10 @@ void Config::ReadAudioValues() { | |||
|     ReadGlobalSetting(Settings::values.volume); | ||||
| 
 | ||||
|     if (global) { | ||||
|         ReadBasicSetting(Settings::values.sink_id); | ||||
|         ReadBasicSetting(Settings::values.audio_device_id); | ||||
|         ReadBasicSetting(Settings::values.mic_input_device); | ||||
|         ReadBasicSetting(Settings::values.mic_input_type); | ||||
|         ReadBasicSetting(Settings::values.output_type); | ||||
|         ReadBasicSetting(Settings::values.output_device); | ||||
|         ReadBasicSetting(Settings::values.input_type); | ||||
|         ReadBasicSetting(Settings::values.input_device); | ||||
|     } | ||||
| 
 | ||||
|     qt_config->endGroup(); | ||||
|  | @ -847,10 +846,10 @@ void Config::SaveAudioValues() { | |||
|     WriteGlobalSetting(Settings::values.volume); | ||||
| 
 | ||||
|     if (global) { | ||||
|         WriteBasicSetting(Settings::values.sink_id); | ||||
|         WriteBasicSetting(Settings::values.audio_device_id); | ||||
|         WriteBasicSetting(Settings::values.mic_input_device); | ||||
|         WriteBasicSetting(Settings::values.mic_input_type); | ||||
|         WriteBasicSetting(Settings::values.output_type); | ||||
|         WriteBasicSetting(Settings::values.output_device); | ||||
|         WriteBasicSetting(Settings::values.input_type); | ||||
|         WriteBasicSetting(Settings::values.input_device); | ||||
|     } | ||||
| 
 | ||||
|     qt_config->endGroup(); | ||||
|  |  | |||
|  | @ -4,32 +4,27 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <QtGlobal> | ||||
| #ifdef HAVE_CUBEB | ||||
| #include "audio_core/cubeb_input.h" | ||||
| #endif | ||||
| #include "audio_core/input_details.h" | ||||
| #include "audio_core/sink.h" | ||||
| #include "audio_core/sink_details.h" | ||||
| #include "citra_qt/configuration/configuration_shared.h" | ||||
| #include "citra_qt/configuration/configure_audio.h" | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "core/frontend/mic.h" | ||||
| #include "ui_configure_audio.h" | ||||
| 
 | ||||
| #if defined(__APPLE__) | ||||
| #include "citra_qt/macos_authorization.h" | ||||
| #endif | ||||
| 
 | ||||
| constexpr int DEFAULT_INPUT_DEVICE_INDEX = 0; | ||||
| 
 | ||||
| ConfigureAudio::ConfigureAudio(QWidget* parent) | ||||
|     : QWidget(parent), ui(std::make_unique<Ui::ConfigureAudio>()) { | ||||
|     ui->setupUi(this); | ||||
| 
 | ||||
|     ui->output_sink_combo_box->clear(); | ||||
|     ui->output_sink_combo_box->addItem(QString::fromUtf8(AudioCore::auto_device_name)); | ||||
|     for (const char* id : AudioCore::GetSinkIDs()) { | ||||
|         ui->output_sink_combo_box->addItem(QString::fromUtf8(id)); | ||||
|     ui->output_type_combo_box->clear(); | ||||
|     for (u32 type = 0; type < static_cast<u32>(AudioCore::SinkType::NumSinkTypes); type++) { | ||||
|         ui->output_type_combo_box->addItem(QString::fromUtf8( | ||||
|             AudioCore::GetSinkName(static_cast<AudioCore::SinkType>(type)).data())); | ||||
|     } | ||||
| 
 | ||||
|     const bool is_running = Core::System::GetInstance().IsPoweredOn(); | ||||
|  | @ -38,17 +33,11 @@ ConfigureAudio::ConfigureAudio(QWidget* parent) | |||
|     connect(ui->volume_slider, &QSlider::valueChanged, this, | ||||
|             &ConfigureAudio::SetVolumeIndicatorText); | ||||
| 
 | ||||
|     ui->input_device_combo_box->clear(); | ||||
|     ui->input_device_combo_box->addItem(tr("Default")); | ||||
| 
 | ||||
| #ifdef HAVE_CUBEB | ||||
|     for (const auto& device : AudioCore::ListCubebInputDevices()) { | ||||
|         ui->input_device_combo_box->addItem(QString::fromStdString(device)); | ||||
|     ui->input_type_combo_box->clear(); | ||||
|     for (u32 type = 0; type < static_cast<u32>(AudioCore::InputType::NumInputTypes); type++) { | ||||
|         ui->input_type_combo_box->addItem(QString::fromUtf8( | ||||
|             AudioCore::GetInputName(static_cast<AudioCore::InputType>(type)).data())); | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     connect(ui->input_type_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|             &ConfigureAudio::UpdateAudioInputDevices); | ||||
| 
 | ||||
|     ui->volume_label->setVisible(Settings::IsConfiguringGlobal()); | ||||
|     ui->volume_combo_box->setVisible(!Settings::IsConfiguringGlobal()); | ||||
|  | @ -56,18 +45,23 @@ ConfigureAudio::ConfigureAudio(QWidget* parent) | |||
|     SetupPerGameUI(); | ||||
|     SetConfiguration(); | ||||
| 
 | ||||
|     connect(ui->output_sink_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|     connect(ui->output_type_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|             &ConfigureAudio::UpdateAudioOutputDevices); | ||||
|     connect(ui->input_type_combo_box, qOverload<int>(&QComboBox::currentIndexChanged), this, | ||||
|             &ConfigureAudio::UpdateAudioInputDevices); | ||||
| } | ||||
| 
 | ||||
| ConfigureAudio::~ConfigureAudio() {} | ||||
| 
 | ||||
| void ConfigureAudio::SetConfiguration() { | ||||
|     SetOutputSinkFromSinkID(); | ||||
|     SetOutputTypeFromSinkType(); | ||||
|     SetInputTypeFromInputType(); | ||||
| 
 | ||||
|     // The device list cannot be pre-populated (nor listed) until the output sink is known.
 | ||||
|     UpdateAudioOutputDevices(ui->output_sink_combo_box->currentIndex()); | ||||
|     SetAudioDeviceFromDeviceID(); | ||||
|     UpdateAudioOutputDevices(ui->output_type_combo_box->currentIndex()); | ||||
|     UpdateAudioInputDevices(ui->input_type_combo_box->currentIndex()); | ||||
|     SetOutputDeviceFromDeviceID(); | ||||
|     SetInputDeviceFromDeviceID(); | ||||
| 
 | ||||
|     ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching.GetValue()); | ||||
| 
 | ||||
|  | @ -94,39 +88,44 @@ void ConfigureAudio::SetConfiguration() { | |||
|         s32 selection = static_cast<s32>(Settings::values.audio_emulation.GetValue()); | ||||
|         ui->emulation_combo_box->setCurrentIndex(selection); | ||||
|     } | ||||
| 
 | ||||
|     s32 index = static_cast<s32>(Settings::values.mic_input_type.GetValue()); | ||||
|     ui->input_type_combo_box->setCurrentIndex(index); | ||||
| 
 | ||||
|     UpdateAudioInputDevices(index); | ||||
| } | ||||
| 
 | ||||
| void ConfigureAudio::SetOutputSinkFromSinkID() { | ||||
|     int new_sink_index = 0; | ||||
| 
 | ||||
|     const QString sink_id = QString::fromStdString(Settings::values.sink_id.GetValue()); | ||||
|     for (int index = 0; index < ui->output_sink_combo_box->count(); index++) { | ||||
|         if (ui->output_sink_combo_box->itemText(index) == sink_id) { | ||||
|             new_sink_index = index; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     ui->output_sink_combo_box->setCurrentIndex(new_sink_index); | ||||
| void ConfigureAudio::SetOutputTypeFromSinkType() { | ||||
|     ui->output_type_combo_box->setCurrentIndex( | ||||
|         static_cast<int>(Settings::values.output_type.GetValue())); | ||||
| } | ||||
| 
 | ||||
| void ConfigureAudio::SetAudioDeviceFromDeviceID() { | ||||
| void ConfigureAudio::SetOutputDeviceFromDeviceID() { | ||||
|     int new_device_index = -1; | ||||
| 
 | ||||
|     const QString device_id = QString::fromStdString(Settings::values.audio_device_id.GetValue()); | ||||
|     for (int index = 0; index < ui->audio_device_combo_box->count(); index++) { | ||||
|         if (ui->audio_device_combo_box->itemText(index) == device_id) { | ||||
|     const QString device_id = QString::fromStdString(Settings::values.output_device.GetValue()); | ||||
|     for (int index = 0; index < ui->output_device_combo_box->count(); index++) { | ||||
|         if (ui->output_device_combo_box->itemText(index) == device_id) { | ||||
|             new_device_index = index; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     ui->audio_device_combo_box->setCurrentIndex(new_device_index); | ||||
|     ui->output_device_combo_box->setCurrentIndex(new_device_index); | ||||
| } | ||||
| 
 | ||||
| void ConfigureAudio::SetInputTypeFromInputType() { | ||||
|     ui->input_type_combo_box->setCurrentIndex( | ||||
|         static_cast<int>(Settings::values.input_type.GetValue())); | ||||
| } | ||||
| 
 | ||||
| void ConfigureAudio::SetInputDeviceFromDeviceID() { | ||||
|     int new_device_index = -1; | ||||
| 
 | ||||
|     const QString device_id = QString::fromStdString(Settings::values.input_device.GetValue()); | ||||
|     for (int index = 0; index < ui->input_device_combo_box->count(); index++) { | ||||
|         if (ui->input_device_combo_box->itemText(index) == device_id) { | ||||
|             new_device_index = index; | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     ui->input_device_combo_box->setCurrentIndex(new_device_index); | ||||
| } | ||||
| 
 | ||||
| void ConfigureAudio::SetVolumeIndicatorText(int percentage) { | ||||
|  | @ -144,43 +143,40 @@ void ConfigureAudio::ApplyConfiguration() { | |||
|         }); | ||||
| 
 | ||||
|     if (Settings::IsConfiguringGlobal()) { | ||||
|         Settings::values.sink_id = | ||||
|             ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex()) | ||||
|                 .toStdString(); | ||||
|         Settings::values.audio_device_id = | ||||
|             ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex()) | ||||
|                 .toStdString(); | ||||
|         Settings::values.mic_input_type = | ||||
|             static_cast<Settings::MicInputType>(ui->input_type_combo_box->currentIndex()); | ||||
| 
 | ||||
|         if (ui->input_device_combo_box->currentIndex() == DEFAULT_INPUT_DEVICE_INDEX) { | ||||
|             Settings::values.mic_input_device = Frontend::Mic::default_device_name; | ||||
|         } else { | ||||
|             Settings::values.mic_input_device = | ||||
|                 ui->input_device_combo_box->currentText().toStdString(); | ||||
|         } | ||||
|         Settings::values.output_type = | ||||
|             static_cast<AudioCore::SinkType>(ui->output_type_combo_box->currentIndex()); | ||||
|         Settings::values.output_device = ui->output_device_combo_box->currentText().toStdString(); | ||||
|         Settings::values.input_type = | ||||
|             static_cast<AudioCore::InputType>(ui->input_type_combo_box->currentIndex()); | ||||
|         Settings::values.input_device = ui->input_device_combo_box->currentText().toStdString(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void ConfigureAudio::UpdateAudioOutputDevices(int sink_index) { | ||||
|     ui->audio_device_combo_box->clear(); | ||||
|     ui->audio_device_combo_box->addItem(QString::fromUtf8(AudioCore::auto_device_name)); | ||||
|     auto sink_type = static_cast<AudioCore::SinkType>(sink_index); | ||||
| 
 | ||||
|     const std::string sink_id = ui->output_sink_combo_box->itemText(sink_index).toStdString(); | ||||
|     for (const auto& device : AudioCore::GetDeviceListForSink(sink_id)) { | ||||
|         ui->audio_device_combo_box->addItem(QString::fromStdString(device)); | ||||
|     ui->output_device_combo_box->clear(); | ||||
|     ui->output_device_combo_box->addItem(QString::fromUtf8(AudioCore::auto_device_name)); | ||||
| 
 | ||||
|     for (const auto& device : AudioCore::GetDeviceListForSink(sink_type)) { | ||||
|         ui->output_device_combo_box->addItem(QString::fromStdString(device)); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void ConfigureAudio::UpdateAudioInputDevices(int index) { | ||||
| void ConfigureAudio::UpdateAudioInputDevices(int input_index) { | ||||
|     auto input_type = static_cast<AudioCore::InputType>(input_index); | ||||
| 
 | ||||
| #if defined(__APPLE__) | ||||
|     if (index == 1) { | ||||
|     if (input_type != AudioCore::InputType::Null && input_type != AudioCore::InputType::Static) { | ||||
|         AppleAuthorization::CheckAuthorizationForMicrophone(); | ||||
|     } | ||||
| #endif | ||||
|     if (Settings::values.mic_input_device.GetValue() != Frontend::Mic::default_device_name) { | ||||
|         ui->input_device_combo_box->setCurrentText( | ||||
|             QString::fromStdString(Settings::values.mic_input_device.GetValue())); | ||||
| 
 | ||||
|     ui->input_device_combo_box->clear(); | ||||
|     ui->input_device_combo_box->addItem(QString::fromUtf8(AudioCore::auto_device_name)); | ||||
| 
 | ||||
|     for (const auto& device : AudioCore::GetDeviceListForInput(input_type)) { | ||||
|         ui->input_device_combo_box->addItem(QString::fromStdString(device)); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -194,15 +190,15 @@ void ConfigureAudio::SetupPerGameUI() { | |||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     ui->output_sink_combo_box->setVisible(false); | ||||
|     ui->output_sink_label->setVisible(false); | ||||
|     ui->audio_device_combo_box->setVisible(false); | ||||
|     ui->audio_device_label->setVisible(false); | ||||
|     ui->output_type_combo_box->setVisible(false); | ||||
|     ui->output_type_label->setVisible(false); | ||||
|     ui->output_device_combo_box->setVisible(false); | ||||
|     ui->output_device_label->setVisible(false); | ||||
|     ui->input_type_label->setVisible(false); | ||||
|     ui->input_type_combo_box->setVisible(false); | ||||
|     ui->input_device_label->setVisible(false); | ||||
|     ui->input_device_combo_box->setVisible(false); | ||||
|     ui->microphone_layout->setVisible(false); | ||||
|     ui->input_layout->setVisible(false); | ||||
| 
 | ||||
|     connect(ui->volume_combo_box, qOverload<int>(&QComboBox::activated), this, [this](int index) { | ||||
|         ui->volume_slider->setEnabled(index == 1); | ||||
|  |  | |||
|  | @ -30,8 +30,10 @@ private: | |||
|     void UpdateAudioOutputDevices(int sink_index); | ||||
|     void UpdateAudioInputDevices(int index); | ||||
| 
 | ||||
|     void SetOutputSinkFromSinkID(); | ||||
|     void SetAudioDeviceFromDeviceID(); | ||||
|     void SetOutputTypeFromSinkType(); | ||||
|     void SetOutputDeviceFromDeviceID(); | ||||
|     void SetInputTypeFromInputType(); | ||||
|     void SetInputDeviceFromDeviceID(); | ||||
|     void SetVolumeIndicatorText(int percentage); | ||||
| 
 | ||||
|     void SetupPerGameUI(); | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
|    <item> | ||||
|     <widget class="QGroupBox" name="groupBox"> | ||||
|      <property name="title"> | ||||
|       <string>Audio</string> | ||||
|       <string>Output</string> | ||||
|      </property> | ||||
|      <layout class="QVBoxLayout"> | ||||
|       <item> | ||||
|  | @ -62,16 +62,26 @@ | |||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <layout class="QHBoxLayout" name="output_engine_layout"> | ||||
|         <item> | ||||
|          <widget class="QLabel" name="output_sink_label"> | ||||
|        <layout class="QGridLayout" name="output_layout" columnstretch="1,1"> | ||||
|         <item row="0" column="0"> | ||||
|          <widget class="QLabel" name="output_type_label"> | ||||
|           <property name="text"> | ||||
|            <string>Output Engine</string> | ||||
|            <string>Output Type</string> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QComboBox" name="output_sink_combo_box"/> | ||||
|         <item row="0" column="1"> | ||||
|          <widget class="QComboBox" name="output_type_combo_box"/> | ||||
|         </item> | ||||
|         <item row="1" column="0"> | ||||
|          <widget class="QLabel" name="output_device_label"> | ||||
|           <property name="text"> | ||||
|            <string>Output Device</string> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item row="1" column="1"> | ||||
|          <widget class="QComboBox" name="output_device_combo_box"/> | ||||
|         </item> | ||||
|        </layout> | ||||
|       </item> | ||||
|  | @ -85,20 +95,6 @@ | |||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <layout class="QHBoxLayout" name="audio_device_layout"> | ||||
|         <item> | ||||
|          <widget class="QLabel" name="audio_device_label"> | ||||
|           <property name="text"> | ||||
|            <string>Audio Device</string> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QComboBox" name="audio_device_combo_box"/> | ||||
|         </item> | ||||
|        </layout> | ||||
|       </item> | ||||
|       <item> | ||||
|        <widget class="QWidget" name="volume_layout" native="true"> | ||||
|         <layout class="QHBoxLayout" name="horizontalLayout_2"> | ||||
|  | @ -190,54 +186,30 @@ | |||
|     </widget> | ||||
|    </item> | ||||
|    <item> | ||||
|     <widget class="QGroupBox" name="microphone_layout"> | ||||
|     <widget class="QGroupBox" name="input_layout"> | ||||
|      <property name="title"> | ||||
|       <string>Microphone</string> | ||||
|      </property> | ||||
|      <layout class="QVBoxLayout" name="verticalLayout"> | ||||
|       <item> | ||||
|        <layout class="QHBoxLayout" name="horizontalLayout"> | ||||
|         <item> | ||||
|          <widget class="QLabel" name="input_type_label"> | ||||
|           <property name="text"> | ||||
|            <string>Input Type</string> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QComboBox" name="input_type_combo_box"> | ||||
|           <item> | ||||
|            <property name="text"> | ||||
|             <string>None</string> | ||||
|            </property> | ||||
|           </item> | ||||
|           <item> | ||||
|            <property name="text"> | ||||
|             <string>Real Device</string> | ||||
|            </property> | ||||
|           </item> | ||||
|           <item> | ||||
|            <property name="text"> | ||||
|             <string>Static Noise</string> | ||||
|            </property> | ||||
|           </item> | ||||
|          </widget> | ||||
|         </item> | ||||
|        </layout> | ||||
|      <layout class="QGridLayout" name="input_inner_layout" columnstretch="1,1"> | ||||
|       <item row="0" column="0"> | ||||
|        <widget class="QLabel" name="input_type_label"> | ||||
|         <property name="text"> | ||||
|          <string>Input Type</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item> | ||||
|        <layout class="QHBoxLayout" name="horizontalLayout_3"> | ||||
|         <item> | ||||
|          <widget class="QLabel" name="input_device_label"> | ||||
|           <property name="text"> | ||||
|            <string>Input Device</string> | ||||
|           </property> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <widget class="QComboBox" name="input_device_combo_box"/> | ||||
|         </item> | ||||
|        </layout> | ||||
|       <item row="0" column="1"> | ||||
|        <widget class="QComboBox" name="input_type_combo_box"/> | ||||
|       </item> | ||||
|       <item row="1" column="0"> | ||||
|        <widget class="QLabel" name="input_device_label"> | ||||
|         <property name="text"> | ||||
|          <string>Input Device</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="1" column="1"> | ||||
|        <widget class="QComboBox" name="input_device_combo_box"/> | ||||
|       </item> | ||||
|      </layout> | ||||
|     </widget> | ||||
|  | @ -259,10 +231,10 @@ | |||
|  </widget> | ||||
|  <tabstops> | ||||
|   <tabstop>emulation_combo_box</tabstop> | ||||
|   <tabstop>output_sink_combo_box</tabstop> | ||||
|   <tabstop>toggle_audio_stretching</tabstop> | ||||
|   <tabstop>audio_device_combo_box</tabstop> | ||||
|   <tabstop>volume_slider</tabstop> | ||||
|   <tabstop>output_type_combo_box</tabstop> | ||||
|   <tabstop>output_device_combo_box</tabstop> | ||||
|   <tabstop>input_type_combo_box</tabstop> | ||||
|   <tabstop>input_device_combo_box</tabstop> | ||||
|  </tabstops> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue