[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Traverso-commit] traverso/src base.pri core/AudioClip.cpp core/S...
From: |
Remon Sijrier |
Subject: |
[Traverso-commit] traverso/src base.pri core/AudioClip.cpp core/S... |
Date: |
Mon, 25 Jun 2007 13:32:29 +0000 |
CVSROOT: /sources/traverso
Module name: traverso
Changes by: Remon Sijrier <r_sijrier> 07/06/25 13:32:29
Modified files:
src : base.pri
src/core : AudioClip.cpp Song.cpp Song.h
src/engine : AudioDevice.cpp defines.h JackDriver.cpp
Tsar.cpp Tsar.h
Log message:
* added thread check DEFINE
* fixed threading issue where both gui and rt thread were writing to
the rt event buffer!
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/base.pri?cvsroot=traverso&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AudioClip.cpp?cvsroot=traverso&r1=1.108&r2=1.109
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.119&r2=1.120
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.h?cvsroot=traverso&r1=1.61&r2=1.62
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/AudioDevice.cpp?cvsroot=traverso&r1=1.35&r2=1.36
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/defines.h?cvsroot=traverso&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/JackDriver.cpp?cvsroot=traverso&r1=1.17&r2=1.18
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/Tsar.cpp?cvsroot=traverso&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/Tsar.h?cvsroot=traverso&r1=1.1&r2=1.2
Patches:
Index: base.pri
===================================================================
RCS file: /sources/traverso/traverso/src/base.pri,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- base.pri 22 Jun 2007 12:29:27 -0000 1.39
+++ base.pri 25 Jun 2007 13:32:28 -0000 1.40
@@ -36,14 +36,17 @@
# gcc 4.3 has a core2 flag, though it's not released yet.
#QMAKE_CXXFLAGS_RELEASE += -march=core2
-#
-# Use Memory Locking
-#
-DEFINES += USE_MLOCK
+#########################################
+# END USER CONFIGURATION #
+#########################################
-####### END USER CONFIGURATION ########
-########################################
+
+
+
+#################################################
+# OPTIONS WHO COULD BE USEFULL FOR PACKAGERS #
+#################################################
#
# uncomment if you have a patched Qt 4.3.0 !
@@ -53,11 +56,23 @@
DEFINES += STATIC_BUILD
+#
+# Use Memory Locking
+#
+DEFINES += USE_MLOCK
+
+
+#################################################
+# NO CHANGES BELOW THIS LINE!! #
+#################################################
+
+
!macx{
- DEFINES += PRECOMPILED_HEADER
+# DEFINES += PRECOMPILED_HEADER
}
-#QMAKE_CXXFLAGS += -fstack-protector-all
+# DEFINES += THREAD_CHECK
+# QMAKE_CXXFLAGS += -fstack-protector-all
CONFIG += warn_on qt
@@ -69,7 +84,6 @@
debug {
-# DEFINES += RT_THREAD_CHECK
DEFINES += USE_DEBUGGER
# DEFINES += USE_MEM_CHECKER
}
Index: core/AudioClip.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/AudioClip.cpp,v
retrieving revision 1.108
retrieving revision 1.109
diff -u -b -r1.108 -r1.109
--- core/AudioClip.cpp 18 Jun 2007 10:23:27 -0000 1.108
+++ core/AudioClip.cpp 25 Jun 2007 13:32:28 -0000 1.109
@@ -949,7 +949,7 @@
fadeIn = new FadeCurve(this, m_song, "FadeIn");
fadeIn->set_shape("Linear");
fadeIn->set_history_stack(get_history_stack());
- THREAD_SAVE_CALL_EMIT_SIGNAL(this, fadeIn,
private_add_fade(FadeCurve*), fadeAdded(FadeCurve*));
+ THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(this, fadeIn,
private_add_fade(FadeCurve*), fadeAdded(FadeCurve*));
}
void AudioClip::create_fade_out( )
@@ -957,7 +957,7 @@
fadeOut = new FadeCurve(this, m_song, "FadeOut");
fadeOut->set_shape("Linear");
fadeOut->set_history_stack(get_history_stack());
- THREAD_SAVE_CALL_EMIT_SIGNAL(this, fadeOut,
private_add_fade(FadeCurve*), fadeAdded(FadeCurve*));
+ THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(this, fadeOut,
private_add_fade(FadeCurve*), fadeAdded(FadeCurve*));
}
QDomNode AudioClip::get_dom_node() const
Index: core/Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.119
retrieving revision 1.120
diff -u -b -r1.119 -r1.120
--- core/Song.cpp 21 Jun 2007 14:31:10 -0000 1.119
+++ core/Song.cpp 25 Jun 2007 13:32:28 -0000 1.120
@@ -121,7 +121,9 @@
void Song::init()
{
PENTER2;
-// threadId = QThread::currentThreadId ();
+#if defined (THREAD_CHECK)
+ threadId = QThread::currentThreadId ();
+#endif
m_diskio = new DiskIO(this);
@@ -148,12 +150,12 @@
m_playBackBus = audiodevice().get_playback_bus("Playback 1");
- m_transport = m_stopTransport = resumeTransport = m_readyToRecord =
false;
+ m_transport = m_stopTransport = m_resumeTransport = m_readyToRecord =
false;
snaplist = new SnapList(this);
workSnap = new Snappable();
workSnap->set_snap_list(snaplist);
- realtimepath = false;
+ m_realtimepath = false;
m_scheduledForDeletion = false;
m_isSnapOn=true;
changed = m_rendering = m_recording = m_prepareRecording = false;
@@ -332,7 +334,7 @@
if ( ! (spec->renderpass == ExportSpecification::CREATE_CDRDAO_TOC) ) {
if (is_transport_rolling()) {
spec->resumeTransport = true;
- stop_transport_rolling();
+ stop_transport_rolling(false);
}
m_rendering = true;
@@ -568,53 +570,6 @@
emit workingPosChanged();
}
-void Song::set_transport_pos(nframes_t position)
-{
- audiodevice().transport_seek_to(m_audiodeviceClient, position);
-}
-
-
-//
-// Function _could_ be called in RealTime AudioThread processing path
-// Be EXTREMELY carefull to not call functions() that have blocking behavior!!
-//
-void Song::start_seek()
-{
- PMESG2("Song :: entering start_seek");
-// PMESG2("Song :: thread id is: %ld", QThread::currentThreadId ());
- PMESG2("Song::start_seek()");
-
- if (is_transport_rolling()) {
- realtimepath = false;
- resumeTransport = true;
- }
-
- m_transport = false;
- m_startSeek = 0;
-
- // only sets a boolean flag, save to call.
- m_diskio->prepare_for_seek();
-
- // 'Tell' the diskio it should start a seek action.
- RT_THREAD_EMIT(this, (void*)m_newTransportFramePos, seekStart(uint));
-
- PMESG2("Song :: leaving start_seek");
-}
-
-void Song::seek_finished()
-{
- PMESG2("Song :: entering seek_finished");
- m_transportFrame = m_newTransportFramePos;
- m_seeking = 0;
-
- if (resumeTransport) {
- start_transport_rolling();
- resumeTransport = false;
- }
-
- emit transportPosSet();
- PMESG2("Song :: leaving seek_finished");
-}
Command* Song::toggle_snap()
{
@@ -769,7 +724,7 @@
if (m_stopTransport) {
RT_THREAD_EMIT(this, 0, transferStopped());
m_transport = false;
- realtimepath = false;
+ m_realtimepath = false;
m_stopTransport = false;
return 0;
@@ -1091,7 +1046,11 @@
// Function is only to be called from GUI thread.
Command * Song::set_recordable()
{
- // Do nothing is transport is rolling!
+#if defined (THREAD_CHECK)
+ Q_ASSERT(QThread::currentThreadId() == threadId);
+#endif
+
+ // Do nothing if transport is rolling!
if (is_transport_rolling()) {
return 0;
}
@@ -1099,14 +1058,14 @@
// Transport is not rolling, it's save now to switch
// recording state to on /off
if (is_recording()) {
- set_recording(false);
+ set_recording(false, false);
} else {
if (!any_track_armed()) {
info().critical(tr("No Tracks armed to record too!"));
return 0;
}
- set_recording(true);
+ set_recording(true, false);
}
return 0;
@@ -1127,6 +1086,9 @@
// Function is only to be called from GUI thread.
Command* Song::start_transport()
{
+#if defined (THREAD_CHECK)
+ Q_ASSERT(QThread::currentThreadId() == threadId);
+#endif
// Delegate the transport start (or if we are rolling stop)
// request to the audiodevice. Depending on the driver in use
// this call will return directly to us (by a call to
transport_control),
@@ -1151,7 +1113,7 @@
switch(state.tranport) {
case TransportStopped:
if (is_transport_rolling()) {
- stop_transport_rolling();
+ stop_transport_rolling(state.realtime);
}
return true;
@@ -1173,6 +1135,7 @@
// prepare_recording() is only to be
called from the GUI thread
// so we delegate the
prepare_recording() function call via a
// RT thread save signal!
+ Q_ASSERT(state.realtime);
RT_THREAD_EMIT(this, 0,
prepareRecording());
PMESG("transport starting: initiating
prepare for record");
return false;
@@ -1198,9 +1161,10 @@
// thread, and TransportStarting never was called
before!
// So in case we are recording we have to prepare for
recording now!
if ( ! state.isSlave && is_recording() ) {
+ Q_ASSERT(!state.realtime);
prepare_recording();
}
- start_transport_rolling();
+ start_transport_rolling(state.realtime);
}
return true;
}
@@ -1209,30 +1173,34 @@
}
// RT thread save function
-void Song::start_transport_rolling()
+void Song::start_transport_rolling(bool realtime)
{
- realtimepath = true;
+ m_realtimepath = true;
m_transport = 1;
+ if (realtime) {
RT_THREAD_EMIT(this, 0, transferStarted());
+ } else {
+ emit transferStarted();
+ }
PMESG("tranport rolling");
}
// RT thread save function
-void Song::stop_transport_rolling()
+void Song::stop_transport_rolling(bool realtime)
{
m_stopTransport = 1;
if (is_recording()) {
- set_recording(false);
+ set_recording(false, realtime);
}
PMESG("tranport stopped");
}
// RT thread save function
-void Song::set_recording(bool recording)
+void Song::set_recording(bool recording, bool realtime)
{
m_recording = recording;
@@ -1241,13 +1209,21 @@
m_prepareRecording = false;
}
+ if (realtime) {
RT_THREAD_EMIT(this, 0, recordingStateChanged());
+ } else {
+ emit recordingStateChanged();
+ }
}
// NON RT thread save function, should only be called from GUI thread!!
void Song::prepare_recording()
{
+#if defined (THREAD_CHECK)
+ Q_ASSERT(QThread::currentThreadId() == threadId);
+#endif
+
if (m_recording && any_track_armed()) {
CommandGroup* group = new CommandGroup(this, "");
int clipcount = 0;
@@ -1267,5 +1243,57 @@
m_readyToRecord = true;
}
+void Song::set_transport_pos(nframes_t position)
+{
+#if defined (THREAD_CHECK)
+ Q_ASSERT(QThread::currentThreadId() == threadId);
+#endif
+ audiodevice().transport_seek_to(m_audiodeviceClient, position);
+}
+
+
+//
+// Function is ALWAYS called in RealTime AudioThread processing path
+// Be EXTREMELY carefull to not call functions() that have blocking behavior!!
+//
+void Song::start_seek()
+{
+#if defined (THREAD_CHECK)
+ Q_ASSERT(threadId != QThread::currentThreadId ());
+#endif
+
+ if (is_transport_rolling()) {
+ m_realtimepath = false;
+ m_resumeTransport = true;
+ }
+
+ m_transport = false;
+ m_startSeek = 0;
+
+ // only sets a boolean flag, save to call.
+ m_diskio->prepare_for_seek();
+
+ // 'Tell' the diskio it should start a seek action.
+ RT_THREAD_EMIT(this, (void*)m_newTransportFramePos, seekStart(uint));
+}
+
+void Song::seek_finished()
+{
+#if defined (THREAD_CHECK)
+ Q_ASSERT_X(threadId == QThread::currentThreadId (),
"Song::seek_finished", "Called from other Thread!");
+#endif
+ PMESG2("Song :: entering seek_finished");
+ m_transportFrame = m_newTransportFramePos;
+ m_seeking = 0;
+
+ if (m_resumeTransport) {
+ start_transport_rolling(false);
+ m_resumeTransport = false;
+ }
+
+ emit transportPosSet();
+ PMESG2("Song :: leaving seek_finished");
+}
+
// eof
Index: core/Song.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.h,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -b -r1.61 -r1.62
--- core/Song.h 22 Jun 2007 12:29:28 -0000 1.61
+++ core/Song.h 25 Jun 2007 13:32:28 -0000 1.62
@@ -113,7 +113,7 @@
void set_snapping(bool snap);
void set_scrollbar_xy(int x, int y) {m_sbx = x; m_sby = y;}
int set_state( const QDomNode & node );
- void set_recording(bool recording);
+ void set_recording(bool recording, bool realtime);
int process(nframes_t nframes);
@@ -130,7 +130,7 @@
Command* remove_track(Track* track, bool historable=true);
bool any_track_armed();
- bool realtime_path() const {return realtimepath;}
+ bool realtime_path() const {return m_realtimepath;}
bool is_changed() const {return changed;}
bool is_snap_on() const {return m_isSnapOn;}
bool is_recording() const {return m_recording;}
@@ -144,7 +144,9 @@
audio_sample_t* readbuffer;
audio_sample_t* gainbuffer;
+#if defined (THREAD_CHECK)
unsigned long threadId;
+#endif
private:
QList<Track* > m_tracks;
@@ -182,9 +184,9 @@
bool m_rendering;
bool changed;
bool m_isSnapOn;
- bool resumeTransport;
+ bool m_resumeTransport;
bool m_stopTransport;
- bool realtimepath;
+ bool m_realtimepath;
bool m_scheduledForDeletion;
bool m_recording;
bool m_prepareRecording;
@@ -197,8 +199,8 @@
int finish_audio_export();
void start_seek();
- void start_transport_rolling();
- void stop_transport_rolling();
+ void start_transport_rolling(bool realtime);
+ void stop_transport_rolling(bool realtime);
void resize_buffer(bool updateArmStatus, nframes_t size);
Index: engine/AudioDevice.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/AudioDevice.cpp,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -b -r1.35 -r1.36
--- engine/AudioDevice.cpp 22 Jun 2007 12:29:28 -0000 1.35
+++ engine/AudioDevice.cpp 25 Jun 2007 13:32:28 -0000 1.36
@@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Id: AudioDevice.cpp,v 1.35 2007/06/22 12:29:28 r_sijrier Exp $
+$Id: AudioDevice.cpp,v 1.36 2007/06/25 13:32:28 r_sijrier Exp $
*/
#include "AudioDevice.h"
@@ -692,7 +692,7 @@
*/
void AudioDevice::add_client( Client * client )
{
- THREAD_SAVE_CALL(this, client, private_add_client(Client*));
+ THREAD_SAVE_INVOKE(this, client, private_add_client(Client*));
}
/**
@@ -703,7 +703,7 @@
*/
void AudioDevice::remove_client( Client * client )
{
- THREAD_SAVE_CALL_EMIT_SIGNAL(this, client,
private_remove_client(Client*), clientRemoved(Client*));
+ THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(this, client,
private_remove_client(Client*), clientRemoved(Client*));
}
void AudioDevice::mili_sleep(int msec)
@@ -789,6 +789,7 @@
transport_state_t state;
state.tranport = TransportRolling;
state.isSlave = false;
+ state.realtime = false;
state.frame = 0; // get from client!!
client->transport_control(state);
@@ -808,6 +809,7 @@
transport_state_t state;
state.tranport = TransportStopped;
state.isSlave = false;
+ state.realtime = false;
state.frame = 0; // get from client!!
client->transport_control(state);
@@ -827,6 +829,7 @@
transport_state_t state;
state.tranport = TransportStarting;
state.isSlave = false;
+ state.realtime = false;
state.frame = frame;
client->transport_control(state);
Index: engine/defines.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/defines.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- engine/defines.h 22 Jun 2007 12:29:28 -0000 1.9
+++ engine/defines.h 25 Jun 2007 13:32:28 -0000 1.10
@@ -51,6 +51,7 @@
int tranport;
nframes_t frame;
bool isSlave;
+ bool realtime;
} transport_state_t;
/**
Index: engine/JackDriver.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/JackDriver.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -b -r1.17 -r1.18
--- engine/JackDriver.cpp 22 Jun 2007 12:29:28 -0000 1.17
+++ engine/JackDriver.cpp 25 Jun 2007 13:32:28 -0000 1.18
@@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- $Id: JackDriver.cpp,v 1.17 2007/06/22 12:29:28 r_sijrier Exp $
+ $Id: JackDriver.cpp,v 1.18 2007/06/25 13:32:28 r_sijrier Exp $
*/
#include "JackDriver.h"
@@ -243,6 +243,8 @@
transport_state_t tranportstate;
tranportstate.tranport = state;
tranportstate.frame = pos.frame;
+ tranportstate.realtime = true;
+
device->transport_control(tranportstate);
device->run_cycle( nframes, 0.0);
@@ -255,6 +257,7 @@
tranportstate.tranport = state;
tranportstate.frame = pos->frame;
tranportstate.isSlave = true;
+ tranportstate.realtime = true;
return device->transport_control(tranportstate);
}
Index: engine/Tsar.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/Tsar.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- engine/Tsar.cpp 5 Feb 2007 17:10:00 -0000 1.8
+++ engine/Tsar.cpp 25 Jun 2007 13:32:28 -0000 1.9
@@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Id: Tsar.cpp,v 1.8 2007/02/05 17:10:00 r_sijrier Exp $
+$Id: Tsar.cpp,v 1.9 2007/06/25 13:32:28 r_sijrier Exp $
*/
#include "Tsar.h"
@@ -26,6 +26,7 @@
#include <QMetaMethod>
#include <QMessageBox>
#include <QCoreApplication>
+#include <QThread>
// Always put me below _all_ includes, this is needed
@@ -59,6 +60,10 @@
m_events.append(new RingBufferNPT<TsarEvent>(100));
oldEvents = new RingBufferNPT<TsarEvent>(1000);
+#if defined (THREAD_CHECK)
+ m_threadId = QThread::currentThreadId ();
+#endif
+
connect(&finishOldEventsTimer, SIGNAL(timeout()), this,
SLOT(finish_processed_events()));
finishOldEventsTimer.start( 20 );
@@ -81,6 +86,9 @@
*/
void Tsar::add_event(TsarEvent& event )
{
+#if defined (THREAD_CHECK)
+ Q_ASSERT_X(m_threadId == QThread::currentThreadId (),
"Tsar::add_event", "Adding event from other then GUI thread!!");
+#endif
m_events.at(0)->write(&event, 1);
m_eventCounter++;
}
@@ -96,6 +104,9 @@
*/
void Tsar::add_rt_event( TsarEvent& event )
{
+#if defined (THREAD_CHECK)
+ Q_ASSERT_X(m_threadId != QThread::currentThreadId (),
"Tsar::add_rt_event", "Adding event from NON-RT Thread!!");
+#endif
m_events.at(1)->write(&event, 1);
}
@@ -104,7 +115,7 @@
//
void Tsar::process_events( )
{
-//#define profile
+// #define profile
for (int i=0; i<m_events.size(); ++i) {
RingBufferNPT<TsarEvent>* newEvents = m_events.at(i);
Index: engine/Tsar.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/Tsar.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- engine/Tsar.h 2 Oct 2006 19:11:43 -0000 1.1
+++ engine/Tsar.h 25 Jun 2007 13:32:29 -0000 1.2
@@ -17,7 +17,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-$Id: Tsar.h,v 1.1 2006/10/02 19:11:43 r_sijrier Exp $
+$Id: Tsar.h,v 1.2 2007/06/25 13:32:29 r_sijrier Exp $
*/
#ifndef TSAR_H
@@ -28,17 +28,31 @@
#include <QByteArray>
#include "RingBufferNPT.h"
-#define THREAD_SAVE_CALL(caller, argument, slotSignature) { \
+#define THREAD_SAVE_INVOKE(caller, argument, slotSignature) { \
TsarEvent event = tsar().create_event(caller, argument,
#slotSignature, ""); \
tsar().add_event(event);\
}
-#define RT_THREAD_EMIT(caller, argument, signalSignature) {\
- TsarEvent event = tsar().create_event(caller, argument, "",
#signalSignature); \
- tsar().add_rt_event(event);\
+#define RT_THREAD_EMIT(cal, arg, signalSignature) {\
+ TsarEvent event; \
+ event.caller = cal; \
+ event.argument = arg; \
+ event.slotindex = -1; \
+ static int retrievedsignalindex; \
+ \
+ if ( ! retrievedsignalindex ) { \
+ /* the signal index seems to have an offset of 4, so we have to
substract 4 from */ \
+ /* the value returned by caller->metaObject()->indexOfMethod*/
\
+ retrievedsignalindex =
cal->metaObject()->indexOfMethod(#signalSignature) - 4; \
+ Q_ASSERT(retrievedsignalindex >= 0); \
+ } \
+ event.signalindex = retrievedsignalindex; \
+ event.valid = true; \
+ tsar().add_rt_event(event); \
}\
-#define THREAD_SAVE_CALL_EMIT_SIGNAL(caller, argument, slotSignature,
signalSignature) { \
+
+#define THREAD_SAVE_INVOKE_AND_EMIT_SIGNAL(caller, argument, slotSignature,
signalSignature) { \
TsarEvent event = tsar().create_event(caller, argument, #slotSignature,
#signalSignature); \
tsar().add_event(event);\
}\
@@ -85,6 +99,9 @@
RingBufferNPT<TsarEvent>* oldEvents;
QTimer finishOldEventsTimer;
int m_eventCounter;
+#if defined (THREAD_CHECK)
+ unsigned long m_threadId;
+#endif
void process_events();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso/src base.pri core/AudioClip.cpp core/S...,
Remon Sijrier <=