From d45f8672cd556207f8c9123bd524df35b85e94c2 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Thu, 7 Jun 2018 02:06:12 +0200 Subject: [PATCH] Fix pulseaudio device selection --- CMakeLists.txt | 1 + src/config.h.in | 1 + src/core/mainwindow.cpp | 2 +- src/engine/devicefinder.cpp | 3 +++ src/engine/enginedevice.cpp | 4 ++-- src/engine/gstengine.cpp | 23 +++++++---------------- src/engine/gstengine.h | 1 + src/engine/pulsedevicefinder.cpp | 2 +- src/settings/backendsettingspage.cpp | 13 +++++++------ src/settings/backendsettingspage.h | 2 +- 10 files changed, 25 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 950a7cc4c..a8bc146e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ project(strawberry) cmake_minimum_required(VERSION 2.8.11) cmake_policy(SET CMP0054 NEW) +cmake_policy(SET CMP0072 NEW) include(CheckCXXCompilerFlag) include(CheckIncludeFiles) diff --git a/src/config.h.in b/src/config.h.in index 4048e012f..3dcdfa61d 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -23,6 +23,7 @@ #cmakedefine HAVE_GIO #cmakedefine HAVE_DBUS #cmakedefine HAVE_UDISKS2 +#cmakedefine HAVE_ALSA #cmakedefine HAVE_DEVICEKIT #cmakedefine HAVE_IMOBILEDEVICE #cmakedefine HAVE_LIBARCHIVE diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 4a4f03616..1fdfddaac 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -543,7 +543,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co // Windows 7 thumbbar buttons thumbbar_->SetActions(QList() << ui_->action_previous_track << ui_->action_play_pause << ui_->action_stop << ui_->action_next_track << nullptr); // spacer -#if (defined(Q_OS_DARWIN) && defined(HAVE_SPARKLE)) || defined(Q_OS_WIN32) +#if (defined(Q_OS_DARWIN) && defined(HAVE_SPARKLE)) // Add check for updates item to application menu. QAction *check_updates = ui_->menu_tools->addAction(tr("Check for updates...")); check_updates->setMenuRole(QAction::ApplicationSpecificRole); diff --git a/src/engine/devicefinder.cpp b/src/engine/devicefinder.cpp index fe9f03c55..d9ca3f93f 100644 --- a/src/engine/devicefinder.cpp +++ b/src/engine/devicefinder.cpp @@ -48,6 +48,9 @@ QString DeviceFinder::GuessIconName(const QString &description) { if (description_lower.contains("headset")) { return "headset"; } + if (description_lower.contains("pulseaudio")) { + return "pulseaudio"; + } return "soundcard"; diff --git a/src/engine/enginedevice.cpp b/src/engine/enginedevice.cpp index cd253d505..8a81542d0 100644 --- a/src/engine/enginedevice.cpp +++ b/src/engine/enginedevice.cpp @@ -30,7 +30,7 @@ #include "devicefinder.h" #include "enginedevice.h" -#ifdef Q_OS_LINUX +#ifdef HAVE_ALSA # include "alsadevicefinder.h" #endif @@ -57,7 +57,7 @@ void EngineDevice::Init() { QList device_finders; -#ifdef Q_OS_LINUX +#ifdef HAVE_ALSA device_finders.append(new AlsaDeviceFinder); #endif #ifdef HAVE_LIBPULSE diff --git a/src/engine/gstengine.cpp b/src/engine/gstengine.cpp index 5f35e31d8..14ec82c5c 100644 --- a/src/engine/gstengine.cpp +++ b/src/engine/gstengine.cpp @@ -67,21 +67,6 @@ # include "ext/gstafc/gstafcsrc.h" #endif -#ifdef Q_OS_LINUX -# include "alsadevicefinder.h" -#endif - -#ifdef HAVE_LIBPULSE -# include "pulsedevicefinder.h" -#endif - -#ifdef Q_OS_DARWIN -# include "osxdevicefinder.h" -#endif -#ifdef Q_OS_WIN32 -# include "directsounddevicefinder.h" -#endif - #include "settings/backendsettingspage.h" using std::shared_ptr; @@ -852,7 +837,13 @@ shared_ptr GstEngine::CreatePipeline(const QByteArray &url, q bool GstEngine::ALSADeviceSupport(const QString &name) { - return (name == kALSASink || name == kOSSSink || name == kPulseSink); + return (name == kALSASink || name == kOSSSink); + +} + +bool GstEngine::PulseDeviceSupport(const QString &name) { + + return (name == kPulseSink); } diff --git a/src/engine/gstengine.h b/src/engine/gstengine.h index fa9a4446e..1a49ff05b 100644 --- a/src/engine/gstengine.h +++ b/src/engine/gstengine.h @@ -87,6 +87,7 @@ class GstEngine : public Engine::Base, public GstBufferConsumer { const Engine::Scope &scope(int chunk_length); static bool ALSADeviceSupport(const QString &name); + static bool PulseDeviceSupport(const QString &name); GstElement *CreateElement(const QString &factoryName, GstElement *bin = 0, bool fatal = true, bool showerror = true); diff --git a/src/engine/pulsedevicefinder.cpp b/src/engine/pulsedevicefinder.cpp index fe2243974..e916f1178 100644 --- a/src/engine/pulsedevicefinder.cpp +++ b/src/engine/pulsedevicefinder.cpp @@ -123,7 +123,7 @@ void PulseDeviceFinder::GetSinkInfoCallback(pa_context *c, const pa_sink_info *i Device dev; dev.description = QString::fromUtf8(info->description); dev.value = QString::fromUtf8(info->name); - dev.iconname = QString::fromUtf8(pa_proplist_gets(info->proplist, "device.iconname")); + dev.iconname = GuessIconName(dev.description); state->devices.append(dev); } diff --git a/src/settings/backendsettingspage.cpp b/src/settings/backendsettingspage.cpp index a2d31e8c7..02558323e 100644 --- a/src/settings/backendsettingspage.cpp +++ b/src/settings/backendsettingspage.cpp @@ -193,7 +193,7 @@ void BackendSettingsPage::Load_Engine(Engine::EngineType enginetype) { } -void BackendSettingsPage::Load_Device(QString output, QVariant device, bool alsa) { +void BackendSettingsPage::Load_Device(QString output, QVariant device, bool alsa, bool pulseaudio) { int devices = 0; DeviceFinder::Device dfdevice; @@ -206,11 +206,12 @@ void BackendSettingsPage::Load_Device(QString output, QVariant device, bool alsa ui_->combobox_device->addItem(IconLoader::Load("soundcard"), "Automatically select", ""); #endif - if (alsa) ui_->lineedit_device->setEnabled(true); + if (alsa || pulseaudio) ui_->lineedit_device->setEnabled(true); else ui_->lineedit_device->setEnabled(false); for (DeviceFinder *f : dialog()->app()->enginedevice()->device_finders_) { if (f->name() == "alsa" && !alsa) continue; + if (f->name() == "pulseaudio" && !pulseaudio) continue; for (const DeviceFinder::Device &d : f->ListDevices()) { devices++; ui_->combobox_device->addItem(IconLoader::Load(d.iconname), d.description, d.value); @@ -218,7 +219,7 @@ void BackendSettingsPage::Load_Device(QString output, QVariant device, bool alsa } } - if (alsa) ui_->combobox_device->addItem(IconLoader::Load("soundcard"), "Custom", QVariant("")); + if (alsa || pulseaudio) ui_->combobox_device->addItem(IconLoader::Load("soundcard"), "Custom", QVariant("")); bool found = false; if (devices > 0) ui_->combobox_device->setEnabled(true); @@ -247,7 +248,7 @@ void BackendSettingsPage::Gst_Load(QString output, QVariant device) { errordialog_.ShowMessage("GStramer not initialized! Please restart."); return; } - + GstEngine *gstengine = qobject_cast(dialog()->app()->player()->engine()); ui_->combobox_output->clear(); @@ -269,7 +270,7 @@ void BackendSettingsPage::Gst_Load(QString output, QVariant device) { engineloaded_=Engine::GStreamer; ui_->groupbox_replaygain->setEnabled(true); - Load_Device(output, device, GstEngine::ALSADeviceSupport(output)); + Load_Device(output, device, GstEngine::ALSADeviceSupport(output), GstEngine::PulseDeviceSupport(output)); } #endif @@ -477,7 +478,7 @@ void BackendSettingsPage::Xine_OutputChanged(int index) { void BackendSettingsPage::Gst_OutputChanged(int index) { EngineBase::OutputDetails output = ui_->combobox_output->itemData(index).value(); - Load_Device(output.name, QVariant(), GstEngine::ALSADeviceSupport(output.name)); + Load_Device(output.name, QVariant(), GstEngine::ALSADeviceSupport(output.name), GstEngine::PulseDeviceSupport(output.name)); } #endif diff --git a/src/settings/backendsettingspage.h b/src/settings/backendsettingspage.h index a00d53631..ce50f8553 100644 --- a/src/settings/backendsettingspage.h +++ b/src/settings/backendsettingspage.h @@ -67,7 +67,7 @@ private: void OutputChanged(int index, Engine::EngineType enginetype); void Load_Engine(Engine::EngineType enginetype); - void Load_Device(QString output, QVariant device, bool alsa); + void Load_Device(QString output, QVariant device, bool alsa, bool pulseaudio); #ifdef HAVE_XINE void Xine_Load(QString output, QVariant device);