This commit is contained in:
Andrzej Kapolka 2014-09-08 13:29:43 -07:00
commit b2733873e1

View file

@ -18,15 +18,16 @@ template< typename T >
class AudioFrameBuffer { class AudioFrameBuffer {
uint16_t _channelCount; uint16_t _channelCount;
uint16_t _channelCountMax;
uint16_t _frameCount; uint16_t _frameCount;
uint16_t _frameCountMax; uint16_t _frameCountMax;
T** _frameBuffer; T** _frameBuffer;
void allocateFrames() { void allocateFrames() {
_frameBuffer = new T*[_channelCount]; _frameBuffer = new T*[_channelCountMax];
if (_frameBuffer) { if (_frameBuffer) {
for (uint16_t i = 0; i < _channelCount; ++i) { for (uint16_t i = 0; i < _channelCountMax; ++i) {
_frameBuffer[i] = new T[_frameCountMax]; _frameBuffer[i] = new T[_frameCountMax];
} }
} }
@ -34,7 +35,7 @@ class AudioFrameBuffer {
void deallocateFrames() { void deallocateFrames() {
if (_frameBuffer) { if (_frameBuffer) {
for (uint16_t i = 0; i < _channelCount; ++i) { for (uint16_t i = 0; i < _channelCountMax; ++i) {
delete _frameBuffer[i]; delete _frameBuffer[i];
} }
delete _frameBuffer; delete _frameBuffer;
@ -53,6 +54,7 @@ public:
AudioFrameBuffer(const uint16_t channelCount, const uint16_t frameCount) : AudioFrameBuffer(const uint16_t channelCount, const uint16_t frameCount) :
_channelCount(channelCount), _channelCount(channelCount),
_channelCountMax(channelCount),
_frameCount(frameCount), _frameCount(frameCount),
_frameCountMax(frameCount), _frameCountMax(frameCount),
_frameBuffer(NULL) { _frameBuffer(NULL) {
@ -68,6 +70,7 @@ public:
finalize(); finalize();
} }
_channelCount = channelCount; _channelCount = channelCount;
_channelCountMax = channelCount;
_frameCount = frameCount; _frameCount = frameCount;
_frameCountMax = frameCount; _frameCountMax = frameCount;
allocateFrames(); allocateFrames();
@ -76,7 +79,9 @@ public:
void finalize() { void finalize() {
deallocateFrames(); deallocateFrames();
_channelCount = 0; _channelCount = 0;
_channelCountMax = 0;
_frameCount = 0; _frameCount = 0;
_frameCountMax = 0;
} }
T**& getFrameData() { T**& getFrameData() {
@ -95,7 +100,7 @@ public:
if (!_frameBuffer) { if (!_frameBuffer) {
return; return;
} }
for (uint16_t i = 0; i < _channelCount; ++i) { for (uint16_t i = 0; i < _channelCountMax; ++i) {
memset(_frameBuffer[i], 0, sizeof(T)*_frameCountMax); memset(_frameBuffer[i], 0, sizeof(T)*_frameCountMax);
} }
} }
@ -105,10 +110,11 @@ public:
if ( !_frameBuffer || !frames) { if ( !_frameBuffer || !frames) {
return; return;
} }
assert(channelCount == _channelCount); assert(channelCount <= _channelCountMax);
assert(frameCount <= _frameCountMax); assert(frameCount <= _frameCountMax);
_frameCount = frameCount; // we allow copying fewer frames than we've allocated _frameCount = frameCount; // we allow copying fewer frames than we've allocated
_channelCount = channelCount; // we allow copying fewer channels that we've allocated
if (copyOut) { if (copyOut) {
S* dst = frames; S* dst = frames;