Control: tags -1 -fixed-upstream
Control: tags -1 +patch

Here's a simple fix.  It doesn't allow subdevice selection (needed for, eg,
SPDIF on most cards), but for people like me where just the master device is
enough, it does the trick.

I've submitted the patch upstream
(https://github.com/clementine-player/Clementine/pull/5787) but they haven't
even commented yet, on this nor any other pull requests, for almost a month.

Obviously, there's a lot to be improved, but it solves my use case.


Meow!
-- 
⢀⣴⠾⠻⢶⣦⠀ What Would Jesus Do, MUD/MMORPG edition:
⣾⠁⢰⠒⠀⣿⡁ • multiplay with an admin char to benefit your mortal
⢿⡄⠘⠷⠚⠋⠀ • abuse item cloning bugs (the five fishes + two breads affair)
⠈⠳⣄⠀⠀⠀⠀ • use glitches to walk on water
>From 4c59d384fc80a9c2fba32d28bcf62eea76224841 Mon Sep 17 00:00:00 2001
From: Adam Borowski <kilob...@angband.pl>
Date: Mon, 10 Jul 2017 23:57:29 +0200
Subject: [PATCH] A simple ALSA device finder.

It works by scraping /proc/asound/cards rather than by proper ioctls,
doesn't check device suitability (like, an USB microphone would show up
as a card despite having no pcm output), and so on.  But we can improve
it later.

For consistency with the PulseAudio finder, only top-level devices are
shown.  We'd probably want subdevices as well (#5352), but unless we query
plug sensors, the list would be too spammy for now.

Fixes #5611.
---
 src/CMakeLists.txt               |  8 ++++++
 src/engines/alsadevicefinder.cpp | 58 ++++++++++++++++++++++++++++++++++++++++
 src/engines/alsadevicefinder.h   | 31 +++++++++++++++++++++
 src/engines/gstengine.cpp        |  7 +++++
 4 files changed, 104 insertions(+)
 create mode 100644 src/engines/alsadevicefinder.cpp
 create mode 100644 src/engines/alsadevicefinder.h

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f0a8a569b..afc77ba01 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -896,6 +896,14 @@ optional_source(WIN32
     ${CMAKE_SOURCE_DIR}/3rdparty/tinysvcmdns
 )
 
+# Platform specific - Linux
+optional_source(LINUX
+  SOURCES
+    engines/alsadevicefinder.cpp
+  HEADERS
+    engines/alsadevicefinder.h
+)
+
 # Platform specific - X11
 optional_source(LINUX SOURCES widgets/osd_x11.cpp)
 
diff --git a/src/engines/alsadevicefinder.cpp b/src/engines/alsadevicefinder.cpp
new file mode 100644
index 000000000..7b58a0594
--- /dev/null
+++ b/src/engines/alsadevicefinder.cpp
@@ -0,0 +1,58 @@
+/* This file is part of Clementine.
+   Copyright 2017, Adam Borowski <kilob...@angband.pl>
+
+   Clementine is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Clementine is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Clementine.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <QFile>
+
+#include "alsadevicefinder.h"
+
+AlsaDeviceFinder::AlsaDeviceFinder()
+    : DeviceFinder("alsasink") {
+}
+
+QList<DeviceFinder::Device> AlsaDeviceFinder::ListDevices() {
+  QList<Device> ret;
+
+  QFile cards("/proc/asound/cards");
+  if (!cards.open(QIODevice::ReadOnly)) return ret;
+
+/* Syntax:
+                        snd_iprintf(buffer, "%2i [%-15s]: %s - %s\n",
+                                        idx,
+                                        card->id,
+                                        card->driver,
+                                        card->shortname);
+                        snd_iprintf(buffer, "                      %s\n",
+                                        card->longname);
+*/
+  QRegExp regid("^ ?(\\d{1,2}) \\[.{15}\\]: .* - .*$");
+  QRegExp regln("^                      (.*)\n");
+
+  while (1) {
+    QString line = cards.readLine();
+    if (regid.indexIn(line) == -1) break;
+    line = cards.readLine();
+    if (regln.indexIn(line) == -1) break;
+
+    Device dev;
+    dev.description = regln.cap(1).remove(QRegExp(" at .*$"));
+    dev.device_property_value = QString("hw:%1").arg(regid.cap(1));
+    dev.icon_name = GuessIconName(dev.description);
+    ret.append(dev);
+  }
+
+  return ret;
+}
diff --git a/src/engines/alsadevicefinder.h b/src/engines/alsadevicefinder.h
new file mode 100644
index 000000000..73f90d4c2
--- /dev/null
+++ b/src/engines/alsadevicefinder.h
@@ -0,0 +1,31 @@
+/* This file is part of Clementine.
+   Copyright 2017 Adam Borowski <kilob...@angband.pl>
+
+   Clementine is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Clementine is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Clementine.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef ALSADEVICEFINDER_H
+#define ALSADEVICEFINDER_H
+
+#include "engines/devicefinder.h"
+
+class AlsaDeviceFinder : public DeviceFinder {
+ public:
+  AlsaDeviceFinder();
+
+  virtual bool Initialise() { return true; }
+  virtual QList<Device> ListDevices();
+};
+
+#endif // ALSADEVICEFINDER_H
diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp
index f0d47b4e9..a59aa1a7b 100644
--- a/src/engines/gstengine.cpp
+++ b/src/engines/gstengine.cpp
@@ -58,6 +58,10 @@
 #include "engines/pulsedevicefinder.h"
 #endif
 
+#ifdef Q_OS_LINUX
+#include "engines/alsadevicefinder.h"
+#endif
+
 #ifdef Q_OS_DARWIN
 #include "engines/osxdevicefinder.h"
 #endif
@@ -162,6 +166,9 @@ void GstEngine::InitialiseGstreamer() {
 #ifdef HAVE_LIBPULSE
   device_finders.append(new PulseDeviceFinder);
 #endif
+#ifdef Q_OS_LINUX
+  device_finders.append(new AlsaDeviceFinder);
+#endif
 #ifdef Q_OS_DARWIN
   device_finders.append(new OsxDeviceFinder);
 #endif
-- 
2.13.2

Reply via email to