[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