diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-07-16 21:57:42 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-07-16 21:57:42 +0100 |
| commit | e16c8ed02a0cb1f733a990d75a9de1bf50cf89bd (patch) | |
| tree | f6e884f103da51c8f9b76a6a76693f8389aee607 /src/lib/audio_buffers.cc | |
| parent | 1f1a9f48b39b1fc8afeb62bb6fa0cde50983b60c (diff) | |
Some missing copy constructors / operator= / noncopyable.
Diffstat (limited to 'src/lib/audio_buffers.cc')
| -rw-r--r-- | src/lib/audio_buffers.cc | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/src/lib/audio_buffers.cc b/src/lib/audio_buffers.cc index 7b3af91e0..d38730414 100644 --- a/src/lib/audio_buffers.cc +++ b/src/lib/audio_buffers.cc @@ -30,69 +30,70 @@ using boost::shared_ptr; * @param frames Number of frames to reserve space for. */ AudioBuffers::AudioBuffers (int channels, int frames) - : _channels (channels) - , _frames (frames) - , _allocated_frames (frames) { - _data = static_cast<float**> (malloc (_channels * sizeof (float *))); - if (!_data) { - throw bad_alloc (); - } - - for (int i = 0; i < _channels; ++i) { - _data[i] = static_cast<float*> (malloc (frames * sizeof (float))); - if (!_data[i]) { - throw bad_alloc (); - } - } + allocate (channels, frames); } /** Copy constructor. * @param other Other AudioBuffers; data is copied. */ AudioBuffers::AudioBuffers (AudioBuffers const & other) - : _channels (other._channels) - , _frames (other._frames) - , _allocated_frames (other._frames) { - _data = static_cast<float**> (malloc (_channels * sizeof (float *))); - if (!_data) { - throw bad_alloc (); - } - - for (int i = 0; i < _channels; ++i) { - _data[i] = static_cast<float*> (malloc (_frames * sizeof (float))); - if (!_data[i]) { - throw bad_alloc (); - } - memcpy (_data[i], other._data[i], _frames * sizeof (float)); - } + allocate (other._channels, other._frames); + copy_from (&other, other._frames, 0, 0); } /* XXX: it's a shame that this is a copy-and-paste of the above; probably fixable with c++0x. */ AudioBuffers::AudioBuffers (boost::shared_ptr<const AudioBuffers> other) - : _channels (other->_channels) - , _frames (other->_frames) - , _allocated_frames (other->_frames) { + allocate (other->_channels, other->_frames); + copy_from (other.get(), other->_frames, 0, 0); +} + +AudioBuffers & +AudioBuffers::operator= (AudioBuffers const & other) +{ + if (this == &other) { + return *this; + } + + deallocate (); + allocate (other._channels, other._frames); + copy_from (&other, other._frames, 0, 0); + + return *this; +} + +/** AudioBuffers destructor */ +AudioBuffers::~AudioBuffers () +{ + deallocate (); +} + +void +AudioBuffers::allocate (int channels, int frames) +{ + _channels = channels; + _frames = frames; + _allocated_frames = frames; + _data = static_cast<float**> (malloc (_channels * sizeof (float *))); if (!_data) { throw bad_alloc (); } for (int i = 0; i < _channels; ++i) { - _data[i] = static_cast<float*> (malloc (_frames * sizeof (float))); + _data[i] = static_cast<float*> (malloc (frames * sizeof (float))); if (!_data[i]) { throw bad_alloc (); } - memcpy (_data[i], other->_data[i], _frames * sizeof (float)); } } -/** AudioBuffers destructor */ -AudioBuffers::~AudioBuffers () +void +AudioBuffers::deallocate () { for (int i = 0; i < _channels; ++i) { free (_data[i]); |
