reworked mixer-threads (synchronization, realization of jobqueue etc.) which results in a much better performance and stability
git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms/stable-0.4@1996 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
97
include/atomic_int.h
Executable file
97
include/atomic_int.h
Executable file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* atomic_int.h - fallback AtomicInt class when Qt is too old
|
||||
*
|
||||
* Copyright (c) 2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
*
|
||||
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public
|
||||
* License along with this program (see COPYING); if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ATOMIC_INT_H
|
||||
#define _ATOMIC_INT_H
|
||||
|
||||
#include <QtCore/QMutex>
|
||||
|
||||
#if QT_VERSION > 0x040400
|
||||
|
||||
typedef QAtomicInt AtomicInt;
|
||||
|
||||
#else
|
||||
// implement our own (slow) QAtomicInt class when on old Qt
|
||||
class AtomicInt
|
||||
{
|
||||
public:
|
||||
inline AtomicInt( int _value = 0 ) :
|
||||
m_value( _value ),
|
||||
m_lock()
|
||||
{
|
||||
}
|
||||
|
||||
inline int fetchAndStoreOrdered( int _newVal )
|
||||
{
|
||||
m_lock.lock();
|
||||
const int oldVal = m_value;
|
||||
m_value = _newVal;
|
||||
m_lock.unlock();
|
||||
|
||||
return oldVal;
|
||||
}
|
||||
|
||||
inline int fetchAndAddOrdered( int _add )
|
||||
{
|
||||
m_lock.lock();
|
||||
const int oldVal = m_value;
|
||||
m_value += _add;
|
||||
m_lock.unlock();
|
||||
|
||||
return oldVal;
|
||||
}
|
||||
|
||||
inline AtomicInt & operator=( const AtomicInt & _copy )
|
||||
{
|
||||
m_lock.lock();
|
||||
m_value = _copy.m_value;
|
||||
m_lock.unlock();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
inline AtomicInt & operator=( int _value )
|
||||
{
|
||||
m_lock.lock();
|
||||
m_value = _value;
|
||||
m_lock.unlock();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline operator int() const
|
||||
{
|
||||
return m_value;
|
||||
}
|
||||
|
||||
private:
|
||||
volatile int m_value;
|
||||
QMutex m_lock;
|
||||
} ;
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* audio_port.h - base-class for objects providing sound at a port
|
||||
*
|
||||
* Copyright (c) 2005-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
* Copyright (c) 2005-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
*
|
||||
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
|
||||
*
|
||||
@@ -136,7 +136,7 @@ private:
|
||||
|
||||
|
||||
friend class mixer;
|
||||
friend class mixerWorkerThread;
|
||||
friend class MixerWorkerThread;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* mixer.h - audio-device-independent mixer for LMMS
|
||||
*
|
||||
* Copyright (c) 2004-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
* Copyright (c) 2004-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
*
|
||||
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
|
||||
*
|
||||
@@ -40,9 +40,9 @@
|
||||
|
||||
|
||||
#include <QtCore/QMutex>
|
||||
#include <QtCore/QSemaphore>
|
||||
#include <QtCore/QThread>
|
||||
#include <QtCore/QVector>
|
||||
#include <QtCore/QWaitCondition>
|
||||
|
||||
|
||||
#include "lmms_basics.h"
|
||||
@@ -73,7 +73,7 @@ const Octaves BaseOctave = DefaultOctave;
|
||||
#include "play_handle.h"
|
||||
|
||||
|
||||
class mixerWorkerThread;
|
||||
class MixerWorkerThread;
|
||||
|
||||
|
||||
class EXPORT mixer : public QObject
|
||||
@@ -438,10 +438,9 @@ private:
|
||||
bool m_newBuffer[SURROUND_CHANNELS];
|
||||
|
||||
int m_cpuLoad;
|
||||
QVector<mixerWorkerThread *> m_workers;
|
||||
QVector<MixerWorkerThread *> m_workers;
|
||||
int m_numWorkers;
|
||||
QSemaphore m_queueReadySem;
|
||||
QSemaphore m_workersDoneSem;
|
||||
QWaitCondition m_queueReadyWaitCond;
|
||||
|
||||
|
||||
playHandleVector m_playHandles;
|
||||
@@ -469,7 +468,7 @@ private:
|
||||
|
||||
|
||||
friend class engine;
|
||||
friend class mixerWorkerThread;
|
||||
friend class MixerWorkerThread;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user