gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

audiobuffer.cpp (2259B)


      1 #include "audiobuffer.h"
      2 
      3 #include <cassert>
      4 #include <cstring>	// memcpy
      5 
      6 namespace synthLib
      7 {
      8 	void AudioBuffer::insertZeroes(size_t _size)
      9 	{
     10 		TChannel zeroes;
     11 		zeroes.resize(_size, 0.0f);
     12 
     13 		for(size_t c=0; c<m_data.size(); ++c)
     14 		{
     15 			m_data[c].insert(m_data[c].begin(), zeroes.begin(), zeroes.end());
     16 		}
     17 	}
     18 
     19 	AudioBuffer::AudioBuffer(size_t _channelCount, const size_t _capacity)
     20 	{
     21 		m_data.resize(_channelCount);
     22 		reserve(_capacity);
     23 	}
     24 
     25 	void AudioBuffer::reserve(size_t _capacity)
     26 	{
     27 		for(auto i=0; i<m_data.size(); ++i)
     28 		{
     29 			if(m_data[i].capacity() < _capacity)
     30 				m_data[i].reserve(_capacity);
     31 		}
     32 	}
     33 
     34 	void AudioBuffer::resize(size_t _capacity)
     35 	{
     36 		for(auto i=0; i<m_data.size(); ++i)
     37 		{
     38 			m_data[i].resize(_capacity);
     39 		}
     40 	}
     41 
     42 	void AudioBuffer::append(const TBuffer& _data)
     43 	{
     44 		assert(_data.size() == m_data.size());
     45 
     46 		for(size_t c=0; c<_data.size(); ++c)
     47 		{
     48 			append(m_data[c], &_data[c].front(), _data[c].size());
     49 		}
     50 	}
     51 
     52 	void AudioBuffer::append(const float** _data, size_t _size)
     53 	{
     54 		for(size_t c=0; c<m_data.size(); ++c)
     55 		{
     56 			append(m_data[c], _data[c], _size);
     57 		}
     58 	}
     59 
     60 	void AudioBuffer::append(const TAudioInputs& _data, size_t _size)
     61 	{
     62 		const auto c = std::min(m_data.size(), _data.size());
     63 
     64 		for(size_t i=0; i<c; ++i)
     65 			append(m_data[i], _data[i], _size);
     66 	}
     67 
     68 	void AudioBuffer::remove(const size_t _count)
     69 	{
     70 		for(size_t c=0; c<m_data.size(); ++c)
     71 		{
     72 			if(_count >= m_data[c].size())
     73 				m_data[c].clear();
     74 			else
     75 				m_data[c].erase(m_data[c].begin(), m_data[c].begin() + _count);
     76 		}
     77 	}
     78 
     79 	void AudioBuffer::fillPointers(TAudioOutputs& _pointers, size_t _offset)
     80 	{
     81 		for(size_t c=0; c<m_data.size(); ++c)
     82 			_pointers[c] = &m_data[c][_offset];
     83 	}
     84 
     85 	void AudioBuffer::fillPointers(TAudioInputs& _pointers, size_t _offset) const
     86 	{
     87 		for(size_t c=0; c<m_data.size(); ++c)
     88 			_pointers[c] = &m_data[c][_offset];
     89 		for(size_t c=m_data.size(); c<_pointers.size(); ++c)
     90 			_pointers[c] = nullptr;
     91 	}
     92 
     93 	size_t AudioBuffer::size() const
     94 	{
     95 		if(m_data.empty())
     96 			return 0;
     97 		return m_data[0].size();
     98 	}
     99 
    100 	void AudioBuffer::append(TChannel& _dst, const float* _data, size_t _size)
    101 	{
    102 		const auto oldSize = _dst.size();
    103 		_dst.resize(oldSize + _size);
    104 		memcpy(&_dst[oldSize], _data, _size * sizeof(float));
    105 	}
    106 
    107 }