diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-12-22 07:40:54 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-12-22 07:40:54 +0000 |
| commit | 78f984208e0fe6483a8c68797045b733d988bfe9 (patch) | |
| tree | 7f80601e4fea154df26cd207b69779b91540a414 | |
| parent | 3fe14356de05c3dbd95c0d1336416af56fe619b5 (diff) | |
| download | qmmp-78f984208e0fe6483a8c68797045b733d988bfe9.tar.gz qmmp-78f984208e0fe6483a8c68797045b733d988bfe9.tar.bz2 qmmp-78f984208e0fe6483a8c68797045b733d988bfe9.zip | |
AudioConverter::fromFloat implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5870 90c681e8-e032-0410-971d-27865f9a5e38
| -rw-r--r-- | src/qmmp/audioconverter.cpp | 54 | ||||
| -rw-r--r-- | src/qmmp/audioconverter_p.h | 2 |
2 files changed, 51 insertions, 5 deletions
diff --git a/src/qmmp/audioconverter.cpp b/src/qmmp/audioconverter.cpp index ec76a9c5f..5316539a4 100644 --- a/src/qmmp/audioconverter.cpp +++ b/src/qmmp/audioconverter.cpp @@ -18,6 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include <math.h> #include "audioconverter_p.h" //static functions @@ -44,10 +45,20 @@ static inline void s32_to_s16(qint32 *in, qint16 *out, qint64 samples) #define INT_TO_FLOAT(TYPE,in,out,samples,offset,max) \ { \ - TYPE *in_copy = (TYPE *) (in); \ - float *out_copy = out; \ + TYPE *in_ref = (TYPE *) (in); \ for(size_t i = 0; i < samples; ++i) \ - out_copy[i] = (float) ((*in_copy++) - offset) / max; \ + out[i] = (float) (in_ref[i] - offset) / max; \ +} + +#define FLOAT_TO_INT(TYPE,in,out,samples,offset,min,max) \ +{ \ + TYPE *out_ref = (TYPE *) (out); \ + float tmp; \ + for(size_t i = 0; i < samples; ++i) \ + { \ + tmp = in[i] * max; \ + out_ref[i] = offset + (TYPE) lrintf(qBound(-(float)min, tmp, (float)max)); \ + } \ } AudioConverter::AudioConverter() @@ -172,5 +183,40 @@ void AudioConverter::toFloat(const unsigned char *in, float *out, size_t samples void AudioConverter::fromFloat(const float *in, const unsigned *out, size_t samples) { - + switch (m_format) + { + case Qmmp::PCM_S8: + FLOAT_TO_INT(qint8, in, out, samples, 0, 0x80, 0x7F); + break; + case Qmmp::PCM_U8: + FLOAT_TO_INT(qint8, in, out, samples, 0x80, 0x80, 0x7F); + break; + case Qmmp::PCM_S16LE: + case Qmmp::PCM_S16BE: + FLOAT_TO_INT(qint16, in, out, samples, 0, 0x8000, 0x7FFF); + break; + case Qmmp::PCM_U16LE: + case Qmmp::PCM_U16BE: + FLOAT_TO_INT(quint16, in, out, samples, 0x8000, 0x8000, 0x7FFF); + break; + case Qmmp::PCM_S24LE: + case Qmmp::PCM_S24BE: + FLOAT_TO_INT(qint32, in, out, samples, 0, 0x800000, 0x7FFFFF); + break; + case Qmmp::PCM_U24LE: + case Qmmp::PCM_U24BE: + FLOAT_TO_INT(quint32, in, out, samples, 0x800000, 0x800000, 0x7FFFFF); + break; + case Qmmp::PCM_S32LE: + case Qmmp::PCM_S32BE: + FLOAT_TO_INT(qint32, in, out, samples, 0, 0x80000000, 0x7FFFFFFF); + break; + case Qmmp::PCM_U32LE: + case Qmmp::PCM_U32BE: + FLOAT_TO_INT(quint32, in, out, samples, 0x80000000, 0x80000000, 0x7FFFFFFF); + break; + case Qmmp::PCM_FLOAT: + case Qmmp::PCM_UNKNOWM: + ; + } } diff --git a/src/qmmp/audioconverter_p.h b/src/qmmp/audioconverter_p.h index df3610c22..3591dd13b 100644 --- a/src/qmmp/audioconverter_p.h +++ b/src/qmmp/audioconverter_p.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2010-2014 by Ilya Kotov * + * Copyright (C) 2010-2015 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * |
