|
2 | 2 |
|
3 | 3 | #include <QDebug> |
4 | 4 |
|
| 5 | +#include "engine/enginebuffer.h" |
5 | 6 | #include "engine/readaheadmanager.h" |
6 | 7 | #include "moc_enginebufferscalesr.cpp" |
7 | 8 | #include "util/math.h" |
8 | 9 | #include "util/sample.h" |
9 | 10 |
|
10 | | -EngineBufferScaleSR::EngineBufferScaleSR(ReadAheadManager* pReadAheadManager) |
11 | | - : m_pReadAheadManager(pReadAheadManager), |
12 | | - m_bBackwards(false) { |
13 | | - qDebug() << "constructed enginebufferscaleSR"; |
| 11 | +namespace { |
| 12 | +constexpr int kMaxInterpolationFactor = 12; |
| 13 | +} // namespace |
| 14 | + |
| 15 | +EngineBufferScaleSR::EngineBufferScaleSR() |
| 16 | + : m_pResampler(nullptr) { |
| 17 | + int error{}; |
| 18 | + m_dChannels = getOutputSignal().getChannelCount(); |
| 19 | + m_pResampler = src_new(SRC_SINC_BEST_QUALITY, m_dChannels.value(), &error); |
| 20 | + if (error || !m_pResampler) { |
| 21 | + qWarning() << "libsamplerate initialization error:" << src_strerror(error); |
| 22 | + m_pResampler = nullptr; |
| 23 | + } |
| 24 | + |
| 25 | + clear(); |
14 | 26 | } |
15 | 27 |
|
16 | 28 | EngineBufferScaleSR::~EngineBufferScaleSR() { |
17 | 29 | } |
18 | 30 |
|
19 | | -void EngineBufferScaleSR::setQuality(double engine_quality) { |
20 | | - m_pEngineQuality = engine_quality; |
| 31 | +void EngineBufferScaleSR::clear() { |
| 32 | + if (m_pResampler) { |
| 33 | + src_reset(m_pResampler); |
| 34 | + } |
21 | 35 | } |
22 | 36 |
|
23 | | -// these parameters describe the "request" that |
24 | | -// needs to be handled by libsamplerate. |
25 | | -// use the default implementation for now. |
26 | | -void EngineBufferScaleSR::setScaleParameters(double base_rate, |
27 | | - double* pTempoRatio, |
28 | | - double* pPitchRatio) { |
29 | | - (void)base_rate; |
30 | | - (void)pTempoRatio; |
31 | | - (void)pPitchRatio; |
32 | | -} |
| 37 | +// baseRate: engine rate/recordingrate |
| 38 | +double EngineBufferScaleSR::recScaleBuffer(const CSAMPLE* pInputBuffer, |
| 39 | + CSAMPLE* pOutputBuffer, |
| 40 | + SINT iInputBufferSize, |
| 41 | + double srcRatio) { |
| 42 | + if (!pOutputBuffer || !pInputBuffer || iInputBufferSize <= 0) { |
| 43 | + return 0.0; |
| 44 | + } |
| 45 | + qDebug() << "input buffer size samples (from sidechain): " << iInputBufferSize; |
33 | 46 |
|
34 | | -void EngineBufferScaleSR::onSignalChanged() { |
35 | | - qDebug() << "onSignalChanged called"; |
36 | | -} |
| 47 | + // create SRC_DATA struct |
| 48 | + SRC_DATA src_data; |
| 49 | + src_data.data_in = pInputBuffer; |
37 | 50 |
|
38 | | -void EngineBufferScaleSR::clear() { |
39 | | - qDebug() << "clear called"; |
| 51 | + // frames that need to be resampled |
| 52 | + SINT numInputFrames = getOutputSignal().samples2frames(iInputBufferSize); |
| 53 | + src_data.input_frames = numInputFrames; |
| 54 | + src_data.data_out = pOutputBuffer; |
| 55 | + |
| 56 | + // max # output frames = (96khz/8khz) * #input frames |
| 57 | + src_data.output_frames = kMaxInterpolationFactor * numInputFrames; |
| 58 | + |
| 59 | + // conversion ratio |
| 60 | + src_data.src_ratio = srcRatio; |
| 61 | + src_data.end_of_input = 0; |
| 62 | + |
| 63 | + int error = src_process(m_pResampler, &src_data); |
| 64 | + if (error) { |
| 65 | + qWarning() << "libsamplerate error:" << src_strerror(error); |
| 66 | + } |
| 67 | + |
| 68 | + SINT frames_generated = src_data.output_frames_gen; |
| 69 | + qDebug() << "SRC consumed " << src_data.input_frames_used << " input frames, produced " |
| 70 | + << frames_generated << " output frames"; |
| 71 | + |
| 72 | + return frames_generated; |
40 | 73 | } |
41 | 74 |
|
42 | | -// not called during regular playback |
43 | | -double EngineBufferScaleSR::scaleBuffer( |
44 | | - CSAMPLE* pOutputBuffer, |
45 | | - SINT iOutputBufferSize) { |
46 | | - qDebug() << "scaling using libsamplerate"; |
47 | | - (void)pOutputBuffer; |
48 | | - (void)iOutputBufferSize; |
| 75 | +double EngineBufferScaleSR::scaleBuffer(CSAMPLE* /*pBuffer*/, SINT /*iBufferSize*/) { |
| 76 | + qWarning() << "Using temporary stub implementation"; |
49 | 77 | return 1.0; |
50 | 78 | } |
| 79 | + |
| 80 | +void EngineBufferScaleSR::onSignalChanged() { |
| 81 | + qWarning() << "Using temporary stub implementation"; |
| 82 | +} |
0 commit comments