diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-12-25 17:32:53 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-12-25 17:32:53 +0000 |
| commit | 260e607f9310a4d41761a6dcef1cdc6b75d56f40 (patch) | |
| tree | 6cc764395351962db8ac6fb70de201a97211235a | |
| parent | 79b25e9c385c3a1a3af6f88139bbd6aae8d0b178 (diff) | |
| download | qmmp-260e607f9310a4d41761a6dcef1cdc6b75d56f40.tar.gz qmmp-260e607f9310a4d41761a6dcef1cdc6b75d56f40.tar.bz2 qmmp-260e607f9310a4d41761a6dcef1cdc6b75d56f40.zip | |
changed effect api
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5882 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/qmmp/channelconverter.cpp | 8 | ||||
| -rw-r--r-- | src/qmmp/channelconverter_p.h | 5 | ||||
| -rw-r--r-- | src/qmmp/effect.cpp | 12 | ||||
| -rw-r--r-- | src/qmmp/effect.h | 8 | ||||
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 37 | ||||
| -rw-r--r-- | src/qmmp/outputwriter_p.h | 6 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 56 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine_p.h | 2 |
8 files changed, 59 insertions, 75 deletions
diff --git a/src/qmmp/channelconverter.cpp b/src/qmmp/channelconverter.cpp index 857766531..3fb21082b 100644 --- a/src/qmmp/channelconverter.cpp +++ b/src/qmmp/channelconverter.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2014 by Ilya Kotov * + * Copyright (C) 2014-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -24,7 +24,6 @@ ChannelConverter::ChannelConverter(ChannelMap out_map) { m_disabled = true; m_tmp_buf = 0; - m_format = Qmmp::PCM_UNKNOWM; m_frame_size = 0; m_channels = 0; m_out_map = out_map; @@ -40,9 +39,9 @@ ChannelConverter::~ChannelConverter() } } -void ChannelConverter::configure(quint32 srate, ChannelMap in_map, Qmmp::AudioFormat f) +void ChannelConverter::configure(quint32 srate, ChannelMap in_map) { - Effect::configure(srate, m_out_map, f); + Effect::configure(srate, m_out_map); if((m_disabled = (in_map == m_out_map))) return; @@ -50,7 +49,6 @@ void ChannelConverter::configure(quint32 srate, ChannelMap in_map, Qmmp::AudioFo m_channels = channels(); m_frame_size = audioParameters().sampleSize() * channels(); m_tmp_buf = new unsigned char[m_frame_size]; - m_format = f; QStringList reorderStringList; for(int i = 0; i < m_channels; ++i) diff --git a/src/qmmp/channelconverter_p.h b/src/qmmp/channelconverter_p.h index 7f41570fe..499e76961 100644 --- a/src/qmmp/channelconverter_p.h +++ b/src/qmmp/channelconverter_p.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2014 by Ilya Kotov * + * Copyright (C) 2014-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -31,7 +31,7 @@ class ChannelConverter : public Effect public: ChannelConverter(ChannelMap out_map); ~ChannelConverter(); - void configure(quint32 srate, ChannelMap in_map, Qmmp::AudioFormat f); + void configure(quint32 srate, ChannelMap in_map); void applyEffect(Buffer *b); private: @@ -40,7 +40,6 @@ private: unsigned char *m_tmp_buf; int m_frame_size; int m_channels; - Qmmp::AudioFormat m_format; ChannelMap m_out_map; }; diff --git a/src/qmmp/effect.cpp b/src/qmmp/effect.cpp index b82c813a5..97b7104d3 100644 --- a/src/qmmp/effect.cpp +++ b/src/qmmp/effect.cpp @@ -29,7 +29,6 @@ Effect::Effect() { m_freq = 0; - m_format = Qmmp::PCM_UNKNOWM; m_channels = 0; m_factory = 0; } @@ -37,12 +36,11 @@ Effect::Effect() Effect::~Effect() {} -void Effect::configure(quint32 freq, ChannelMap map, Qmmp::AudioFormat format) +void Effect::configure(quint32 freq, ChannelMap map) { m_freq = freq; m_chan_map = map; m_channels = map.count(); - m_format = format; } quint32 Effect::sampleRate() const @@ -60,14 +58,9 @@ const ChannelMap Effect::channelMap() const return m_chan_map; } -Qmmp::AudioFormat Effect::format() const -{ - return m_format; -} - const AudioParameters Effect::audioParameters() const { - return AudioParameters(m_freq, m_chan_map, m_format); + return AudioParameters(m_freq, m_chan_map, Qmmp::PCM_FLOAT); } EffectFactory* Effect::factory() const @@ -81,7 +74,6 @@ bool _effectCacheCompareFunc(QmmpPluginCache *e1, QmmpPluginCache *e2) } //static members - QList<QmmpPluginCache*> *Effect::m_cache = 0; QStringList Effect::m_enabledNames; diff --git a/src/qmmp/effect.h b/src/qmmp/effect.h index b2fc2bf0f..47fee6da9 100644 --- a/src/qmmp/effect.h +++ b/src/qmmp/effect.h @@ -53,9 +53,8 @@ public: * Subclasses that reimplement this function must call the base implementation. * @param srate Sample rate. * @param map Map of channels. - * @param f Audio format. */ - virtual void configure(quint32 srate, ChannelMap map, Qmmp::AudioFormat f = Qmmp::PCM_S16LE); + virtual void configure(quint32 srate, ChannelMap map); /*! * Returns samplerate. */ @@ -69,10 +68,6 @@ public: */ const ChannelMap channelMap() const; /*! - * Returns audio format. - */ - Qmmp::AudioFormat format() const; - /*! * Returns audio parameters for output data. */ const AudioParameters audioParameters() const; @@ -115,7 +110,6 @@ private: quint32 m_freq; int m_channels; ChannelMap m_chan_map; - Qmmp::AudioFormat m_format; static void loadPlugins(); static QList<QmmpPluginCache*> *m_cache; static QStringList m_enabledNames; diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp index 93e1a1f15..00d76fe6c 100644 --- a/src/qmmp/outputwriter.cpp +++ b/src/qmmp/outputwriter.cpp @@ -92,8 +92,9 @@ OutputWriter::~OutputWriter() delete m_converter; } -bool OutputWriter::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat format) +bool OutputWriter::initialize(quint32 freq, ChannelMap map) { + m_in_params = AudioParameters(freq, map, Qmmp::PCM_FLOAT); QMap<Qmmp::AudioFormat, QString> formatNames; formatNames.insert(Qmmp::PCM_S8, "s8"); formatNames.insert(Qmmp::PCM_U8, "u8"); @@ -118,26 +119,26 @@ bool OutputWriter::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat fo return false; } - if (!m_output->initialize(freq, map, format)) + if (!m_output->initialize(freq, map, Qmmp::PCM_S16LE)) { qWarning("OutputWriter: unable to initialize output"); delete m_output; m_output = 0; return false; } - m_frequency = freq; - m_channels = map.count(); - m_format = format; - m_chan_map = map; + m_frequency = m_output->sampleRate(); + m_chan_map = m_output->channelMap(); + m_channels = m_chan_map.count(); + m_format = m_output->format(); qDebug("OutputWriter: [%s] %u Hz, {%s}, %s ==> %u Hz, {%s}, %s", qPrintable(Output::currentFactory()->properties().shortName), - freq, - qPrintable(map.toString()), - qPrintable(formatNames.value(format)), - m_output->sampleRate(), - qPrintable(m_output->channelMap().toString()), - qPrintable(formatNames.value(m_output->format()))); + m_in_params.sampleRate(), + qPrintable(m_in_params.channelMap().toString()), + qPrintable(formatNames.value(m_in_params.format())), + m_frequency, + qPrintable(m_chan_map.toString()), + qPrintable(formatNames.value(m_format))); if(!prepareConverters()) { @@ -147,12 +148,12 @@ bool OutputWriter::initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat fo return false; } - m_bytesPerMillisecond = m_frequency * m_channels * AudioParameters::sampleSize(format) / 1000; - m_recycler.configure(m_frequency, m_channels); //calculate output buffer size + m_bytesPerMillisecond = m_frequency * m_channels * AudioParameters::sampleSize(m_format) / 1000; + m_recycler.configure(m_in_params.sampleRate(), m_in_params.channels()); //calculate output buffer size //visual buffer if(m_visBuffer) delete [] m_visBuffer; - m_visBufferSize = QMMP_BLOCK_FRAMES * 2 * m_channels; //16-bit samples + m_visBufferSize = QMMP_BLOCK_FRAMES * 2 * m_in_params.channels(); //16-bit samples if(m_format != Qmmp::PCM_S16LE) m_visBuffer = new unsigned char [m_visBufferSize]; updateEqSettings(); @@ -203,7 +204,7 @@ QMutex *OutputWriter::mutex() AudioParameters OutputWriter::audioParameters() const { - return AudioParameters(m_frequency, m_chan_map, m_format); + return AudioParameters(m_frequency, m_chan_map, Qmmp::PCM_FLOAT); } quint32 OutputWriter::sampleRate() @@ -502,7 +503,7 @@ void OutputWriter::status() void OutputWriter::updateEqSettings() { - mutex()->lock(); + /*mutex()->lock(); if(m_settings->eqSettings().isEnabled()) { double preamp = m_settings->eqSettings().preamp(); @@ -520,5 +521,5 @@ void OutputWriter::updateEqSettings() } } m_useEq = m_settings->eqSettings().isEnabled(); - mutex()->unlock(); + mutex()->unlock();*/ } diff --git a/src/qmmp/outputwriter_p.h b/src/qmmp/outputwriter_p.h index 5d2e36947..944826dd9 100644 --- a/src/qmmp/outputwriter_p.h +++ b/src/qmmp/outputwriter_p.h @@ -49,10 +49,9 @@ public: * Prepares object for usage and setups required audio parameters. * @param freq Sample rate. * @param map Map of channels. - * @param format Audio format * @return initialization result (\b true - success, \b false - failure) */ - bool initialize(quint32 freq, ChannelMap map, Qmmp::AudioFormat format); + bool initialize(quint32 freq, ChannelMap map); /*! * Requests playback to pause. If it was paused already, playback should resume. */ @@ -97,7 +96,7 @@ public: */ int channels(); /*! - * Returns selected audio format. + * Returns input audio format. */ Qmmp::AudioFormat format() const; const ChannelMap channelMap() const; @@ -140,6 +139,7 @@ private: QmmpSettings *m_settings; Output *m_output; bool m_muted; + AudioParameters m_in_params; QList<Effect *> m_converters; AudioConverter *m_converter; }; diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp index 74fcce793..cf8376d17 100644 --- a/src/qmmp/qmmpaudioengine.cpp +++ b/src/qmmp/qmmpaudioengine.cpp @@ -43,6 +43,7 @@ QmmpAudioEngine::QmmpAudioEngine(QObject *parent) m_output_buf = 0; m_output_size = 0; m_bks = 0; + m_sample_size = 0; m_decoder = 0; m_output = 0; m_muted = false; @@ -177,7 +178,7 @@ void QmmpAudioEngine::addEffect(EffectFactory *factory) Effect *effect = Effect::create(factory); if(!effect) return; - effect->configure(m_ap.sampleRate(), m_ap.channelMap(), m_ap.format()); + effect->configure(m_ap.sampleRate(), m_ap.channelMap()); if(effect->audioParameters() == m_ap) { mutex()->lock(); @@ -298,7 +299,7 @@ qint64 QmmpAudioEngine::produceSound(unsigned char *data, qint64 size, quint32 b { Buffer *b = m_output->recycler()->get(); size_t sz = size < m_bks ? size : m_bks; - size_t samples = sz / m_ap.sampleSize(); + size_t samples = sz / m_sample_size; //size_t samples = qMin(m_bks / sizeof(float), (uint)size / m_ap.sampleSize()); //size_t in_size = samples * m_ap.sampleSize(); @@ -309,10 +310,10 @@ qint64 QmmpAudioEngine::produceSound(unsigned char *data, qint64 size, quint32 b //memcpy(b->data, data, sz); b->samples = samples; b->rate = brate; - /*foreach(Effect* effect, m_effects) + foreach(Effect* effect, m_effects) { effect->applyEffect(b); - }*/ + } memmove(data, data + sz, size - sz); m_output->recycler()->add(); return sz; @@ -360,7 +361,7 @@ void QmmpAudioEngine::run() } m_decoder = m_decoders.dequeue(); addOffset(); //offset - //m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo(), m_decoder->hasHeadroom()); + m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo(), false); mutex()->unlock(); m_output->start(); StateHandler::instance()->dispatch(Qmmp::Buffering); @@ -411,7 +412,6 @@ void QmmpAudioEngine::run() { delay = 0; // decode - //len = m_replayGain->read(m_decoder, (m_output_buf + m_output_at), m_output_size - m_output_at); len = m_decoder->read((m_output_buf + m_output_at), m_output_size - m_output_at); } @@ -432,7 +432,7 @@ void QmmpAudioEngine::run() StateHandler::instance()->dispatch(Qmmp::Buffering); m_decoder->next(); StateHandler::instance()->dispatch(m_decoder->totalTime()); - //m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo(), m_decoder->hasHeadroom()); + m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo(), false); m_output->mutex()->lock(); m_output->seek(0); //reset counter m_output->mutex()->unlock(); @@ -447,7 +447,8 @@ void QmmpAudioEngine::run() delete m_decoder; m_decoder = m_decoders.dequeue(); //m_seekTime = m_inputs.value(m_decoder)->offset(); - //m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo(), m_decoder->hasHeadroom()); + flush(true); + m_replayGain->setReplayGainInfo(m_decoder->replayGainInfo(), false); //use current output if possible prepareEffects(m_decoder); if(m_ap == m_output->audioParameters()) @@ -467,7 +468,6 @@ void QmmpAudioEngine::run() } else { - flush(true); finish(); //wake up waiting threads mutex()->unlock(); @@ -594,31 +594,38 @@ OutputWriter *QmmpAudioEngine::createOutput() { OutputWriter *output = new OutputWriter(0); output->setMuted(m_muted); - if (!output->initialize(m_ap.sampleRate(), m_ap.channelMap(), m_ap.format())) + if (!output->initialize(m_ap.sampleRate(), m_ap.channelMap())) { delete output; StateHandler::instance()->dispatch(Qmmp::FatalError); return 0; } - if(m_output_buf) + /*if(m_output_buf) delete [] m_output_buf; m_bks = output->recycler()->blockSamples() * m_ap.sampleSize(); m_output_size = m_bks * 4; - m_output_buf = new unsigned char[m_output_size]; + m_output_buf = new unsigned char[m_output_size];*/ return output; } void QmmpAudioEngine::prepareEffects(Decoder *d) { m_ap = d->audioParameters(); + //output buffer for decoder + if(m_output_buf) + delete [] m_output_buf; + m_bks = QMMP_BLOCK_FRAMES * m_ap.channels() * m_ap.sampleSize(); //block size + m_output_size = m_bks * 4; + m_sample_size = m_ap.sampleSize(); + m_output_buf = new unsigned char[m_output_size]; + //converter m_converter->configure(m_ap.format()); - - //m_ap = AudioParameters(44100, 2, Qmmp::PCM_S24LE); - - /*m_replayGain->configure(m_ap); - - foreach(Effect *e, m_effects) //remove disabled and external effects + m_ap = AudioParameters(m_ap.sampleRate(), m_ap.channelMap(), Qmmp::PCM_FLOAT); + //replay gain + m_replayGain->configure(m_ap); + //remove disabled and external effects + foreach(Effect *e, m_effects) { if(!e->factory() || !Effect::isEnabled(e->factory())) { @@ -631,16 +638,9 @@ void QmmpAudioEngine::prepareEffects(Decoder *d) m_effects.clear(); m_effects << new ChannelConverter(m_ap.channelMap().remaped()); - m_effects.at(0)->configure(m_ap.sampleRate(), m_ap.channelMap(), m_ap.format()); + m_effects.at(0)->configure(m_ap.sampleRate(), m_ap.channelMap()); m_ap = m_effects.at(0)->audioParameters(); - if(m_settings->use16BitOutput()) - { - m_effects << new AudioConverter(); - m_effects.at(0)->configure(m_ap.sampleRate(), m_ap.channelMap(), m_ap.format()); - m_ap = m_effects.at(0)->audioParameters(); - } - foreach(EffectFactory *factory, Effect::enabledFactories()) { Effect *effect = 0; @@ -661,7 +661,7 @@ void QmmpAudioEngine::prepareEffects(Decoder *d) if(!effect) { effect = Effect::create(factory); - effect->configure(m_ap.sampleRate(), m_ap.channelMap(), m_ap.format()); + effect->configure(m_ap.sampleRate(), m_ap.channelMap()); if (m_ap != effect->audioParameters()) { m_blockedEffects << effect; //list of effects which require restart @@ -670,7 +670,7 @@ void QmmpAudioEngine::prepareEffects(Decoder *d) } m_effects << effect; tmp_effects.removeAll(effect); - }*/ + } } //static members diff --git a/src/qmmp/qmmpaudioengine_p.h b/src/qmmp/qmmpaudioengine_p.h index b045ddc5b..14446e802 100644 --- a/src/qmmp/qmmpaudioengine_p.h +++ b/src/qmmp/qmmpaudioengine_p.h @@ -81,7 +81,7 @@ private: OutputWriter *m_output; bool m_done, m_finish, m_user_stop; - uint m_bks; + uint m_bks, m_sample_size; qint64 m_seekTime; quint64 m_output_at, m_output_size; int m_bitrate; |
