[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kmix/kmix-improvements] src/daemon2: Add support for backends to probe if they are supported on a s
From:       Trever Fischer <tdfischer () fedoraproject ! org>
Date:       2012-09-26 2:56:02
Message-ID: 20120926025602.77A73A63B8 () git ! kde ! org
[Download RAW message or body]

Git commit aa123117656a87b52a73f2f573b8df4389253198 by Trever Fischer.
Committed on 26/09/2012 at 04:54.
Pushed by tdfischer into branch 'kmix-improvements'.

Add support for backends to probe if they are supported on a system, allowing ALSA to \
be a pulse fallback

M  +1    -0    src/daemon2/Backend.h
M  +14   -6    src/daemon2/BackendManager.cpp
M  +1    -1    src/daemon2/BackendManager.h
M  +6    -0    src/daemon2/backends/ALSA.cpp
M  +1    -0    src/daemon2/backends/ALSA.h
M  +20   -2    src/daemon2/backends/PulseAudio.cpp
M  +1    -0    src/daemon2/backends/PulseAudio.h

http://commits.kde.org/kmix/aa123117656a87b52a73f2f573b8df4389253198

diff --git a/src/daemon2/Backend.h b/src/daemon2/Backend.h
index ffdd9e2..5575cef 100644
--- a/src/daemon2/Backend.h
+++ b/src/daemon2/Backend.h
@@ -30,6 +30,7 @@ public:
     ~Backend();
     QList<Control*> controls() const;
     virtual bool open();
+    virtual bool probe() = 0;
 signals:
     void controlAdded(Control *control);
     void controlRemoved(Control *control);
diff --git a/src/daemon2/BackendManager.cpp b/src/daemon2/BackendManager.cpp
index 55fcdc9..5dbc9e7 100644
--- a/src/daemon2/BackendManager.cpp
+++ b/src/daemon2/BackendManager.cpp
@@ -35,15 +35,23 @@ BackendManager::BackendManager()
     m_groups[Control::InputStream] = new ControlGroup("Recording");
     m_groups[Control::HardwareInput] = new ControlGroup("Hardware Input");
     m_groups[Control::HardwareOutput] = new ControlGroup("Hardware Output");
-    addBackend(new Backends::ALSA(this));
+    if (!addBackend(new Backends::PulseAudio(this))) {
+        qWarning() << "PulseAudio is not working, falling back to ALSA.";
+        addBackend(new Backends::ALSA(this));
+    }
 }
 
-void BackendManager::addBackend(Backend *backend)
+bool BackendManager::addBackend(Backend *backend)
 {
-    connect(backend, SIGNAL(controlAdded(Control *)), this, \
                SLOT(handleControlAdded(Control *)));
-    connect(backend, SIGNAL(controlRemoved(Control *)), this, \
                SLOT(handleControlRemoved(Control *)));
-    m_backends << backend;
-    backend->open();
+    qDebug() << "Probing backend" << backend;
+    if (backend->probe()) {
+        connect(backend, SIGNAL(controlAdded(Control *)), this, \
SLOT(handleControlAdded(Control *))); +        connect(backend, \
SIGNAL(controlRemoved(Control *)), this, SLOT(handleControlRemoved(Control *))); +    \
m_backends << backend; +        qDebug() << "Loaded backend" << backend;
+        return backend->open();
+    }
+    return false;
 }
 
 BackendManager *BackendManager::instance()
diff --git a/src/daemon2/BackendManager.h b/src/daemon2/BackendManager.h
index f34d568..3ca1533 100644
--- a/src/daemon2/BackendManager.h
+++ b/src/daemon2/BackendManager.h
@@ -33,7 +33,7 @@ public:
     static BackendManager *instance();
     QList<ControlGroup*> groups() const;
     ControlGroup *group(const QString &name) const;
-    void addBackend(Backend *backend);
+    bool addBackend(Backend *backend);
 signals:
     void controlAdded(Control *control);
     void controlRemoved(Control *control);
diff --git a/src/daemon2/backends/ALSA.cpp b/src/daemon2/backends/ALSA.cpp
index 41a624d..f098396 100644
--- a/src/daemon2/backends/ALSA.cpp
+++ b/src/daemon2/backends/ALSA.cpp
@@ -16,6 +16,12 @@ ALSA::~ALSA()
     }
 }
 
+bool ALSA::probe()
+{
+    int card = -1;
+    return (snd_card_next(&card) == 0 && card > -1);
+}
+
 bool ALSA::open()
 {
     int card = -1;
diff --git a/src/daemon2/backends/ALSA.h b/src/daemon2/backends/ALSA.h
index 922f31e..7608af2 100644
--- a/src/daemon2/backends/ALSA.h
+++ b/src/daemon2/backends/ALSA.h
@@ -12,6 +12,7 @@ public:
     ALSA(QObject *parent = 0);
     ~ALSA();
     bool open();
+    bool probe();
 private:
     QList<snd_mixer_t*> m_mixers;
 };
diff --git a/src/daemon2/backends/PulseAudio.cpp \
b/src/daemon2/backends/PulseAudio.cpp index 3955dea..29651a5 100644
--- a/src/daemon2/backends/PulseAudio.cpp
+++ b/src/daemon2/backends/PulseAudio.cpp
@@ -29,10 +29,10 @@ namespace Backends {
 
 PulseAudio::PulseAudio(QObject *parent)
     : Backend(parent)
+    , m_context(0)
 {
     m_loop = pa_glib_mainloop_new(NULL);
     m_loopAPI = pa_glib_mainloop_get_api(m_loop);
-    m_context = pa_context_new(m_loopAPI, "KMix");
 }
 
 PulseAudio::~PulseAudio()
@@ -222,9 +222,27 @@ void PulseAudio::context_state_callback(pa_context *cxt, \
gpointer user_data)  }
 }
 
+bool PulseAudio::probe()
+{
+    bool ret;
+    pa_context *context = pa_context_new(m_loopAPI, "KMix");
+    ret = (pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, 0));
+    pa_context_disconnect(context);
+    pa_context_unref(context);
+    if (ret == 0)
+        return true;
+    qDebug() << "Could not connect to pulse:" << pa_strerror(ret);
+    return false;
+}
+
 bool PulseAudio::open()
 {
-    if (pa_context_connect(m_context, NULL, PA_CONTEXT_NOFAIL, 0) < 0) {
+    int ret;
+    if (!m_context) {
+        m_context = pa_context_new(m_loopAPI, "KMix");
+    }
+    if ((ret = pa_context_connect(m_context, NULL, PA_CONTEXT_NOFAIL, 0)) < 0) {
+        qDebug() << "Could not connect to pulse:" << pa_strerror(ret);
         pa_context_unref(m_context);
         m_context = NULL;
         return false;
diff --git a/src/daemon2/backends/PulseAudio.h b/src/daemon2/backends/PulseAudio.h
index 58f5b7d..151182f 100644
--- a/src/daemon2/backends/PulseAudio.h
+++ b/src/daemon2/backends/PulseAudio.h
@@ -35,6 +35,7 @@ public:
     PulseAudio(QObject *parent = 0);
     ~PulseAudio();
     bool open();
+    bool probe();
     PulseSinkControl *sink(int idx);
 private slots:
     void refreshSink(int idx);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic