@@ -34,10 +34,10 @@ qtractorTimeStretcher::qtractorTimeStretcher (
34
34
, m_pRubberBandStretcher(nullptr )
35
35
, m_iRubberBandChannels(iChannels)
36
36
, m_iRubberBandLatency(0 )
37
+ , m_iRubberBandPadding(0 )
37
38
, m_iRubberBandFrames(0 )
38
39
, m_ppRubberBandFrames(nullptr )
39
40
, m_ppRubberBandBuffer(nullptr )
40
- , m_bRubberBandStart(false )
41
41
, m_bRubberBandFlush(false )
42
42
#endif
43
43
{
@@ -79,7 +79,8 @@ qtractorTimeStretcher::qtractorTimeStretcher (
79
79
if (fPitchShift < 1e-3f )
80
80
fPitchShift = 1 .0f ;
81
81
RubberBand::RubberBandStretcher::Options options
82
- = RubberBand::RubberBandStretcher::OptionProcessRealTime;
82
+ = RubberBand::RubberBandStretcher::OptionProcessRealTime
83
+ | RubberBand::RubberBandStretcher::OptionWindowShort;
83
84
if (iFlags & RubberBandFormant)
84
85
options |= RubberBand::RubberBandStretcher::OptionFormantPreserved;
85
86
#ifdef CONFIG_LIBRUBBERBAND_R3
@@ -94,11 +95,12 @@ qtractorTimeStretcher::qtractorTimeStretcher (
94
95
m_ppRubberBandBuffer = new float * [m_iRubberBandChannels];
95
96
#ifdef CONFIG_LIBRUBBERBAND_R3
96
97
m_iRubberBandLatency = m_pRubberBandStretcher->getStartDelay ();
97
- m_iRubberBandFrames = m_pRubberBandStretcher->getPreferredStartPad ();
98
- if (m_iRubberBandFrames < m_iRubberBandLatency)
99
- m_iRubberBandFrames = m_iRubberBandLatency;
98
+ m_iRubberBandPadding = m_pRubberBandStretcher->getPreferredStartPad ();
99
+ m_iRubberBandPadding += m_iRubberBandLatency;
100
+ m_iRubberBandFrames = qMax ( m_iRubberBandLatency, m_iRubberBandPadding) ;
100
101
#else
101
102
m_iRubberBandLatency = m_pRubberBandStretcher->getLatency ();
103
+ m_iRubberBandPadding = m_iRubberBandLatency;
102
104
m_iRubberBandFrames = m_iRubberBandLatency;
103
105
#endif
104
106
if (m_iRubberBandFrames > 0 ) {
@@ -153,13 +155,11 @@ void qtractorTimeStretcher::process (
153
155
}
154
156
#ifdef CONFIG_LIBRUBBERBAND
155
157
if (m_pRubberBandStretcher) {
156
- if (!m_bRubberBandStart) {
157
- // Process the first dummy empty buffer...
158
- if (m_iRubberBandFrames > 0 ) {
159
- m_pRubberBandStretcher->process (
160
- m_ppRubberBandFrames, m_iRubberBandFrames, false );
161
- }
162
- m_bRubberBandStart = true ;
158
+ // Process the first dummy empty buffer...
159
+ if (m_iRubberBandPadding > 0 ) {
160
+ m_pRubberBandStretcher->process (
161
+ m_ppRubberBandFrames, m_iRubberBandPadding, false );
162
+ m_iRubberBandPadding = 0 ;
163
163
}
164
164
m_pRubberBandStretcher->process (ppFrames, iFrames, false );
165
165
}
@@ -243,11 +243,11 @@ void qtractorTimeStretcher::reset (void)
243
243
m_pRubberBandStretcher->reset ();
244
244
#ifdef CONFIG_LIBRUBBERBAND_R3
245
245
m_iRubberBandLatency = m_pRubberBandStretcher->getStartDelay ();
246
- m_iRubberBandFrames = m_pRubberBandStretcher->getPreferredStartPad ();
247
- if (m_iRubberBandFrames < m_iRubberBandLatency)
248
- m_iRubberBandFrames = m_iRubberBandLatency;
246
+ m_iRubberBandPadding = m_pRubberBandStretcher->getPreferredStartPad ();
247
+ m_iRubberBandFrames = qMax (m_iRubberBandLatency, m_iRubberBandPadding);
249
248
#else
250
249
m_iRubberBandLatency = m_pRubberBandStretcher->getLatency ();
250
+ m_iRubberBandPadding = m_iRubberBandLatency;
251
251
m_iRubberBandFrames = m_iRubberBandLatency;
252
252
#endif
253
253
if (m_iRubberBandFrames > 0 ) {
@@ -261,7 +261,6 @@ void qtractorTimeStretcher::reset (void)
261
261
for (unsigned short i = 1 ; i < m_iRubberBandChannels; ++i)
262
262
m_ppRubberBandFrames[i] = m_ppRubberBandFrames[0 ];
263
263
}
264
- m_bRubberBandStart = false ;
265
264
m_bRubberBandFlush = false ;
266
265
}
267
266
#endif
0 commit comments