[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