diff options
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 46 | ||||
| -rw-r--r-- | src/qmmp/outputwriter_p.h | 11 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 27 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine_p.h | 7 |
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; |
