aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-10-22 11:08:50 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-10-22 11:08:50 +0000
commit49284bb0d33a2598f96645182984bc3fa671b932 (patch)
tree751929ea1e9cc39206d5af086f0609c0c0fc6176 /src
parent42c8e4cad08dcabe8e3d89beb2960b2fab2b879d (diff)
downloadqmmp-49284bb0d33a2598f96645182984bc3fa671b932.tar.gz
qmmp-49284bb0d33a2598f96645182984bc3fa671b932.tar.bz2
qmmp-49284bb0d33a2598f96645182984bc3fa671b932.zip
added extra functions to AudioParameters class
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7612 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/General/converter/converter.cpp4
-rw-r--r--src/plugins/General/rgscan/rgscanner.cpp4
-rw-r--r--src/plugins/Input/cue/decoder_cue.cpp13
-rw-r--r--src/plugins/Input/flac/decoder_flac.cpp5
-rw-r--r--src/plugins/Input/sid/decoder_sid.cpp5
-rw-r--r--src/plugins/Input/wavpack/decoder_wavpack.cpp7
-rw-r--r--src/qmmp/audioparameters.cpp55
-rw-r--r--src/qmmp/audioparameters.h24
-rw-r--r--src/qmmp/qmmpaudioengine.cpp2
9 files changed, 95 insertions, 24 deletions
diff --git a/src/plugins/General/converter/converter.cpp b/src/plugins/General/converter/converter.cpp
index ea4e7f12b..71468ef5c 100644
--- a/src/plugins/General/converter/converter.cpp
+++ b/src/plugins/General/converter/converter.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2011-2016 by Ilya Kotov *
+ * Copyright (C) 2011-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -308,7 +308,7 @@ bool Converter::convert(Decoder *decoder, FILE *file, bool use16bit)
int outSampleSize = AudioParameters::sampleSize(outFormat);
- unsigned char input_buffer[QMMP_BLOCK_FRAMES * ap.sampleSize() * ap.channels() * 4];
+ unsigned char input_buffer[QMMP_BLOCK_FRAMES * ap.frameSize() * 4];
float converter_buffer[QMMP_BLOCK_FRAMES * ap.channels() * 4];
unsigned char output_buffer[QMMP_BLOCK_FRAMES * outSampleSize * ap.channels() * 4];
diff --git a/src/plugins/General/rgscan/rgscanner.cpp b/src/plugins/General/rgscan/rgscanner.cpp
index d7a66b7ac..65a045d3e 100644
--- a/src/plugins/General/rgscan/rgscanner.cpp
+++ b/src/plugins/General/rgscan/rgscanner.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2013-2016 by Ilya Kotov *
+ * Copyright (C) 2013-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -182,7 +182,7 @@ void RGScanner::run()
//buffers
double out_left[BUFFER_FRAMES], out_right[BUFFER_FRAMES]; //replay gain buffers
float float_buf[BUFFER_FRAMES*ap.channels()]; //float buffer
- qint64 buf_size = BUFFER_FRAMES*ap.channels()*ap.sampleSize();
+ qint64 buf_size = BUFFER_FRAMES*ap.frameSize();
unsigned char char_buf[buf_size]; //char buffer
diff --git a/src/plugins/Input/cue/decoder_cue.cpp b/src/plugins/Input/cue/decoder_cue.cpp
index 2bdb35d94..b25e2d631 100644
--- a/src/plugins/Input/cue/decoder_cue.cpp
+++ b/src/plugins/Input/cue/decoder_cue.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2016 by Ilya Kotov *
+ * Copyright (C) 2008-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -99,11 +99,10 @@ bool DecoderCUE::initialize()
configure(m_decoder->audioParameters());
setReplayGainInfo(m_parser->replayGain(m_track));
length_in_bytes = audioParameters().sampleRate() *
- audioParameters().channels() *
- audioParameters().sampleSize() * m_length/1000;
+ audioParameters().frameSize() * m_length/1000;
m_totalBytes = 0;
- m_sz = audioParameters().sampleSize() * audioParameters().channels();
+ m_sz = audioParameters().frameSize();
addMetaData(m_parser->info(m_track)->metaData());
return true;
@@ -118,8 +117,7 @@ void DecoderCUE::seek(qint64 pos)
{
m_decoder->seek(m_offset + pos);
m_totalBytes = audioParameters().sampleRate() *
- audioParameters().channels() *
- audioParameters().sampleSize() * pos/1000;
+ audioParameters().frameSize() * pos/1000;
}
qint64 DecoderCUE::read(unsigned char *data, qint64 size)
@@ -187,8 +185,7 @@ void DecoderCUE::next()
m_length = m_parser->length(m_track);
m_offset = m_parser->offset(m_track);
length_in_bytes = audioParameters().sampleRate() *
- audioParameters().channels() *
- audioParameters().sampleSize() * m_length/1000;
+ audioParameters().frameSize() * m_length/1000;
addMetaData(m_parser->info(m_track)->metaData());
setReplayGainInfo(m_parser->replayGain(m_track));
m_totalBytes = 0;
diff --git a/src/plugins/Input/flac/decoder_flac.cpp b/src/plugins/Input/flac/decoder_flac.cpp
index 0ecfb7259..395b0eb6e 100644
--- a/src/plugins/Input/flac/decoder_flac.cpp
+++ b/src/plugins/Input/flac/decoder_flac.cpp
@@ -462,13 +462,12 @@ bool DecoderFLAC::initialize()
m_length = m_parser->length(m_track);
m_offset = m_parser->offset(m_track);
length_in_bytes = audioParameters().sampleRate() *
- audioParameters().channels() *
- audioParameters().sampleSize() * m_length/1000;
+ audioParameters().frameSize() * m_length/1000;
setReplayGainInfo(m_parser->replayGain(m_track));
seek(0);
}
m_totalBytes = 0;
- m_sz = audioParameters().sampleSize() * audioParameters().channels();
+ m_sz = audioParameters().frameSize();
qDebug("DecoderFLAC: initialize succes");
return true;
diff --git a/src/plugins/Input/sid/decoder_sid.cpp b/src/plugins/Input/sid/decoder_sid.cpp
index 2205ac2c8..351db3754 100644
--- a/src/plugins/Input/sid/decoder_sid.cpp
+++ b/src/plugins/Input/sid/decoder_sid.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2013-2016 by Ilya Kotov *
+ * Copyright (C) 2013-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -142,8 +142,7 @@ bool DecoderSID::initialize()
configure(44100, 2);
m_length_in_bytes = audioParameters().sampleRate() *
- audioParameters().channels() *
- audioParameters().sampleSize() * m_length;
+ audioParameters().frameSize() * m_length;
qDebug("DecoderSID: initialize succes");
return true;
}
diff --git a/src/plugins/Input/wavpack/decoder_wavpack.cpp b/src/plugins/Input/wavpack/decoder_wavpack.cpp
index 09177f873..0adf85449 100644
--- a/src/plugins/Input/wavpack/decoder_wavpack.cpp
+++ b/src/plugins/Input/wavpack/decoder_wavpack.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2008-2016 by Ilya Kotov *
+ * Copyright (C) 2008-2017 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -144,13 +144,12 @@ bool DecoderWavPack::initialize()
m_length = m_parser->length(m_track);
m_offset = m_parser->offset(m_track);
m_length_in_bytes = audioParameters().sampleRate() *
- audioParameters().channels() *
- audioParameters().sampleSize() * m_length/1000;
+ audioParameters().frameSize() * m_length/1000;
setReplayGainInfo(m_parser->replayGain(m_track));
seek(0);
}
m_totalBytes = 0;
- m_frame_size = audioParameters().sampleSize() * audioParameters().channels();
+ m_frame_size = audioParameters().frameSize();
qDebug("DecoderWavPack: initialize succes");
return true;
}
diff --git a/src/qmmp/audioparameters.cpp b/src/qmmp/audioparameters.cpp
index bfc392b14..8f5e948ac 100644
--- a/src/qmmp/audioparameters.cpp
+++ b/src/qmmp/audioparameters.cpp
@@ -26,6 +26,7 @@ AudioParameters::AudioParameters()
m_srate = 0;
m_format = Qmmp::PCM_S16LE;
m_sz = 2;
+ m_precision = 16;
}
AudioParameters::AudioParameters(const AudioParameters &other)
@@ -34,6 +35,7 @@ AudioParameters::AudioParameters(const AudioParameters &other)
m_chan_map = other.channelMap();
m_format = other.format();
m_sz = other.sampleSize();
+ m_precision = other.validBitsPerSample();
}
AudioParameters::AudioParameters(quint32 srate, const ChannelMap &map, Qmmp::AudioFormat format)
@@ -42,6 +44,7 @@ AudioParameters::AudioParameters(quint32 srate, const ChannelMap &map, Qmmp::Aud
m_chan_map = map;
m_format = format;
m_sz = sampleSize(format);
+ m_precision = validBitsPerSample(format);
}
AudioParameters &AudioParameters::operator=(const AudioParameters &p)
@@ -50,12 +53,14 @@ AudioParameters &AudioParameters::operator=(const AudioParameters &p)
m_chan_map = p.channelMap();
m_format = p.format();
m_sz = p.sampleSize();
+ m_precision = p.validBitsPerSample();
return *this;
}
bool AudioParameters::operator==(const AudioParameters &p) const
{
- return m_srate == p.sampleRate() && m_chan_map == p.channelMap() && m_format == p.format();
+ return m_srate == p.sampleRate() && m_chan_map == p.channelMap() && m_format == p.format()
+ && m_precision == p.validBitsPerSample();
}
bool AudioParameters::operator!=(const AudioParameters &p) const
@@ -88,6 +93,21 @@ int AudioParameters::sampleSize() const
return m_sz;
}
+int AudioParameters::frameSize() const
+{
+ return m_sz * m_chan_map.count();
+}
+
+int AudioParameters::bitsPerSample() const
+{
+ return m_sz * 8;
+}
+
+int AudioParameters::validBitsPerSample() const
+{
+ return m_precision;
+}
+
const QString AudioParameters::toString() const
{
static const struct
@@ -155,3 +175,36 @@ int AudioParameters::sampleSize(Qmmp::AudioFormat format)
}
return 2;
}
+
+int AudioParameters::bitsPerSample(Qmmp::AudioFormat format)
+{
+ return sampleSize(format) * 8;
+}
+
+int AudioParameters::validBitsPerSample(Qmmp::AudioFormat format)
+{
+ switch(format)
+ {
+ case Qmmp::PCM_S8:
+ case Qmmp::PCM_U8:
+ return 8;
+ case Qmmp::PCM_UNKNOWM:
+ case Qmmp::PCM_S16LE:
+ case Qmmp::PCM_S16BE:
+ case Qmmp::PCM_U16LE:
+ case Qmmp::PCM_U16BE:
+ return 16;
+ case Qmmp::PCM_S24LE:
+ case Qmmp::PCM_S24BE:
+ case Qmmp::PCM_U24LE:
+ case Qmmp::PCM_U24BE:
+ return 24;
+ case Qmmp::PCM_S32LE:
+ case Qmmp::PCM_S32BE:
+ case Qmmp::PCM_U32LE:
+ case Qmmp::PCM_U32BE:
+ case Qmmp::PCM_FLOAT:
+ return 32;
+ }
+ return 16;
+}
diff --git a/src/qmmp/audioparameters.h b/src/qmmp/audioparameters.h
index 00049af2b..7c624dfb1 100644
--- a/src/qmmp/audioparameters.h
+++ b/src/qmmp/audioparameters.h
@@ -79,6 +79,20 @@ public:
*/
int sampleSize() const;
/*!
+ * Returns the number of bytes required to represent one frame
+ * (a sample in each channel) in this format.
+ */
+ int frameSize() const;
+ /*!
+ * Returns sample size in bits.
+ */
+ int bitsPerSample() const;
+ /*!
+ * Returns the number of used bits in the sample. The value shoud be
+ * less or equal to the value returned by \b bitsPerSample().
+ */
+ int validBitsPerSample() const;
+ /*!
* Returns string represention of the audio parameters.
* May be useful for debug purposes.
*/
@@ -87,12 +101,22 @@ public:
* Returns sample size in bytes of the given pcm data \b format.
*/
static int sampleSize(Qmmp::AudioFormat format);
+ /*!
+ * Returns sample size in bits of the given pcm data \b format.
+ */
+ static int bitsPerSample(Qmmp::AudioFormat format);
+ /*!
+ * Returns the number of used bits in the sample
+ * of the given pcm data \b format.
+ */
+ static int validBitsPerSample(Qmmp::AudioFormat format);
private:
quint32 m_srate;
ChannelMap m_chan_map;
Qmmp::AudioFormat m_format;
int m_sz;
+ int m_precision;
};
#endif // AUDIOPARAMETERS_H
diff --git a/src/qmmp/qmmpaudioengine.cpp b/src/qmmp/qmmpaudioengine.cpp
index ba904e03f..cdf0683a6 100644
--- a/src/qmmp/qmmpaudioengine.cpp
+++ b/src/qmmp/qmmpaudioengine.cpp
@@ -645,7 +645,7 @@ void QmmpAudioEngine::prepareEffects(Decoder *d)
//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_bks = QMMP_BLOCK_FRAMES * m_ap.frameSize(); //block size
m_output_size = m_bks * 4;
m_sample_size = m_ap.sampleSize();
m_output_buf = new unsigned char[m_output_size];