diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-10-22 11:08:50 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-10-22 11:08:50 +0000 |
| commit | 49284bb0d33a2598f96645182984bc3fa671b932 (patch) | |
| tree | 751929ea1e9cc39206d5af086f0609c0c0fc6176 | |
| parent | 42c8e4cad08dcabe8e3d89beb2960b2fab2b879d (diff) | |
| download | qmmp-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
| -rw-r--r-- | src/plugins/General/converter/converter.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/General/rgscan/rgscanner.cpp | 4 | ||||
| -rw-r--r-- | src/plugins/Input/cue/decoder_cue.cpp | 13 | ||||
| -rw-r--r-- | src/plugins/Input/flac/decoder_flac.cpp | 5 | ||||
| -rw-r--r-- | src/plugins/Input/sid/decoder_sid.cpp | 5 | ||||
| -rw-r--r-- | src/plugins/Input/wavpack/decoder_wavpack.cpp | 7 | ||||
| -rw-r--r-- | src/qmmp/audioparameters.cpp | 55 | ||||
| -rw-r--r-- | src/qmmp/audioparameters.h | 24 | ||||
| -rw-r--r-- | src/qmmp/qmmpaudioengine.cpp | 2 |
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]; |
