// // AudioEditBuffer.h // hifi // // Created by Craig Hansen-Sturm on 8/29/14. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #ifndef hifi_AudioEditBuffer_h #define hifi_AudioEditBuffer_h template< typename T > class AudioEditBuffer : public AudioFrameBuffer { public: AudioEditBuffer(); AudioEditBuffer(const uint32_t channelCount, const uint32_t frameCount); ~AudioEditBuffer(); bool getZeroCrossing(uint32_t start, bool direction, float32_t epsilon, uint32_t& zero); void linearFade(uint32_t start, uint32_t stop, bool increasing); void exponentialFade(uint32_t start, uint32_t stop, bool increasing); }; template< typename T > AudioEditBuffer::AudioEditBuffer() : AudioFrameBuffer() { } template< typename T > AudioEditBuffer::AudioEditBuffer(const uint32_t channelCount, const uint32_t frameCount) : AudioFrameBuffer(channelCount, frameCount) { } template< typename T > AudioEditBuffer::~AudioEditBuffer() { } template< typename T > inline bool AudioEditBuffer::getZeroCrossing(uint32_t start, bool direction, float32_t epsilon, uint32_t& zero) { zero = this->_frameCount; if (direction) { // scan from the left if (start < this->_frameCount) { for (uint32_t i = start; i < this->_frameCount; ++i) { for (uint32_t j = 0; j < this->_channelCount; ++j) { if (this->_frameBuffer[j][i] >= -epsilon && this->_frameBuffer[j][i] <= epsilon) { zero = i; return true; } } } } } else { // scan from the right if (start != 0 && start < this->_frameCount) { for (uint32_t i = start; i != 0; --i) { for (uint32_t j = 0; j < this->_channelCount; ++j) { if (this->_frameBuffer[j][i] >= -epsilon && this->_frameBuffer[j][i] <= epsilon) { zero = i; return true; } } } } } return false; } template< typename T > inline void AudioEditBuffer::linearFade(uint32_t start, uint32_t stop, bool increasing) { if (start >= stop || start > this->_frameCount || stop > this->_frameCount ) { return; } uint32_t count = stop - start; float32_t delta; float32_t gain; if (increasing) { // 0.0 to 1.0f in delta increments delta = 1.0f / (float32_t)count; gain = 0.0f; } else { // 1.0f to 0.0f in delta increments delta = -1.0f / (float32_t)count; gain = 1.0f; } for (uint32_t i = start; i < stop; ++i) { for (uint32_t j = 0; j < this->_channelCount; ++j) { this->_frameBuffer[j][i] *= gain; } gain += delta; } } template< typename T > inline void AudioEditBuffer::exponentialFade(uint32_t start, uint32_t stop, bool increasing) { // TBD } typedef AudioEditBuffer< float32_t > AudioEditBufferFloat32; typedef AudioEditBuffer< int32_t > AudioEditBufferSInt32; #endif // hifi_AudioEditBuffer_h