/* * 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. */ #ifndef FRAMEWORKS_EX_VARIABLESPEED_JNI_DECODE_BUFFER_H_ #define FRAMEWORKS_EX_VARIABLESPEED_JNI_DECODE_BUFFER_H_ #include <integral_types.h> #include <macros.h> #include <stdlib.h> #include <vector> // DecodeBuffer is used to store arrays of int16 values for audio. // // This class is not thread-safe. You should provide your own // synchronization if you wish to use it from multiple threads. class DecodeBuffer { public: DecodeBuffer(size_t sizeOfOneBuffer, size_t maxSize); virtual ~DecodeBuffer(); size_t GetSizeInBytes() const; void AddData(int8_t* pointer, size_t lengthInBytes); void Clear(); void AdvanceHeadPointerShorts(size_t numberOfShorts); int16 GetAtIndex(size_t index); bool IsTooLarge() const; size_t GetTotalAdvancedCount() const; private: void PushValue(int16 value); size_t sizeOfOneBuffer_; size_t maxSize_; size_t start_; size_t end_; size_t advancedCount_; // This vector isn't ideal because we perform a number of queue-like // operations: namely removing from the front and appending at the back. // However we also need constant-time access to the elements of this // vector, and therefore it's not good enough to use a std::queue. // In practice this data structure choice doesn't seem to be a bottleneck. std::vector<int16*> data_; DISALLOW_COPY_AND_ASSIGN(DecodeBuffer); }; #endif // FRAMEWORKS_EX_VARIABLESPEED_JNI_DECODE_BUFFER_H_