[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