diff --git a/include/AudioSdl.h b/include/AudioSdl.h index 5062f79ea..858e7abd0 100644 --- a/include/AudioSdl.h +++ b/include/AudioSdl.h @@ -40,6 +40,7 @@ #include "AudioDeviceSetupWidget.h" class QLineEdit; +class QComboBox; namespace lmms { @@ -67,7 +68,7 @@ public: private: QLineEdit * m_device; - + QComboBox* m_inputDeviceComboBox = nullptr; } ; diff --git a/src/core/audio/AudioSdl.cpp b/src/core/audio/AudioSdl.cpp index 0d960c107..e29472f60 100644 --- a/src/core/audio/AudioSdl.cpp +++ b/src/core/audio/AudioSdl.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include "AudioEngine.h" @@ -107,11 +108,18 @@ AudioSdl::AudioSdl( bool & _success_ful, AudioEngine* _audioEngine ) : m_inputAudioHandle = m_audioHandle; m_inputAudioHandle.callback = sdlInputAudioCallback; - m_inputDevice = SDL_OpenAudioDevice (nullptr, - 1, - &m_inputAudioHandle, - &actual, - 0); + const QString inputDevice = ConfigManager::inst()->value("audiosdl", "inputdevice"); + + // Try with the configured device + const auto inputDeviceCStr = inputDevice.toLocal8Bit().data(); + m_inputDevice = SDL_OpenAudioDevice (inputDeviceCStr, 1, &m_inputAudioHandle, &actual, 0); + + // If we did not get a device ID try again with the default device + if (m_inputDevice == 0) + { + m_inputDevice = SDL_OpenAudioDevice(nullptr, 1, &m_inputAudioHandle, &actual, 0); + } + if (m_inputDevice != 0) { m_supportsCapture = true; } else { @@ -291,6 +299,23 @@ AudioSdl::setupWidget::setupWidget( QWidget * _parent ) : m_device = new QLineEdit( dev, this ); form->addRow(tr("Device"), m_device); + + m_inputDeviceComboBox = new QComboBox(this); + +#ifdef LMMS_HAVE_SDL2 + const int numberOfInputDevices = SDL_GetNumAudioDevices(1); + for (int i = 0; i < numberOfInputDevices; ++i) + { + const QString deviceName = SDL_GetAudioDeviceName(i, 1); + m_inputDeviceComboBox->addItem(deviceName); + } + + // Set the current device to the one in the configuration + const auto inputDevice = ConfigManager::inst()->value("audiosdl", "inputdevice"); + m_inputDeviceComboBox->setCurrentText(inputDevice); +#endif + + form->addRow(tr("Input device"), m_inputDeviceComboBox); } @@ -300,6 +325,12 @@ void AudioSdl::setupWidget::saveSettings() { ConfigManager::inst()->setValue( "audiosdl", "device", m_device->text() ); + + const auto currentInputDevice = m_inputDeviceComboBox->currentText(); + if (!currentInputDevice.isEmpty()) + { + ConfigManager::inst()->setValue("audiosdl", "inputdevice", currentInputDevice); + } }