aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/Effect/srconverter/srconverter.cpp10
-rw-r--r--src/qmmp/equ/iir.h1
-rw-r--r--src/qmmp/equ/iir_fpu.c12
-rw-r--r--src/qmmp/outputwriter.cpp2
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;