[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kmix/kmix-improvements] src: Implement level monitors for controls
From: Trever Fischer <tdfischer () fedoraproject ! org>
Date: 2012-09-25 10:47:09
Message-ID: 20120925104709.953FBA60C9 () git ! kde ! org
[Download RAW message or body]
Git commit 35b6f76b569462877257f0ad07f5128282de8bd6 by Trever Fischer.
Committed on 25/09/2012 at 12:32.
Pushed by tdfischer into branch 'kmix-improvements'.
Implement level monitors for controls
M +2 -0 src/daemon2/CMakeLists.txt
M +28 -0 src/daemon2/Control.cpp
M +23 -0 src/daemon2/Control.h
M +16 -0 src/daemon2/backends/PulseControl.cpp
M +3 -0 src/daemon2/backends/PulseControl.h
M +5 -0 src/dbus/org.kde.kmix.control.xml
A +11 -0 src/dbus/org.kde.kmix.controlmonitor.xml
M +3 -0 src/gui2/CMakeLists.txt
A +29 -0 src/gui2/ControlMonitor.cpp [License: UNKNOWN] *
A +33 -0 src/gui2/ControlMonitor.h [License: UNKNOWN] *
M +8 -0 src/gui2/ControlSlider.cpp
The files marked with a * at the end have a non valid license. Please read: \
http://techbase.kde.org/Policies/Licensing_Policy and use the headers which are \
listed at that page.
http://commits.kde.org/kmix/35b6f76b569462877257f0ad07f5128282de8bd6
diff --git a/src/daemon2/CMakeLists.txt b/src/daemon2/CMakeLists.txt
index 3e136a0..995c7b0 100644
--- a/src/daemon2/CMakeLists.txt
+++ b/src/daemon2/CMakeLists.txt
@@ -35,6 +35,8 @@ qt4_add_dbus_adaptor( kmixd_SRCS ../dbus/org.kde.kmix.control.xml
Control.h Control )
qt4_add_dbus_adaptor( kmixd_SRCS ../dbus/org.kde.kmix.controlgroup.xml
ControlGroup.h ControlGroup )
+qt4_add_dbus_interface(kmixd_SRCS ../dbus/org.kde.kmix.controlmonitor.xml
+ controlmonitor_interface)
kde4_add_executable(kmixd ${kmixd_SRCS} ${kmixd_backend_SRCS})
diff --git a/src/daemon2/Control.cpp b/src/daemon2/Control.cpp
index 99dbae1..ac2b636 100644
--- a/src/daemon2/Control.cpp
+++ b/src/daemon2/Control.cpp
@@ -21,6 +21,8 @@
#include "controladaptor.h"
#include <QtDBus/QDBusConnection>
+#include "controlmonitor_interface.h"
+
QAtomicInt Control::s_id = 0;
Control::Control(Category category, QObject *parent)
@@ -30,6 +32,7 @@ Control::Control(Category category, QObject *parent)
new ControlAdaptor(this);
m_id = s_id.fetchAndAddRelaxed(1);
QDBusConnection::sessionBus().registerObject(QString("/controls/%1").arg(m_id), \
this); + m_monitorMap = new QSignalMapper(this);
}
int Control::id() const
@@ -47,4 +50,29 @@ Control::~Control()
emit removed();
}
+void Control::subscribeMonitor(const QString &address, const QString &path)
+{
+ org::kde::KMix::ControlMonitor *monitor = new \
org::kde::KMix::ControlMonitor(address, path, QDBusConnection::sessionBus()); + \
int pos = m_monitors.size(); + m_monitors << monitor;
+ m_monitorMap->setMapping(monitor, pos);
+ connect(monitor, SIGNAL(removed()), m_monitorMap, SLOT(map()));
+ startMonitor();
+}
+
+void Control::removeMonitor(int pos)
+{
+ m_monitors.removeOne(m_monitors[pos]);
+ if (m_monitors.size() == 0) {
+ stopMonitor();
+ }
+}
+
+void Control::levelUpdate(int l)
+{
+ foreach(org::kde::KMix::ControlMonitor *monitor, m_monitors) {
+ monitor->levelUpdate(l);
+ }
+}
+
#include "Control.moc"
diff --git a/src/daemon2/Control.h b/src/daemon2/Control.h
index dc907d2..c2d2482 100644
--- a/src/daemon2/Control.h
+++ b/src/daemon2/Control.h
@@ -23,6 +23,18 @@
#include <QtCore/QObject>
#include <QtCore/QMap>
+class ControlMonitor;
+class QSignalMapper;
+
+class OrgKdeKMixControlMonitorInterface;
+namespace org {
+ namespace kde {
+ namespace KMix {
+ typedef OrgKdeKMixControlMonitorInterface ControlMonitor;
+ }
+ }
+}
+
class Control : public QObject
{
Q_OBJECT
@@ -32,6 +44,7 @@ class Control : public QObject
Q_PROPERTY(bool canMute READ canMute);
Q_PROPERTY(int channels READ channels);
Q_PROPERTY(Category category READ category);
+ Q_PROPERTY(bool canMonitor READ canMonitor);
public:
typedef enum {
FrontLeft,
@@ -57,19 +70,29 @@ public:
virtual bool isMuted() const = 0;
virtual void setMute(bool yes) = 0;
virtual bool canMute() const = 0;
+ virtual bool canMonitor() const = 0;
virtual Category category() const;
int id() const;
int getVolume(int i) const {return getVolume((Channel)i);}
void setVolume(int c, int v) {setVolume((Channel)c, v);}
+ Q_INVOKABLE void subscribeMonitor(const QString &address, const QString &path);
signals:
void volumeChanged(int c);
void muteChanged(bool muted);
void removed();
+protected:
+ virtual void stopMonitor() = 0;
+ virtual void startMonitor() = 0;
+ void levelUpdate(int l);
+private slots:
+ void removeMonitor(int);
private:
Category m_category;
int m_id;
static QAtomicInt s_id;
+ QList<org::kde::KMix::ControlMonitor*> m_monitors;
+ QSignalMapper *m_monitorMap;
};
#endif //CONTROL_H
diff --git a/src/daemon2/backends/PulseControl.cpp \
b/src/daemon2/backends/PulseControl.cpp index 50d8722..8aec776 100644
--- a/src/daemon2/backends/PulseControl.cpp
+++ b/src/daemon2/backends/PulseControl.cpp
@@ -78,6 +78,22 @@ void PulseControl::updateVolumes(const pa_cvolume &volumes)
m_volumes = volumes;
}
+void PulseControl::startMonitor()
+{
+ levelUpdate(100);
+ qDebug() << "Starting monitor";
+}
+
+void PulseControl::stopMonitor()
+{
+ qDebug() << "Stopping monitor";
+}
+
+bool PulseControl::canMonitor() const
+{
+ return true;
+}
+
} //namespace Backends
#include "PulseControl.moc"
diff --git a/src/daemon2/backends/PulseControl.h \
b/src/daemon2/backends/PulseControl.h index c129b6b..264ca99 100644
--- a/src/daemon2/backends/PulseControl.h
+++ b/src/daemon2/backends/PulseControl.h
@@ -36,12 +36,15 @@ public:
int getVolume(Channel channel) const;
bool isMuted() const;
bool canMute() const;
+ bool canMonitor() const;
signals:
void scheduleRefresh(int index);
protected:
static void cb_refresh(pa_context *c, int success, void* user_data);
void updateVolumes(const pa_cvolume &volumes);
+ void stopMonitor();
+ void startMonitor();
pa_context *m_context;
int m_idx;
QString m_displayName;
diff --git a/src/dbus/org.kde.kmix.control.xml b/src/dbus/org.kde.kmix.control.xml
index f080262..13d80e5 100644
--- a/src/dbus/org.kde.kmix.control.xml
+++ b/src/dbus/org.kde.kmix.control.xml
@@ -2,6 +2,7 @@
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.kde.KMix.Control">
+ <property access="read" name="canMonitor" type="b"/>
<property access="read" name="displayName" type="s"/>
<property access="read" name="iconName" type="s"/>
<property access="readwrite" name="mute" type="b"/>
@@ -23,6 +24,10 @@
<arg name="channel" type="i"/>
</signal>
<signal name="removed"/>
+ <method name="subscribeMonitor">
+ <arg name="address" type="s" direction="in"/>
+ <arg name="path" type="s" direction="in"/>
+ </method>
<!-- <property access="read" name="volumes" type="{ii}">
<annotation name="org.qtproject.QtDBus.QtTypeName" value="QMap<int, int>"/>
</property> -->
diff --git a/src/dbus/org.kde.kmix.controlmonitor.xml \
b/src/dbus/org.kde.kmix.controlmonitor.xml new file mode 100644
index 0000000..41c7488
--- /dev/null
+++ b/src/dbus/org.kde.kmix.controlmonitor.xml
@@ -0,0 +1,11 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.kde.KMix.ControlMonitor">
+ <method name="levelUpdate">
+ <arg name="level" type="i" direction="in"/>
+ </method>
+ <signal name="removed"/>
+ </interface>
+</node>
+
diff --git a/src/gui2/CMakeLists.txt b/src/gui2/CMakeLists.txt
index ee7cf37..07053ee 100644
--- a/src/gui2/CMakeLists.txt
+++ b/src/gui2/CMakeLists.txt
@@ -4,6 +4,7 @@ set(kmix_KDEINIT_SRCS
KMixApp.cpp
ControlSlider.cpp
ControlGroupTab.cpp
+ ControlMonitor.cpp
)
qt4_add_dbus_interface(kmix_KDEINIT_SRCS ../dbus/org.kde.kmix.kmixd.xml
@@ -12,6 +13,8 @@ qt4_add_dbus_interface(kmix_KDEINIT_SRCS \
../dbus/org.kde.kmix.controlgroup.xml controlgroup_interface)
qt4_add_dbus_interface(kmix_KDEINIT_SRCS ../dbus/org.kde.kmix.control.xml
control_interface)
+qt4_add_dbus_adaptor( kmix_KDEINIT_SRCS ../dbus/org.kde.kmix.controlmonitor.xml
+ ControlMonitor.h ControlMonitor)
kde4_add_kdeinit_executable( kmix ${kmix_KDEINIT_SRCS})
diff --git a/src/gui2/ControlMonitor.cpp b/src/gui2/ControlMonitor.cpp
new file mode 100644
index 0000000..233813a
--- /dev/null
+++ b/src/gui2/ControlMonitor.cpp
@@ -0,0 +1,29 @@
+#include "ControlMonitor.h"
+#include "control_interface.h"
+#include "controlmonitoradaptor.h"
+#include <QtGui/QProgressBar>
+
+QAtomicInt ControlMonitor::s_id = 0;
+
+ControlMonitor::ControlMonitor(QProgressBar *widget, org::kde::KMix::Control \
*control, QObject *parent) + : QObject(parent)
+ , m_widget(widget)
+{
+ new ControlMonitorAdaptor(this);
+ QString path = QString("/org/kde/kmix/monitors/%1").arg(s_id.ref());
+ QDBusConnection::sessionBus().registerObject(path, this);
+ control->subscribeMonitor(QDBusConnection::sessionBus().baseService(), path);
+}
+
+ControlMonitor::~ControlMonitor()
+{
+ emit removed();
+}
+
+void ControlMonitor::levelUpdate(int level)
+{
+ qDebug() << "Level update to" << level;
+ m_widget->setValue(level);
+}
+
+#include "ControlMonitor.moc"
diff --git a/src/gui2/ControlMonitor.h b/src/gui2/ControlMonitor.h
new file mode 100644
index 0000000..5af702d
--- /dev/null
+++ b/src/gui2/ControlMonitor.h
@@ -0,0 +1,33 @@
+#ifndef CONTROLMONITOR_H
+#define CONTROLMONITOR_H
+
+#include <QtCore/QObject>
+
+class Control;
+class QProgressBar;
+
+class OrgKdeKMixControlInterface;
+namespace org {
+ namespace kde {
+ namespace KMix {
+ typedef OrgKdeKMixControlInterface Control;
+ }
+ }
+}
+
+class ControlMonitor : public QObject
+{
+ Q_OBJECT
+public:
+ ControlMonitor(QProgressBar *widget, org::kde::KMix::Control *control, QObject \
*parent); + ~ControlMonitor();
+public slots:
+ void levelUpdate(int level);
+signals:
+ void removed();
+private:
+ QProgressBar *m_widget;
+ static QAtomicInt s_id;
+};
+
+#endif // CONTROLMONITOR_H
diff --git a/src/gui2/ControlSlider.cpp b/src/gui2/ControlSlider.cpp
index b7c4fb0..c66e0cf 100644
--- a/src/gui2/ControlSlider.cpp
+++ b/src/gui2/ControlSlider.cpp
@@ -1,10 +1,12 @@
#include "ControlSlider.h"
+#include "ControlMonitor.h"
#include <QtGui/QVBoxLayout>
#include <QtGui/QLabel>
#include <QtGui/QSlider>
#include <QtCore/QSignalMapper>
#include <KDE/KIcon>
#include <QtGui/QPushButton>
+#include <QtGui/QProgressBar>
#include "control_interface.h"
@@ -48,6 +50,12 @@ ControlSlider::ControlSlider(org::kde::KMix::Control *control, \
QWidget *parent)
layout->addWidget(labelContainer);
layout->addWidget(sliderContainer);
+ if (control->canMonitor()) {
+ QProgressBar *levelDisplay = new QProgressBar(this);
+ levelDisplay->setMaximum(65536);
+ new ControlMonitor(levelDisplay, control, levelDisplay);
+ layout->addWidget(levelDisplay);
+ }
layout->addWidget(m_mute);
updateMute();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic