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

List:       kde-commits
Subject:    extragear/multimedia/kmid/alsa
From:       Pedro Lopez-Cabanillas <pedro.lopez.cabanillas () gmail ! com>
Date:       2010-06-07 15:41:08
Message-ID: 20100607154108.32AA9AC8CF () svn ! kde ! org
[Download RAW message or body]

SVN commit 1135559 by pedrol:

snd_seq_event_output_direct() is not thread safe. Workaround: centralized output, protected by a mutex. 

CCBUG: 240391

 M  +1 -0      alsamidiobject.cpp  
 M  +11 -1     alsamidioutput.cpp  
 M  +3 -0      alsamidioutput.h  
 M  +11 -0     player.cpp  
 M  +5 -2      player.h  


--- trunk/extragear/multimedia/kmid/alsa/alsamidiobject.cpp #1135558:1135559
@@ -169,6 +169,7 @@
         d->m_port->setTimestampQueue(d->m_queueId);
         d->m_port->subscribeFromAnnounce();
         d->m_player = new Player(d->m_client, d->m_portId);
+        d->m_out->setPlayer(d->m_player);
         connect( d->m_player, SIGNAL(finished()),
                  SLOT(songFinished()), Qt::QueuedConnection );
         connect( d->m_player, SIGNAL(stopped()),
--- trunk/extragear/multimedia/kmid/alsa/alsamidioutput.cpp #1135558:1135559
@@ -19,6 +19,7 @@
 
 #include "alsamidioutput.h"
 #include "midimapper.h"
+#include "player.h"
 
 #include <cmath>
 #include <alsaclient.h>
@@ -42,6 +43,7 @@
             m_port(0),
             m_loopbkport(0),
             m_mapper(0),
+            m_player(0),
             m_portId(0),
             m_pitchShift(0),
             m_clientFilter(true),
@@ -62,6 +64,7 @@
         MidiPort *m_port;
         MidiPort *m_loopbkport;
         MidiMapper *m_mapper;
+        Player *m_player;
         int m_portId;
         int m_pitchShift;
         bool m_clientFilter;
@@ -380,9 +383,12 @@
             ev->setSource(d->m_portId);
             ev->setSubscribers();
             ev->setDirect();
-            d->m_client->outputDirect(ev);
+            //d->m_client->outputDirect(ev);
+            if (d->m_player != 0) {
+                d->m_player->sendSongEvent(ev);
         }
     }
+    }
 
     void ALSAMIDIOutput::sendNoteOn(int chan, int note, int vel)
     {
@@ -449,6 +455,10 @@
         return d->m_loopbkport;
     }
 
+    void ALSAMIDIOutput::setPlayer(Player* p)
+    {
+        d->m_player = p;
 }
+}
 
 #include "alsamidioutput.moc"
--- trunk/extragear/multimedia/kmid/alsa/alsamidioutput.h #1135558:1135559
@@ -32,6 +32,8 @@
 
 namespace KMid {
 
+    class Player;
+
     class ALSAMIDIOutput : public MIDIOutput {
         Q_OBJECT
     public:
@@ -47,6 +49,7 @@
         int pitchShift();
         MidiClient* client() const;
         MidiPort* loopbackPort();
+        void setPlayer(Player *p);
 
     public Q_SLOTS:
         void setVolume(int channel, qreal);
--- trunk/extragear/multimedia/kmid/alsa/player.cpp #1135558:1135559
@@ -19,6 +19,8 @@
 
 #include "player.h"
 #include "song.h"
+#include <alsaclient.h>
+#include <QMutexLocker>
 
 namespace KMid {
 
@@ -98,6 +100,15 @@
         m_echoResolution = r;
     }
 
+    void Player::sendSongEvent(SequencerEvent* ev)
+    {
+        QMutexLocker locker(&m_outputmutex);
+        if (m_npfds != 0 && m_pfds != 0)
+            SequencerOutputThread::sendSongEvent(ev);
+        else
+            m_MidiClient->outputDirect(ev);
 }
 
+}
+
 #include "player.moc"
--- trunk/extragear/multimedia/kmid/alsa/player.h #1135558:1135559
@@ -20,9 +20,10 @@
 #ifndef INCLUDED_PLAYER_H
 #define INCLUDED_PLAYER_H
 
+#include "song.h"
+#include <playthread.h>
 #include <QObject>
-#include <playthread.h>
-#include "song.h"
+#include <QMutex>
 
 using namespace drumstick;
 
@@ -39,6 +40,7 @@
         virtual SequencerEvent* nextEvent();
         virtual unsigned int getInitialPosition();
         virtual unsigned int getEchoResolution();
+        virtual void sendSongEvent(SequencerEvent* ev);
 
         void setSong(Song* s);
         void resetPosition();
@@ -50,6 +52,7 @@
         SongIterator* m_songIterator;
         qint64 m_songPosition;
         qint32 m_echoResolution;
+        QMutex m_outputmutex;
     };
 
 }
[prev in list] [next in list] [prev in thread] [next in thread] 

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