namespace ARDOUR {
+/** Buffer containing audio data. */
class AudioBuffer : public Buffer
{
public:
assert(_capacity > 0);
assert(src.type() == DataType::AUDIO);
assert(len <= _capacity);
+ assert( src_offset <= ((framecnt_t) src.capacity()-len));
memcpy(_data + dst_offset, ((AudioBuffer&)src).data() + src_offset, sizeof(Sample) * len);
if (dst_offset == 0 && src_offset == 0 && len == _capacity) {
_silent = src.silent();
_written = true;
}
- /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @ dst_offset*/
+ /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
void merge_from (const Buffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
const AudioBuffer* ab = dynamic_cast<const AudioBuffer*>(&src);
assert (ab);
accumulate_from (*ab, len, dst_offset, src_offset);
}
- /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @ dst_offset*/
+ /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @a dst_offset */
void accumulate_from (const AudioBuffer& src, framecnt_t len, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
assert(_capacity > 0);
assert(len <= _capacity);
_written = true;
}
- /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @ dst_offset
+ /** Acumulate (add) @a len frames @a src starting at @a src_offset into self starting at @dst_offset
* scaling by @a gain_coeff */
void accumulate_with_gain_from (const AudioBuffer& src, framecnt_t len, gain_t gain_coeff, framecnt_t dst_offset = 0, framecnt_t src_offset = 0) {
assert(len <= _capacity);
Sample* dst = _data + dst_offset;
- gain_t gain_delta = (target - initial)/len;
+ gain_t gain_delta = (target - initial)/len;
- for (framecnt_t n = 0; n < len; ++n) {
- *dst++ += (*src++ * initial);
- initial += gain_delta;
- }
+ for (framecnt_t n = 0; n < len; ++n) {
+ *dst++ += (*src++ * initial);
+ initial += gain_delta;
+ }
_silent = (_silent && initial == 0 && target == 0);
_written = true;
return _data + offset;
}
- void prepare () { _written = false; }
+ void prepare () { _written = false; _silent = false; }
bool written() const { return _written; }
private: