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

List:       kde-commits
Subject:    extragear/multimedia/kmid/src
From:       Pedro Lopez-Cabanillas <pedro.lopez.cabanillas () gmail ! com>
Date:       2010-07-28 12:35:03
Message-ID: 20100728123503.24B4EAC782 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1156011 by pedrol:

kmid_part: wait for a connection before start playing, if required.

 M  +37 -10    kmid_part.cpp  


--- trunk/extragear/multimedia/kmid/src/kmid_part.cpp #1156010:1156011
@@ -40,6 +40,8 @@
 
 #include <QtCore/QFile>
 #include <QtCore/QTextStream>
+#include <QtCore/QMutex>
+#include <QtCore/QMutexLocker>
 #include <QtDBus/QtDBus>
 #include <QtGui/QTextEdit>
 
@@ -65,7 +67,9 @@
         m_settings(new KMid::Settings),
         m_mapper(new KMid::MidiMapper),
         m_autoStart(true),
-        m_volfactor(1.0)
+        m_volfactor(1.0),
+        m_playerReady(false),
+        m_playPending(false)
     {
         if (parentWidget != 0)
             m_view = new KMidPartView(parentWidget);
@@ -93,6 +97,9 @@
     QString m_currentBackendLibrary;
     bool m_autoStart;
     double m_volfactor;
+    bool m_playerReady;
+    bool m_playPending;
+    QMutex m_connmutex;
 };
 
 KMidPart::KMidPart( QWidget *parentWidget, QObject *parent, const QVariantList& /*args*/ )
@@ -129,7 +136,6 @@
 
 KMidPart::~KMidPart()
 {
-    kDebug();
     stop();
     if (d->m_midiout != 0) {
         d->m_midiout->allNotesOff();
@@ -219,18 +225,25 @@
         }
         d->m_midiout->setResetMessage(d->m_resetMessage);
         if (d->m_currentBackend->hasSoftSynths()) {
-            connect( d->m_currentBackend, SIGNAL(softSynthStarted(const QString&,const QStringList&)),
+            connect( d->m_currentBackend,
+                SIGNAL(softSynthStarted(const QString&,const QStringList&)),
                      SLOT(slotSoftSynthStarted(const QString&,const QStringList&)));
-            connect( d->m_currentBackend, SIGNAL(softSynthErrors(const QString&,const QStringList&)),
+            connect( d->m_currentBackend,
+                SIGNAL(softSynthErrors(const QString&,const QStringList&)),
                      SLOT(slotSoftSynthErrors(const QString&,const QStringList&)));
         }
-        if ( d->m_midiout != 0  && !d->m_settings->exec_fluid() && !d->m_settings->exec_timidity() )
+        if ( d->m_midiout != 0) {
+            if (d->m_settings->exec_fluid() || d->m_settings->exec_timidity())
+                kDebug() << "waiting for a soft synth";
+            else
             connectMidiOutput();
+        }
         slotUpdateState(Empty,Empty);
     }
 }
 
-void KMidPart::slotLoaded(Backend *backend, const QString& library, const QString& name)
+void KMidPart::slotLoaded( Backend *backend,
+        const QString& library, const QString& name)
 {
     MidiBackend midiBackend;
     midiBackend.backend = backend;
@@ -317,10 +330,11 @@
 
 void KMidPart::connectMidiOutput()
 {
+    QMutexLocker locker(&d->m_connmutex);
     bool success = false;
     QString conn = d->m_settings->output_connection();
     if (conn.isEmpty()) {
-        QStringList items = d->m_midiout->outputDeviceList(true);
+        QStringList items = d->m_midiout->outputDeviceList();
         conn = items.first();
         success = d->m_midiout->setOutputDeviceName(conn);
         if (success)
@@ -329,7 +343,12 @@
         success = d->m_midiout->setOutputDeviceName(conn);
     }
     kDebug() << "connection to" << conn << "result:" << success;
+    d->m_playerReady = success;
+    if (success && d->m_playPending) {
+        locker.unlock();
+        play();
 }
+}
 
 void KMidPart::slotUpdateState(State newState, State /*oldState*/)
 {
@@ -400,7 +419,6 @@
 bool KMidPart::openFile()
 {
     QString localFile = localFilePath();
-    kDebug() << localFile;
     if (d->m_midiobj != 0) {
         d->m_midiobj->setCurrentSource(localFile);
         d->m_midiobj->seek(0);
@@ -462,9 +480,12 @@
 
 void KMidPart::play()
 {
-    if (d->m_midiobj != NULL)
+    QMutexLocker locker(&d->m_connmutex);
+    if (d->m_midiobj != NULL) {
         d->m_midiobj->play();
+        d->m_playPending = false;
 }
+}
 
 void KMidPart::stop()
 {
@@ -474,10 +495,16 @@
 
 void KMidPart::slotSourceChanged(QString src)
 {
+    QMutexLocker locker(&d->m_connmutex);
     if (d->m_view != 0)
         d->m_view->setPosition(0);
-    if (d->m_autoStart)
+    if (d->m_autoStart) {
+        if (d->m_playerReady) {
+            locker.unlock();
         play();
+        } else
+            d->m_playPending = true;
+    }
     emit sourceChanged(src);
 }
 
[prev in list] [next in list] [prev in thread] [next in thread] 

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