Make a new AudioBuffers constructor and use it to avoid some use of the more complica...
[dcpomatic.git] / src / lib / audio_buffers.cc
index 8d3a897c42d76eb7ecd7f0474afdba63ba014a27..cceb1267213450ed8fc6cc3c4dbc3d8c913c032c 100644 (file)
@@ -52,6 +52,12 @@ AudioBuffers::AudioBuffers (boost::shared_ptr<const AudioBuffers> other)
        copy_from (other.get(), other->_frames, 0, 0);
 }
 
+AudioBuffers::AudioBuffers (boost::shared_ptr<const AudioBuffers> other, int32_t frames_to_copy, int32_t read_offset)
+{
+       allocate (other->_channels, frames_to_copy);
+       copy_from (other.get(), frames_to_copy, read_offset, 0);
+}
+
 AudioBuffers &
 AudioBuffers::operator= (AudioBuffers const & other)
 {
@@ -125,7 +131,9 @@ AudioBuffers::set_frames (int32_t f)
 {
        DCPOMATIC_ASSERT (f <= _allocated_frames);
 
-       make_silent (f, _frames - f);
+       if (f < _frames) {
+               make_silent (f, _frames - f);
+       }
        _frames = f;
 }
 
@@ -269,8 +277,11 @@ AudioBuffers::ensure_size (int32_t frames)
                }
        }
 
-       make_silent (_allocated_frames, frames - _allocated_frames);
+       int32_t const old_allocated = _allocated_frames;
        _allocated_frames = frames;
+       if (old_allocated < _allocated_frames) {
+               make_silent (old_allocated, _allocated_frames - old_allocated);
+       }
 }
 
 /** Mix some other buffers with these ones.  The AudioBuffers must have the same number of channels.