aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/qmmp/dithering.cpp4
-rw-r--r--src/qmmp/outputwriter.cpp9
-rw-r--r--src/qmmp/outputwriter_p.h8
-rw-r--r--src/qmmp/qmmpaudioengine.cpp7
4 files changed, 20 insertions, 8 deletions
diff --git a/src/qmmp/dithering.cpp b/src/qmmp/dithering.cpp
index 79da8a3fe..fc9f30636 100644
--- a/src/qmmp/dithering.cpp
+++ b/src/qmmp/dithering.cpp
@@ -2,7 +2,7 @@
* Based on madplay project *
* *
* Copyright (C) 2000-2004 Robert Leslie <rob@mars.org> *
- * Copyright (C) 2016-2017 Ilya Kotov forkotov02@ya.ru *
+ * Copyright (C) 2016-2020 Ilya Kotov forkotov02@ya.ru *
* *
* 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 *
@@ -112,7 +112,7 @@ float Dithering::audioLinearDither(float sample, AudioDither *dither)
/* dither */
random = prng(dither->random);
- output += (float)(random - dither->random) / 0xffffffffL * m_lsb;
+ output += (float)(random - dither->random) * (1.0 / 0xffffffffL) * m_lsb;
dither->random = random;
/* clip */
diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp
index 4eb6c4b46..871f0b474 100644
--- a/src/qmmp/outputwriter.cpp
+++ b/src/qmmp/outputwriter.cpp
@@ -128,9 +128,14 @@ Recycler *OutputWriter::recycler()
return &m_recycler;
}
-AudioParameters OutputWriter::audioParameters() const
+const AudioParameters &OutputWriter::inputAudioParameters() const
{
- return AudioParameters(m_frequency, m_chan_map, Qmmp::PCM_FLOAT);
+ return m_in_params;
+}
+
+AudioParameters OutputWriter::outputAudioParameters() const
+{
+ return AudioParameters(m_frequency, m_chan_map, m_format);
}
int OutputWriter::sampleSize() const
diff --git a/src/qmmp/outputwriter_p.h b/src/qmmp/outputwriter_p.h
index 6989d40c8..85619c638 100644
--- a/src/qmmp/outputwriter_p.h
+++ b/src/qmmp/outputwriter_p.h
@@ -77,9 +77,13 @@ public:
*/
Recycler *recycler();
/*!
- * Returns selected audio parameters.
+ * Returns selected audio parameters, i.e. passed by \b initialize function.
*/
- AudioParameters audioParameters() const;
+ const AudioParameters &inputAudioParameters() const;
+ /*!
+ * Returns output audio parameters, i.e. accepted by output device.
+ */
+ AudioParameters outputAudioParameters() const;
/*!
* Returns sample size in bytes.
*/
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index d574296bc..c89aff652 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -107,6 +107,7 @@ bool QmmpAudioEngine::play()
prepareEffects(m_decoders.head());
if(!(m_output = createOutput()))
return false;
+ m_dithering->setFormats(m_decoders.head()->audioParameters().format(), m_output->outputAudioParameters().format());
#ifdef Q_OS_WIN
start(QThread::HighPriority);
#else
@@ -445,7 +446,7 @@ void QmmpAudioEngine::run()
flush(true);
//use current output if possible
prepareEffects(m_decoder);
- if(m_ap == m_output->audioParameters())
+ if(m_ap == m_output->inputAudioParameters())
{
StateHandler::instance()->sendFinished();
StateHandler::instance()->dispatch(Qmmp::Stopped); //fake stop/start cycle
@@ -468,6 +469,8 @@ void QmmpAudioEngine::run()
m_output->wait();
delete m_output;
m_output = createOutput();
+ m_dithering->setFormats(m_decoders.head()->audioParameters().format(),
+ m_output->outputAudioParameters().format());
if(m_output)
{
m_output->start();
@@ -618,7 +621,7 @@ void QmmpAudioEngine::attachMetaData(Decoder *decoder, DecoderFactory *factory,
OutputWriter *QmmpAudioEngine::createOutput()
{
OutputWriter *output = new OutputWriter(nullptr);
- if (!output->initialize(m_ap.sampleRate(), m_ap.channelMap()))
+ if(!output->initialize(m_ap.sampleRate(), m_ap.channelMap()))
{
delete output;
StateHandler::instance()->dispatch(Qmmp::FatalError);