/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <decode_buffer.h>
namespace {
static const size_t kNumberOfBytesPerSample = 2;
} // namespace
DecodeBuffer::DecodeBuffer(size_t sizeOfOneBuffer, size_t maxSize)
: sizeOfOneBuffer_(sizeOfOneBuffer), maxSize_(maxSize),
start_(0), end_(0), advancedCount_(0), data_() {
Clear();
}
DecodeBuffer::~DecodeBuffer() {
Clear();
}
size_t DecodeBuffer::GetSizeInBytes() const {
return kNumberOfBytesPerSample * (end_ - start_);
}
bool DecodeBuffer::IsTooLarge() const {
return GetSizeInBytes() > maxSize_;
}
void DecodeBuffer::AddData(int8_t* pointer, size_t lengthInBytes) {
for (size_t i = 0; i < lengthInBytes / kNumberOfBytesPerSample; ++i) {
PushValue(reinterpret_cast<int16*>(pointer)[i]);
}
}
void DecodeBuffer::Clear() {
while (data_.size() > 0) {
delete[] data_.front();
data_.erase(data_.begin());
}
start_ = 0;
end_ = 0;
advancedCount_ = 0;
}
size_t DecodeBuffer::GetTotalAdvancedCount() const {
return advancedCount_;
}
void DecodeBuffer::AdvanceHeadPointerShorts(size_t numberOfShorts) {
start_ += numberOfShorts;
while (start_ > sizeOfOneBuffer_) {
data_.push_back(data_.front());
data_.erase(data_.begin());
start_ -= sizeOfOneBuffer_;
end_ -= sizeOfOneBuffer_;
}
advancedCount_ += numberOfShorts;
}
void DecodeBuffer::PushValue(int16 value) {
size_t bufferIndex = end_ / sizeOfOneBuffer_;
if (bufferIndex >= data_.size()) {
data_.push_back(new int16[sizeOfOneBuffer_]);
}
data_.at(bufferIndex)[end_ % sizeOfOneBuffer_] = value;
++end_;
}
int16 DecodeBuffer::GetAtIndex(size_t index) {
return data_.at((start_ + index) / sizeOfOneBuffer_)
[(start_ + index) % sizeOfOneBuffer_];
}