diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Effect/srconverter/srconverter.cpp | 71 | ||||
| -rw-r--r-- | src/plugins/Effect/srconverter/srconverter.h | 3 | ||||
| -rw-r--r-- | src/qmmp/audioconverter.cpp | 4 |
3 files changed, 32 insertions, 46 deletions
diff --git a/src/plugins/Effect/srconverter/srconverter.cpp b/src/plugins/Effect/srconverter/srconverter.cpp index 6b22292af..17fdecfd5 100644 --- a/src/plugins/Effect/srconverter/srconverter.cpp +++ b/src/plugins/Effect/srconverter/srconverter.cpp @@ -27,11 +27,8 @@ SRConverter::SRConverter() : Effect() { - m_isSrcAlloc = false; int converter_type_array[] = {SRC_SINC_BEST_QUALITY, SRC_SINC_MEDIUM_QUALITY, SRC_SINC_FASTEST, SRC_ZERO_ORDER_HOLD, SRC_LINEAR}; - m_srcIn = 0; - m_srcOut = 0; m_src_state = 0; m_srcError = 0; QSettings settings(Qmmp::configFile(), QSettings::IniFormat); @@ -48,66 +45,57 @@ SRConverter::~SRConverter() m_src_data.end_of_input = 0; m_src_data.input_frames = 0; m_src_data.output_frames = 0; - if (m_isSrcAlloc) - { - delete [] m_srcIn; - delete [] m_srcOut; - delete [] m_wOut; - m_isSrcAlloc = false; - } } void SRConverter::applyEffect(Buffer *b) { - if (m_isSrcAlloc) - { - delete [] m_srcIn; - delete [] m_srcOut; - delete [] m_wOut; - m_isSrcAlloc = false; - } - ulong wbytes = 0; - if (m_src_state && b->nbytes > 0) { - int lrLength = b->nbytes/2; - int overLrLength= (int)floor(lrLength*(m_src_data.src_ratio+1)); - m_srcIn = new float [lrLength]; - m_srcOut = new float [overLrLength]; - m_wOut = new short[overLrLength]; - src_short_to_float_array((short *)b->data, m_srcIn, lrLength); - m_isSrcAlloc = true; - m_src_data.data_in = m_srcIn; - m_src_data.data_out = m_srcOut; + m_src_data.input_frames = b->nbytes / 2 / channels(); + m_src_data.data_in = new float [m_src_data.input_frames * channels()]; + m_src_data.output_frames = m_src_data.src_ratio * m_src_data.input_frames + 1; m_src_data.end_of_input = 0; - m_src_data.input_frames = lrLength/2; - m_src_data.output_frames = overLrLength/2; + m_src_data.data_out = new float [m_src_data.output_frames * channels()]; + src_short_to_float_array((short*) b->data, m_src_data.data_in, + m_src_data.input_frames * channels()); if ((m_srcError = src_process(m_src_state, &m_src_data)) > 0) { qWarning("SRConverter: src_process(): %s\n", src_strerror(m_srcError)); } else { - src_float_to_short_array(m_srcOut, m_wOut, m_src_data.output_frames_gen*2); - wbytes = m_src_data.output_frames_gen*4; - delete [] b->data; - b->data = (unsigned char *) m_wOut; - b->nbytes = wbytes; - m_wOut = 0; + qint16 *out_data = new qint16 [m_src_data.output_frames_gen * channels()]; + src_float_to_short_array(m_src_data.data_out, out_data, + m_src_data.output_frames_gen*channels()); + b->nbytes = m_src_data.output_frames_gen * channels() * 2; + if(b->nbytes > b->size) + { + delete [] b->data; + b->data = (uchar *) out_data; + } + else + { + memcpy(b->data, out_data, b->nbytes); + delete [] out_data; + } + } + delete [] m_src_data.data_in; + delete [] m_src_data.data_out; } } void SRConverter::configure(quint32 freq, int chan, Qmmp::AudioFormat format) { freeSRC(); - uint rate = freq; + if(freq != m_overSamplingFs) { - m_src_state = src_new(m_converter_type, 2, &m_srcError); + m_src_state = src_new(m_converter_type, chan, &m_srcError); if (m_src_state) { - m_src_data.src_ratio = (float)m_overSamplingFs/(float)rate; - rate = m_overSamplingFs; + m_src_data.src_ratio = (float)m_overSamplingFs/(float)freq; + src_set_ratio(m_src_state, m_src_data.src_ratio); + qDebug("%f", m_src_data.src_ratio); } else qDebug("SRConverter: src_new(): %s", src_strerror(m_srcError)); @@ -117,6 +105,7 @@ void SRConverter::configure(quint32 freq, int chan, Qmmp::AudioFormat format) void SRConverter::freeSRC() { - if (m_src_state != NULL) + if (m_src_state) m_src_state = src_delete(m_src_state); + m_src_state = 0; } diff --git a/src/plugins/Effect/srconverter/srconverter.h b/src/plugins/Effect/srconverter/srconverter.h index 5bc4b4ad1..ec14b508c 100644 --- a/src/plugins/Effect/srconverter/srconverter.h +++ b/src/plugins/Effect/srconverter/srconverter.h @@ -43,9 +43,6 @@ private: quint32 m_overSamplingFs; int m_srcError; int m_converter_type; - bool m_isSrcAlloc; - float *m_srcIn, *m_srcOut; - short *m_wOut; quint32 m_freq; }; diff --git a/src/qmmp/audioconverter.cpp b/src/qmmp/audioconverter.cpp index fffe46eee..dbe9706e7 100644 --- a/src/qmmp/audioconverter.cpp +++ b/src/qmmp/audioconverter.cpp @@ -67,11 +67,11 @@ void AudioConverter::applyEffect(Buffer *b) break; } case Qmmp::PCM_S24LE: - s24_to_s16((qint32 *)b->data, (qint16 *)b->data, b->nbytes/4); + s24_to_s16((qint32 *)b->data, (qint16 *)b->data, b->nbytes >> 2); b->nbytes >>= 1; break; case Qmmp::PCM_S32LE: - s32_to_s16((qint32 *)b->data, (qint16 *)b->data, b->nbytes/4); + s32_to_s16((qint32 *)b->data, (qint16 *)b->data, b->nbytes >> 2); b->nbytes >>= 1; break; default: |
