diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Effect/srconverter/srconverter.cpp | 10 | ||||
| -rw-r--r-- | src/qmmp/equ/iir.h | 1 | ||||
| -rw-r--r-- | src/qmmp/equ/iir_fpu.c | 12 | ||||
| -rw-r--r-- | src/qmmp/outputwriter.cpp | 2 |
4 files changed, 25 insertions, 0 deletions
diff --git a/src/plugins/Effect/srconverter/srconverter.cpp b/src/plugins/Effect/srconverter/srconverter.cpp index 969cd5eb0..fcd77bc04 100644 --- a/src/plugins/Effect/srconverter/srconverter.cpp +++ b/src/plugins/Effect/srconverter/srconverter.cpp @@ -65,6 +65,16 @@ void SRConverter::applyEffect(Buffer *b) } else { + qint32 *data = (int *) b->data; + if(format() == Qmmp::PCM_S24LE) + { + uint samples = b->size >> 2; + for(unsigned int i = 0; i < samples; ++i) + { + if(data[i] & 0x800000) + data[i] |= 0xff000000; + } + } src_int_to_float_array((int*) b->data, m_src_data.data_in, m_src_data.input_frames * channels()); } diff --git a/src/qmmp/equ/iir.h b/src/qmmp/equ/iir.h index 77a398414..d839bcbd0 100644 --- a/src/qmmp/equ/iir.h +++ b/src/qmmp/equ/iir.h @@ -58,6 +58,7 @@ void set_preamp(int chn, float val); int iir(void * d, int length, int nch); +int iir24(void * d, int length, int nch); int iir32(void * d, int length, int nch); #ifdef ARCH_X86 diff --git a/src/qmmp/equ/iir_fpu.c b/src/qmmp/equ/iir_fpu.c index 6740d3a88..eea309a78 100644 --- a/src/qmmp/equ/iir_fpu.c +++ b/src/qmmp/equ/iir_fpu.c @@ -206,6 +206,18 @@ __inline__ int iir(void * d, int length, int nch) return length; } +__inline__ int iir24(void * d, int length, int nch) +{ + int *data = (int *) d; + int index; + for (index = 0; index < length; index++) + { + if(data[index] & 0x800000) + data[index] |= 0xff000000; + } + return iir32(d, length, nch); +} + __inline__ int iir32(void * d, int length, int nch) { // FTZ_ON; diff --git a/src/qmmp/outputwriter.cpp b/src/qmmp/outputwriter.cpp index dea7b5023..21074f57a 100644 --- a/src/qmmp/outputwriter.cpp +++ b/src/qmmp/outputwriter.cpp @@ -324,6 +324,8 @@ void OutputWriter::run() iir((void*) b->data, b->nbytes, m_channels); break; case Qmmp::PCM_S24LE: + iir24((void*) b->data, b->nbytes, m_channels); + break; case Qmmp::PCM_S32LE: iir32((void*) b->data, b->nbytes, m_channels); break; |
