- assert(offset + len <= _capacity);
- memcpy(_data + offset, ((AudioBuffer&)src).data(), sizeof(Sample) * len);
- _silent = src.silent();
+ 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();
+ } else {
+ _silent = _silent && src.silent();
+ }
+ _written = true;
+ }
+
+ /** 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);