ardour
audio_buffer.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2006-2007 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify it
5  under the terms of the GNU General Public License as published by the Free
6  Software Foundation; either version 2 of the License, or (at your option)
7  any later version.
8 
9  This program is distributed in the hope that it will be useful, but WITHOUT
10  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12  for more details.
13 
14  You should have received a copy of the GNU General Public License along
15  with this program; if not, write to the Free Software Foundation, Inc.,
16  675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18 
19 #include <errno.h>
20 
21 #include "ardour/audio_buffer.h"
22 #include "pbd/error.h"
23 #include "pbd/malign.h"
24 
25 #include "i18n.h"
26 
27 using namespace PBD;
28 using namespace ARDOUR;
29 
30 AudioBuffer::AudioBuffer(size_t capacity)
31  : Buffer (DataType::AUDIO)
32  , _owns_data (false)
33  , _data (0)
34 {
35  if (capacity) {
36  _owns_data = true; // prevent resize() from gagging
37  resize (capacity);
38  _silent = false; // force silence on the intial buffer state
39  clear ();
40  }
41 }
42 
44 {
45  if (_owns_data)
46  free(_data);
47 }
48 
49 void
50 AudioBuffer::resize (size_t size)
51 {
52  if (!_owns_data) {
53  /* XXX how the hell is this enforced? */
54  _capacity = size;
55  return;
56  }
57 
58  if (_data && size < _capacity) {
59  /* buffer is already large enough */
60  return;
61  }
62 
63  free (_data);
64 
65  cache_aligned_malloc ((void**) &_data, sizeof (Sample) * size);
66 
67  _capacity = size;
68  _silent = false;
69 }
70 
71 bool
73 {
74  for (n = 0; n < nframes; ++n) {
75  if (_data[n] != Sample (0)) {
76  return false;
77  }
78  }
79  return true;
80 }
81 
82 void
84 
85  if (!_silent) {
86  assert(_capacity > 0);
87  assert(offset + len <= _capacity);
88  memset(_data + offset, 0, sizeof (Sample) * len);
89  if (len == _capacity) {
90  _silent = true;
91  }
92  }
93  _written = true;
94 }
bool check_silence(pframes_t, pframes_t &) const
Definition: audio_buffer.cc:72
pframes_t _capacity
Definition: buffer.h:81
uint32_t pframes_t
Definition: types.h:61
int64_t framecnt_t
Definition: types.h:76
float Sample
Definition: types.h:54
void silence(framecnt_t len, framecnt_t offset=0)
Definition: audio_buffer.cc:83
void resize(size_t nframes)
Definition: audio_buffer.cc:50
Definition: amp.h:29
Sample * _data
Actual buffer contents.
Definition: audio_buffer.h:207
virtual void clear()
Definition: buffer.h:70
Definition: debug.h:30
int cache_aligned_malloc(void **memptr, size_t size)
Definition: malign.cc:38
bool _silent
Definition: buffer.h:82