aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-12-25 17:32:53 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2015-12-25 17:32:53 +0000
commit260e607f9310a4d41761a6dcef1cdc6b75d56f40 (patch)
tree6cc764395351962db8ac6fb70de201a97211235a /src
parent79b25e9c385c3a1a3af6f88139bbd6aae8d0b178 (diff)
downloadqmmp-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
Diffstat (limited to 'src')
-rw-r--r--src/qmmp/channelconverter.cpp8
-rw-r--r--src/qmmp/channelconverter_p.h5
-rw-r--r--src/qmmp/effect.cpp12
-rw-r--r--src/qmmp/effect.h8
-rw-r--r--src/qmmp/outputwriter.cpp37
-rw-r--r--src/qmmp/outputwriter_p.h6
-rw-r--r--src/qmmp/qmmpaudioengine.cpp56
-rw-r--r--src/qmmp/qmmpaudioengine_p.h2
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;