allow auditioning via the monitor section to work.
[ardour.git] / libs / ardour / audio_buffer.cc
index 1fd0337dd12c3e8bcba9608e12834918ef4d868c..aa4f64755aeb9399d31e402b8703eae2dd1a4d1d 100644 (file)
@@ -28,15 +28,15 @@ using namespace PBD;
 using namespace ARDOUR;
 
 AudioBuffer::AudioBuffer(size_t capacity)
-       : Buffer(DataType::AUDIO, capacity)
+       : Buffer (DataType::AUDIO)
        , _owns_data (false)
        , _data (0)
 {
-       if (_capacity > 0) {
+       if (capacity) {
                _owns_data = true; // prevent resize() from gagging
-               resize (_capacity);
+               resize (capacity);
                _silent = false; // force silence on the intial buffer state
-               silence (_capacity);
+               clear ();
        }
 }
 
@@ -50,30 +50,52 @@ void
 AudioBuffer::resize (size_t size)
 {
        if (!_owns_data) {
+               /* XXX how the hell is this enforced? */
+               _capacity = size;
                return;
        }
 
-       if (size < _capacity) {
-               _size = size;
+       if (_data && size < _capacity) {
+               /* buffer is already large enough */
+               
+               if (size < _size) {
+                       /* truncate */
+                       _size = size;
+               }
+
                return;
        }
 
        free (_data);
 
+       cache_aligned_malloc ((void**) &_data, sizeof (Sample) * size);
+
        _capacity = size;
-       _size = size;
+       _size = 0;
        _silent = false;
-
-       cache_aligned_malloc ((void**) &_data, sizeof (Sample) * _capacity);
 }
 
 bool
-AudioBuffer::check_silence (pframes_t nframes, pframes_t& n) const
+AudioBuffer::check_silence (pframes_t nframes, bool wholebuffer, pframes_t& n) const
 {
-       for (n = 0; n < _size && n < nframes; ++n) {
+       for (n = 0; (wholebuffer || n < _size) &&  n < nframes; ++n) {
                if (_data[n] != Sample (0)) {
                        return false;
                }
        }
        return true;
 }
+
+void
+AudioBuffer::silence (framecnt_t len, framecnt_t offset) {
+
+       if (!_silent) {
+               assert(_capacity > 0);
+               assert(offset + len <= _capacity);
+               memset(_data + offset, 0, sizeof (Sample) * len);
+               if (len == _capacity) {
+                       _silent = true;
+               }
+       }
+       _written = true;
+}