aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-12-29 18:02:36 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-12-29 18:02:36 +0000
commitbf9fb95f3331204ea0b45f63f2f77e4401566e9e (patch)
tree54efc2a90677e15a5eccb3e479912b31c1d982dc
parent3f6675f540b1cae9b366be6050e1297458277b68 (diff)
downloadqmmp-bf9fb95f3331204ea0b45f63f2f77e4401566e9e.tar.gz
qmmp-bf9fb95f3331204ea0b45f63f2f77e4401566e9e.tar.bz2
qmmp-bf9fb95f3331204ea0b45f63f2f77e4401566e9e.zip
reduced number of locks
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7804 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/qmmp/outputwriter.cpp46
-rw-r--r--src/qmmp/outputwriter_p.h11
-rw-r--r--src/qmmp/qmmpaudioengine.cpp27
-rw-r--r--src/qmmp/qmmpaudioengine_p.h7
4 files changed, 32 insertions, 59 deletions
diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp
index 5dd2a4dce..8b39c221b 100644
--- a/src/qmmp/outputwriter.cpp
+++ b/src/qmmp/outputwriter.cpp
@@ -116,9 +116,7 @@ bool OutputWriter::initialize(quint32 freq, ChannelMap map)
void OutputWriter::pause()
{
- mutex()->lock();
m_pause = !m_pause;
- mutex()->unlock();
Qmmp::State state = m_pause ? Qmmp::Paused: Qmmp::Playing;
dispatch(state);
}
@@ -140,9 +138,11 @@ void OutputWriter::finish()
void OutputWriter::seek(qint64 pos, bool reset)
{
+ m_mutex.lock();
m_totalWritten = pos * m_bytesPerMillisecond;
m_currentMilliseconds = -1;
m_skip = isRunning() && reset;
+ m_mutex.unlock();
}
Recycler *OutputWriter::recycler()
@@ -150,11 +150,6 @@ Recycler *OutputWriter::recycler()
return &m_recycler;
}
-QMutex *OutputWriter::mutex()
-{
- return &m_mutex;
-}
-
AudioParameters OutputWriter::audioParameters() const
{
return AudioParameters(m_frequency, m_chan_map, Qmmp::PCM_FLOAT);
@@ -264,14 +259,14 @@ void OutputWriter::dispatch(const AudioParameters &p)
void OutputWriter::run()
{
- mutex()->lock ();
+ m_mutex.lock ();
if (!m_bytesPerMillisecond)
{
qWarning("OutputWriter: invalid audio parameters");
- mutex()->unlock ();
+ m_mutex.unlock ();
return;
}
- mutex()->unlock ();
+ m_mutex.unlock ();
bool done = false;
Buffer *b = 0;
@@ -286,14 +281,13 @@ void OutputWriter::run()
while (!done)
{
- mutex()->lock ();
+ m_mutex.lock ();
if(m_pause != m_prev_pause)
{
if(m_pause)
{
Visual::clearBuffer();
m_output->suspend();
- mutex()->unlock();
m_prev_pause = m_pause;
continue;
}
@@ -307,9 +301,9 @@ void OutputWriter::run()
while (!done && (recycler()->empty() || m_pause))
{
recycler()->cond()->wakeOne();
- mutex()->unlock();
+ m_mutex.unlock();
recycler()->cond()->wait(recycler()->mutex());
- mutex()->lock ();
+ m_mutex.lock ();
done = m_user_stop || m_finish;
}
@@ -327,15 +321,15 @@ void OutputWriter::run()
recycler()->cond()->wakeOne();
recycler()->mutex()->unlock();
- mutex()->unlock();
+ m_mutex.unlock();
if (b)
{
- mutex()->lock();
+ m_mutex.lock();
if (m_useEq)
{
iir(b->data, b->samples, m_channels);
}
- mutex()->unlock();
+ m_mutex.unlock();
dispatchVisual(b);
if (SoftwareVolume::instance())
SoftwareVolume::instance()->changeVolume(b, m_channels);
@@ -367,16 +361,16 @@ void OutputWriter::run()
while (l < output_at && !m_pause && !m_prev_pause)
{
- mutex()->lock();
+ m_mutex.lock();
if(m_skip)
{
m_skip = false;
Visual::clearBuffer();
m_output->reset();
- mutex()->unlock();
+ m_mutex.unlock();
break;
}
- mutex()->unlock();
+ m_mutex.unlock();
m = m_output->writeAudio(tmp + l, output_at - l);
if(m >= 0)
{
@@ -389,15 +383,15 @@ void OutputWriter::run()
if(m < 0)
break;
}
- mutex()->lock();
+ m_mutex.lock();
//force buffer change
recycler()->mutex()->lock ();
recycler()->done();
recycler()->mutex()->unlock();
b = 0;
- mutex()->unlock();
+ m_mutex.unlock();
}
- mutex()->lock ();
+ m_mutex.lock();
//write remaining data
if(m_finish)
{
@@ -410,7 +404,7 @@ void OutputWriter::run()
}
dispatch(Qmmp::Stopped);
stopVisualization();
- mutex()->unlock();
+ m_mutex.unlock();
}
void OutputWriter::status()
@@ -429,7 +423,7 @@ void OutputWriter::status()
void OutputWriter::updateEqSettings()
{
- mutex()->lock();
+ m_mutex.lock();
if(m_settings->eqSettings().isEnabled())
{
double preamp = m_settings->eqSettings().preamp();
@@ -447,5 +441,5 @@ void OutputWriter::updateEqSettings()
}
}
m_useEq = m_settings->eqSettings().isEnabled();
- mutex()->unlock();
+ m_mutex.unlock();
}
diff --git a/src/qmmp/outputwriter_p.h b/src/qmmp/outputwriter_p.h
index d0963a11b..272e219a1 100644
--- a/src/qmmp/outputwriter_p.h
+++ b/src/qmmp/outputwriter_p.h
@@ -23,6 +23,7 @@
#include <QThread>
#include <QMutex>
+#include <atomic>
#include "recycler_p.h"
#include "audioparameters.h"
#include "channelmap.h"
@@ -81,10 +82,6 @@ public:
*/
Recycler *recycler();
/*!
- * Returns mutex pointer.
- */
- QMutex *mutex();
- /*!
* Returns selected audio parameters.
*/
AudioParameters audioParameters() const;
@@ -127,14 +124,14 @@ private:
ChannelMap m_chan_map;
Qmmp::AudioFormat m_format;
qint64 m_bytesPerMillisecond;
- bool m_user_stop, m_pause;
+ std::atomic_bool m_user_stop, m_pause;
bool m_prev_pause;
- bool m_finish;
+ std::atomic_bool m_finish;
bool m_useEq;
qint64 m_totalWritten, m_currentMilliseconds;
QmmpSettings *m_settings;
Output *m_output;
- bool m_muted;
+ std::atomic_bool m_muted;
AudioParameters m_in_params;
AudioConverter *m_format_converter;
ChannelConverter *m_channel_converter;
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index 975f8812f..5b9ce9104 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -225,9 +225,7 @@ void QmmpAudioEngine::seek(qint64 time)
{
if (m_output && m_output->isRunning())
{
- m_output->mutex()->lock ();
m_output->seek(time, true);
- m_output->mutex()->unlock();
if (isRunning())
{
mutex()->lock ();
@@ -255,17 +253,13 @@ void QmmpAudioEngine::setMuted(bool muted)
m_muted = muted;
if(m_output)
{
- m_output->mutex()->lock();
m_output->setMuted(muted);
- m_output->mutex()->unlock();
}
}
void QmmpAudioEngine::stop()
{
- mutex()->lock ();
m_user_stop = true;
- mutex()->unlock();
if (m_output)
m_output->recycler()->cond()->wakeAll();
@@ -309,11 +303,9 @@ qint64 QmmpAudioEngine::produceSound(unsigned char *data, qint64 size, quint32 b
void QmmpAudioEngine::finish()
{
- if (m_output)
+ if(m_output)
{
- m_output->mutex()->lock ();
m_output->finish();
- m_output->mutex()->unlock();
}
StateHandler::instance()->sendFinished();
}
@@ -407,9 +399,7 @@ void QmmpAudioEngine::run()
mutex()->unlock();
msleep(5);
delay += 5;
- mutex()->lock();
- m_done = m_user_stop;
- mutex()->unlock();
+ m_done = m_user_stop.load();
if(delay > TRANSPORT_TIMEOUT)
{
qWarning("QmmpAudioEngine: unable to receive more data");
@@ -445,9 +435,7 @@ void QmmpAudioEngine::run()
m_decoder->next();
StateHandler::instance()->dispatch(m_decoder->totalTime());
m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo());
- m_output->mutex()->lock();
m_output->seek(0); //reset counter
- m_output->mutex()->unlock();
addOffset(); //offset
StateHandler::instance()->dispatch(Qmmp::Playing);
mutex()->unlock();
@@ -468,9 +456,7 @@ void QmmpAudioEngine::run()
StateHandler::instance()->dispatch(Qmmp::Stopped); //fake stop/start cycle
StateHandler::instance()->dispatch(Qmmp::Buffering);
StateHandler::instance()->dispatch(m_decoder->totalTime());
- m_output->mutex()->lock();
m_output->seek(0); //reset counter
- m_output->mutex()->unlock();
StateHandler::instance()->dispatch(Qmmp::Playing);
mutex()->unlock();
sendMetaData();
@@ -536,21 +522,16 @@ void QmmpAudioEngine::run()
if (m_finish)
finish();
if(m_output)
- {
- m_output->mutex()->lock();
m_output->recycler()->cond()->wakeAll();
- m_output->mutex()->unlock();
- }
+
mutex()->unlock();
if (m_output)
{
if(m_user_stop || (m_done && !m_finish))
{
- m_output->mutex()->lock ();
m_output->stop();
m_output->recycler()->cond()->wakeAll();
- m_output->mutex()->unlock();
}
if(m_output->isRunning())
@@ -579,7 +560,7 @@ void QmmpAudioEngine::flush(bool final)
mutex()->unlock();
m_output->recycler()->cond()->wait(m_output->recycler()->mutex());
mutex()->lock ();
- m_done = m_user_stop;
+ m_done = m_user_stop.load();
}
if (m_user_stop || m_finish)
diff --git a/src/qmmp/qmmpaudioengine_p.h b/src/qmmp/qmmpaudioengine_p.h
index b7d39811e..5efa831ab 100644
--- a/src/qmmp/qmmpaudioengine_p.h
+++ b/src/qmmp/qmmpaudioengine_p.h
@@ -23,6 +23,7 @@
#include <QQueue>
#include <QHash>
+#include <atomic>
#include <QSharedPointer>
#include "abstractengine.h"
#include "audioparameters.h"
@@ -79,11 +80,11 @@ private:
void prepareEffects(Decoder *d);
DecoderFactory *m_factory;
- QList <Effect*> m_effects;
- QList <Effect*> m_blockedEffects;
+ QList<Effect*> m_effects;
+ QList<Effect*> m_blockedEffects;
OutputWriter *m_output;
- bool m_done, m_finish, m_user_stop;
+ std::atomic_bool m_done, m_finish, m_user_stop;
uint m_bks, m_sample_size;
qint64 m_seekTime;
quint64 m_output_at, m_output_size;