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

List:       kde-commits
Subject:    KDE/kdemultimedia/kmix
From:       Christian Esken <esken () kde ! org>
Date:       2011-12-13 19:46:34
Message-ID: 20111213194634.D3CACAC80E () svn ! kde ! org
[Download RAW message or body]

SVN commit 1268580 by esken:

Show and remove MPRIS2 Streams (Stream hotplugging)
BUGS: 288637

 M  +6 -0      apps/kmix.cpp  
 M  +2 -0      apps/kmix.h  
 M  +41 -30    backends/mixer_mpris2.cpp  
 M  +3 -5      backends/mixer_mpris2.h  
 M  +1 -0      gui/kmixdockwidget.cpp  
 M  +14 -18    gui/viewbase.cpp  
 M  +9 -0      gui/viewdockareapopup.cpp  
 M  +6 -0      gui/viewdockareapopup.h  


--- trunk/KDE/kdemultimedia/kmix/apps/kmix.cpp #1268579:1268580
@@ -300,6 +300,12 @@
 }
 
 
+void KMixWindow::recreateDockWidget()
+{
+//	kDebug() << "recreate dock urgently requested";
+	updateDocking();
+}
+
 /**
  * Updates the docking icon by recreating it.
  * @returns Whether the docking succeeded. Failure usually means that there
--- trunk/KDE/kdemultimedia/kmix/apps/kmix.h #1268579:1268580
@@ -94,6 +94,7 @@
    void recreateGUI(bool saveConfig, const QString& mixerId, bool forceNewTab);
    void recreateGUIwithSavingView();
    void recreateGUIwithoutSavingView();
+   void recreateDockWidget();
    void redrawMixer( const QString& mixer_ID );
    void newMixerShown(int tabIndex);
 
@@ -138,6 +139,7 @@
 
     private:
    static QString getKmixctrlRcFilename(QString postfix);
+
   private slots:
    void saveConfig();
    void slotHWInfo();
--- trunk/KDE/kdemultimedia/kmix/backends/mixer_mpris2.cpp #1268579:1268580
@@ -43,7 +43,6 @@
 
 Mixer_MPRIS2::Mixer_MPRIS2(Mixer *mixer, int device) : Mixer_Backend(mixer,  device \
)  {
-	//	run();
 }
 
 
@@ -53,7 +52,7 @@
 		return Mixer::ERR_OPEN;
 
 	_mixer->setDynamic();
-	run();
+	addAllRunningPlayersAndInitHotplug();
 	return 0;
 }
 
@@ -77,18 +76,22 @@
 	return mediaControl(id, "Next");
 }
 
-int Mixer_MPRIS2::mediaControl(QString id, QString commandName)
+/**
+ * Sends a media control command to the given application.
+ * @param applicationId The MPRIS applicationId
+ */
+int Mixer_MPRIS2::mediaControl(QString applicationId, QString commandName)
 {
-	kDebug() << commandName << " " << id;
+	kDebug() << commandName << " " << applicationId;
 	QList<QVariant> arg;
 	//     arg.append(QString("org.mpris.MediaPlayer2.Player"));
 	//     arg.append(QString("PlayPause"));
 
-	MPrisAppdata* mad = apps.value(id);
+	MPrisAppdata* mad = apps.value(applicationId);
 	QDBusMessage msg = mad->playerIfc->callWithArgumentList(QDBus::NoBlock, \
commandName, arg);  if ( msg.type() == QDBusMessage::ErrorMessage )
 	{
-		kError(67100) << "ERROR SET " << id << ": " << msg;
+		kError(67100) << "ERROR SET " << applicationId << ": " << msg;
 		return Mixer::ERR_WRITE;
 	}
 	return 0;
@@ -177,11 +180,12 @@
 
 
 /**
- * @brief Test method
+ * Adds all currently running players and then starts listening
+ * for changes (new players, and disappearing players).<br>
  *
  * @return int
  **/
-int Mixer_MPRIS2::run()
+int Mixer_MPRIS2::addAllRunningPlayersAndInitHotplug()
 {
 	QDBusConnection dbusConn = QDBusConnection::sessionBus();
 	if (! dbusConn.isConnected() )
@@ -192,8 +196,15 @@
 		return Mixer::ERR_OPEN;
 	}
 
-	this->dbusConnPtr = &dbusConn;
+	// Start listening for new Mediaplayers
+	bool ret = dbusConn.connect("", QString("/org/freedesktop/DBus"), \
"org.freedesktop.DBus", "NameOwnerChanged", this, \
SLOT(newMediaPlayer(QString,QString,QString)) ); +	kDebug() << "Start listening for \
new Mediaplayers: "  << ret;  
+	/* Here is a small concurrency issue.
+	 * If new players appear between registeredServiceNames() below and the connect() \
above these players *might* show up doubled in KMix. +	 * There is no simple solution \
(reversing could have the problem of not-adding), so we live for now with it. +	 */
+	 
 	QDBusReply<QStringList> repl = dbusConn.interface()->registeredServiceNames();
 
 	if ( repl.isValid() )
@@ -203,19 +214,24 @@
 		foreach (  s , result )
 		{
 			if ( s.startsWith("org.mpris.MediaPlayer2") )
-				getMprisControl(dbusConn, s);
+				addMprisControl(dbusConn, s);
 		}
 	}
 
-	// Start listening for new Mediaplayers
-	dbusConn.connect("", QString("/org/freedesktop/DBus"), "org.freedesktop.DBus", \
"NameOwnerChanged", this, SLOT(newMediaPlayer(QString,QString,QString)) );  
 	return 0;
 }
 
 
 
-void Mixer_MPRIS2::getMprisControl(QDBusConnection& conn, QString busDestination)
+/**
+ * Add the MPRIS control designated by the DBUS busDestination
+ * to the internal apps list.
+ *
+ * @param conn An open connection to the DBUS Session Bus
+ * @param busDestination The DBUS busDestination, e.g. \
"org.mpris.MediaPlayer2.amarok" + */
+void Mixer_MPRIS2::addMprisControl(QDBusConnection& conn, QString busDestination)
 {
 	int lastDot = busDestination.lastIndexOf('.');
 	QString id = ( lastDot == -1 ) ? busDestination : busDestination.mid(lastDot+1);
@@ -287,29 +303,27 @@
 
 
 
+void Mixer_MPRIS2::notifyToReconfigureControls()
+{
+    QMetaObject::invokeMethod(this,
+		                              "controlsReconfigured",
+		                              Qt::QueuedConnection,
+		                              Q_ARG(QString, _mixer->id()));
+}
+
 /**
- * This slot is a simple proxy that enriches the DBUS signal with our data, which \
especially contains the id of the MixDevice. + * Handles the hotplug of new MPRIS2 \
                enabled Media Players
  */
 void Mixer_MPRIS2::newMediaPlayer(QString name, QString oldOwner, QString newOwner)
 {
-	if (dbusConnPtr == 0)
-	{
-		kError() << "We see a new application is registering on DBUS, but we have no DBUS \
                connection. This is most definitely weird.";
-		return; // No DBUS connection. We should never enter this SLOT at all
-	}
-
 	if ( name.startsWith("org.mpris.MediaPlayer2") )
 	{
-		kDebug() << "DO SOMETHING: " << name << "," << oldOwner << "," << newOwner;
 		if ( oldOwner.isEmpty() && !newOwner.isEmpty())
 		{
 			kDebug() << "Mediaplayer registers: " << name;
 			QDBusConnection dbusConn = QDBusConnection::sessionBus();
-			getMprisControl(dbusConn, name);
-		    QMetaObject::invokeMethod(this,
-		                              "controlsReconfigured",
-		                              Qt::QueuedConnection,
-		                              Q_ARG(QString, _mixer->id()));
+			addMprisControl(dbusConn, name);
+		    notifyToReconfigureControls();
 		}
 		else if ( !oldOwner.isEmpty() && newOwner.isEmpty())
 		{
@@ -318,10 +332,7 @@
 			QString id = ( lastDot == -1 ) ? name : name.mid(lastDot+1);
 			apps.remove(id);
 			m_mixDevices.removeById(id);
-		    QMetaObject::invokeMethod(this,
-		                              "controlsReconfigured",
-		                              Qt::QueuedConnection,
-		                              Q_ARG(QString, _mixer->id()));
+		    notifyToReconfigureControls();
 		}
 		else
 		{
--- trunk/KDE/kdemultimedia/kmix/backends/mixer_mpris2.h #1268579:1268580
@@ -56,7 +56,7 @@
 public:
   explicit Mixer_MPRIS2(Mixer *mixer, int device = -1 );
     virtual ~Mixer_MPRIS2();
-    void getMprisControl(QDBusConnection& conn, QString arg1);
+    void addMprisControl(QDBusConnection& conn, QString arg1);
     QString getDriverName();
 
   virtual int open();
@@ -76,12 +76,10 @@
 public slots:
   void volumeChanged(MPrisAppdata* mad, double);
   void newMediaPlayer(QString name, QString oldOwner, QString newOwner);
-
 private:
-  int run();
+    int addAllRunningPlayersAndInitHotplug();
+    void notifyToReconfigureControls();
 
-  QDBusConnection* dbusConnPtr;
-  static QString MPRIS_IFC2;
   QMap<QString,MPrisAppdata*> apps;
 };
 
--- trunk/KDE/kdemultimedia/kmix/gui/kmixdockwidget.cpp #1268579:1268580
@@ -95,6 +95,7 @@
         _referenceWidget = new KMenu(parent);
         ViewDockAreaPopup* _referenceWidget2 = new \
ViewDockAreaPopup(_referenceWidget, "dockArea", Mixer::getGlobalMasterMixer(), 0, \
(GUIProfile*)0, parent);  _referenceWidget2->createDeviceWidgets();
+        connect(_referenceWidget2, SIGNAL(recreateMe()), _kmixMainWindow, \
SLOT(recreateDockWidget()));  
         _volWA = new QWidgetAction(_referenceWidget);
         _volWA->setDefaultWidget(_referenceWidget2);
--- trunk/KDE/kdemultimedia/kmix/gui/viewbase.cpp #1268579:1268580
@@ -145,23 +145,6 @@
 void ViewBase::rebuildFromProfile()
 {
    emit rebuildGUI();
-/*
-   // Redo everything from scratch, as visibility and the order of the controls \
                might have changed.
-
-   // As the order of the controls is stored in the profile, we need
-   // to rebuild the _mixSet 
-kDebug() << "rebuild 1";
-   _mixSet->clear();
-kDebug() << "rebuild 2";
-   _mdws.clear();
-kDebug() << "rebuild 3";
-   setMixSet();
-kDebug() << "rebuild 4";
-   createDeviceWidgets();
-kDebug() << "rebuild 5";
-   constructionFinished();
-kDebug() << "rebuild 6";
-*/
 }
 
 
@@ -215,7 +198,20 @@
 void ViewBase::controlsReconfigured( const QString& mixer_ID )
 {
   // TODO Search _mixers for the correct Mixer*. After that, remove _mixer instance \
                variable
-    if ( _mixer->id() == mixer_ID )
+	bool isRelevantMixer = (_mixer->id() == mixer_ID );
+	//    if (!isRelevantMixer)
+	//    {
+	//    	foreach ( Mixer* mixer , _mixers)
+	//   		{
+	//    		if ( mixer->id() == mixer_ID )
+	//    		{
+	//    			isRelevantMixer = true;
+	//    			break;
+	//    		}
+	//   		}
+	//    }
+
+	if (isRelevantMixer)
     {
         kDebug(67100) << "ViewBase::controlsReconfigured() " << mixer_ID << " is \
being redrawn (mixset contains: " << _mixSet->count() << ")";  setMixSet();
--- trunk/KDE/kdemultimedia/kmix/gui/viewdockareapopup.cpp #1268579:1268580
@@ -115,6 +115,15 @@
    
 }
 
+
+void ViewDockAreaPopup::controlsReconfigured( const QString& mixer_ID )
+{
+	kDebug(67100) << "RECONFIGURE AND RECREATE DOCK";
+	ViewBase::controlsReconfigured(mixer_ID);
+	emit recreateMe();
+}
+
+
 QWidget* ViewDockAreaPopup::add(MixDevice *md)
 {
     QString dummyMatchAll("*");
--- trunk/KDE/kdemultimedia/kmix/gui/viewdockareapopup.h #1268579:1268580
@@ -52,9 +52,15 @@
   QLayout* _layoutControls;
   QGridLayout* _layoutMDW;
 
+public slots:
+   virtual void controlsReconfigured( const QString& mixer_ID );
 private slots:
     void showPanelSlot();
+signals:
+    void recreateMe();
 
+
+
 };
 
 #endif


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

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