diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-11-01 19:04:39 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-11-01 19:04:39 +0000 |
| commit | ea4c2f504b3c669b561fd0e8eacacb76c29334e3 (patch) | |
| tree | b2b2edd824052811a4603d4083a8e67145d7edb8 /src | |
| parent | 1f4d75c6f9f5b45b8b55c1dabf8c0aa3322395fc (diff) | |
| download | qmmp-ea4c2f504b3c669b561fd0e8eacacb76c29334e3.tar.gz qmmp-ea4c2f504b3c669b561fd0e8eacacb76c29334e3.tar.bz2 qmmp-ea4c2f504b3c669b561fd0e8eacacb76c29334e3.zip | |
fixed dithering
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9545 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/qmmp/dithering.cpp | 4 | ||||
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 9 | ||||
| -rw-r--r-- | src/qmmp/outputwriter_p.h | 8 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 7 |
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); |
