aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-12-13 20:35:27 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2010-12-13 20:35:27 +0000
commit7d6cf67ff3ca3172e55746e4dd0eb0d250914273 (patch)
tree98c0afc4503e99b707bf5d50f43156989ab7ec9f
parent7abb9651037029560855551bce74afe755e855ae (diff)
downloadqmmp-7d6cf67ff3ca3172e55746e4dd0eb0d250914273.tar.gz
qmmp-7d6cf67ff3ca3172e55746e4dd0eb0d250914273.tar.bz2
qmmp-7d6cf67ff3ca3172e55746e4dd0eb0d250914273.zip
crossfade plugin: added 8/24/32-bit formats support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2007 90c681e8-e032-0410-971d-27865f9a5e38
-rw-r--r--src/plugins/Effect/crossfade/crossfadeplugin.cpp36
-rw-r--r--src/plugins/Effect/crossfade/crossfadeplugin.h4
2 files changed, 36 insertions, 4 deletions
diff --git a/src/plugins/Effect/crossfade/crossfadeplugin.cpp b/src/plugins/Effect/crossfade/crossfadeplugin.cpp
index df653999d..8da9ee46f 100644
--- a/src/plugins/Effect/crossfade/crossfadeplugin.cpp
+++ b/src/plugins/Effect/crossfade/crossfadeplugin.cpp
@@ -82,10 +82,14 @@ void CrossfadePlugin::applyEffect(Buffer *b)
{
double volume = (double)m_buffer_at/m_buffer_size;
uint size = qMin((ulong)m_buffer_at, b->nbytes);
- for (uint i = 0; i < size / 2; i++)
- {
- ((short*)b->data)[i] =((short*)b->data)[i]*(1.0 - volume)+((short*)m_buffer)[i]*volume;
- }
+
+ if(format() == Qmmp::PCM_S16LE)
+ mix16(b->data, m_buffer, size >> 1, volume);
+ else if(format() == Qmmp::PCM_S8)
+ mix8(b->data, m_buffer, size, volume);
+ else //PCM_24LE, PCM_32LE
+ mix32(b->data, m_buffer, size >> 2, volume);
+
m_buffer_at -= size;
memmove(m_buffer, m_buffer + size, m_buffer_at);
}
@@ -101,3 +105,27 @@ void CrossfadePlugin::configure(quint32 freq, int chan, Qmmp::AudioFormat format
{
Effect::configure(freq, chan, format);
}
+
+void CrossfadePlugin::mix8(uchar *cur_buf, uchar *prev_buf, uint samples, double volume)
+{
+ for (uint i = 0; i < samples; i++)
+ {
+ cur_buf[i] = cur_buf[i]*(1.0 - volume)+prev_buf[i]*volume;
+ }
+}
+
+void CrossfadePlugin::mix16(uchar *cur_buf, uchar *prev_buf, uint samples, double volume)
+{
+ for (uint i = 0; i < samples; i++)
+ {
+ ((short*)cur_buf)[i] =((short*)cur_buf)[i]*(1.0 - volume)+((short*)prev_buf)[i]*volume;
+ }
+}
+
+void CrossfadePlugin::mix32(uchar *cur_buf, uchar *prev_buf, uint samples, double volume)
+{
+ for (uint i = 0; i < samples; i++)
+ {
+ ((qint32*)cur_buf)[i] =((qint32*)cur_buf)[i]*(1.0 - volume)+((qint32*)prev_buf)[i]*volume;
+ }
+}
diff --git a/src/plugins/Effect/crossfade/crossfadeplugin.h b/src/plugins/Effect/crossfade/crossfadeplugin.h
index 968405923..8e049f3d0 100644
--- a/src/plugins/Effect/crossfade/crossfadeplugin.h
+++ b/src/plugins/Effect/crossfade/crossfadeplugin.h
@@ -49,6 +49,10 @@ private:
PROCESSING,
};
+ void mix8(uchar *cur_buf, uchar *prev_buf, uint samples, double volume);
+ void mix16(uchar *cur_buf, uchar *prev_buf, uint samples, double volume);
+ void mix32(uchar *cur_buf, uchar *prev_buf, uint samples, double volume);
+
uchar *m_buffer;
ulong m_buffer_at;
ulong m_buffer_size;