aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-02-13 17:13:12 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-02-13 17:13:12 +0000
commitf4f8368b6ecb138a5fc6228aad7465899cf96e17 (patch)
treed9ce2a18f0aef643accfa0416cbabc12aa526166
parent0aee43788d41e28e77478bf2eabde695e6fd04dc (diff)
downloadqmmp-f4f8368b6ecb138a5fc6228aad7465899cf96e17.tar.gz
qmmp-f4f8368b6ecb138a5fc6228aad7465899cf96e17.tar.bz2
qmmp-f4f8368b6ecb138a5fc6228aad7465899cf96e17.zip
fixed remaining bugs with 24-bit samples
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3242 90c681e8-e032-0410-971d-27865f9a5e38
-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;