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, allowi= ng 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 controls() const; virtual bool open(); + virtual bool probe() =3D 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] =3D new ControlGroup("Recording"); m_groups[Control::HardwareInput] =3D new ControlGroup("Hardware Input"= ); m_groups[Control::HardwareOutput] =3D new ControlGroup("Hardware Outpu= t"); - 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(handleCon= trolAdded(Control *))); - connect(backend, SIGNAL(controlRemoved(Control *)), this, SLOT(handleC= ontrolRemoved(Control *))); - m_backends << backend; - backend->open(); + qDebug() << "Probing backend" << backend; + if (backend->probe()) { + connect(backend, SIGNAL(controlAdded(Control *)), this, SLOT(handl= eControlAdded(Control *))); + connect(backend, SIGNAL(controlRemoved(Control *)), this, SLOT(han= dleControlRemoved(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 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 =3D -1; + return (snd_card_next(&card) =3D=3D 0 && card > -1); +} + bool ALSA::open() { int card =3D -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 =3D 0); ~ALSA(); bool open(); + bool probe(); private: QList m_mixers; }; diff --git a/src/daemon2/backends/PulseAudio.cpp b/src/daemon2/backends/Pul= seAudio.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 =3D pa_glib_mainloop_new(NULL); m_loopAPI =3D pa_glib_mainloop_get_api(m_loop); - m_context =3D pa_context_new(m_loopAPI, "KMix"); } = PulseAudio::~PulseAudio() @@ -222,9 +222,27 @@ void PulseAudio::context_state_callback(pa_context *cx= t, gpointer user_data) } } = +bool PulseAudio::probe() +{ + bool ret; + pa_context *context =3D pa_context_new(m_loopAPI, "KMix"); + ret =3D (pa_context_connect(context, NULL, PA_CONTEXT_NOFLAGS, 0)); + pa_context_disconnect(context); + pa_context_unref(context); + if (ret =3D=3D 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 =3D pa_context_new(m_loopAPI, "KMix"); + } + if ((ret =3D 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 =3D NULL; return false; diff --git a/src/daemon2/backends/PulseAudio.h b/src/daemon2/backends/Pulse= Audio.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 =3D 0); ~PulseAudio(); bool open(); + bool probe(); PulseSinkControl *sink(int idx); private slots: void refreshSink(int idx);