+void
+DelayLine::allocate_pending_buffers (samplecnt_t signal_delay, ChanCount const& cc)
+{
+ assert (signal_delay >= 0);
+ samplecnt_t rbs = signal_delay + 8192 + 1;
+ rbs = std::max (_bsiz, rbs);
+
+ uint64_t power_of_two;
+ for (power_of_two = 1; 1 << power_of_two < rbs; ++power_of_two) {}
+ rbs = 1 << power_of_two;
+
+ if (cc.n_audio () == _buf.size () && _bsiz == rbs) {
+ return;
+ }
+
+ _buf.clear ();
+ if (cc.n_audio () == 0) {
+ return;
+ }
+
+ AudioDlyBuf pending_buf;
+ for (uint32_t i = 0; i < cc.n_audio (); ++i) {
+ boost::shared_array<Sample> b (new Sample[rbs]);
+ pending_buf.push_back (b);
+ memset (b.get (), 0, rbs * sizeof (Sample));
+ }
+
+ AudioDlyBuf::iterator bo = _buf.begin ();
+ AudioDlyBuf::iterator bn = pending_buf.begin ();
+
+ for (; bo != _buf.end () && bn != pending_buf.end(); ++bo, ++bn) {
+ Sample* rbo = (*bo).get ();
+ Sample* rbn = (*bn).get ();
+ if (_roff < _woff) {
+ /* copy data between _roff .. _woff to new buffer */
+ copy_vector (&rbn[_roff], &rbo[_roff], _woff - _roff);
+ } else {
+ /* copy data between _roff .. old_size to end of new buffer, increment _roff
+ * copy data from 0.._woff to beginning of new buffer
+ */
+ sampleoffset_t offset = rbs - _bsiz;
+ copy_vector (&rbn[_roff + offset], &rbo[_roff], _bsiz - _roff);
+ copy_vector (rbn, rbo, _woff);
+ _roff += offset;
+ assert (_roff < rbs);
+ }
+ }
+ _bsiz = rbs;
+ _bsiz_mask = _bsiz - 1;
+ _buf.swap (pending_buf);
+}
+