1b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson/* 2b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Copyright (C) 2011 The Android Open Source Project 3b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * 4b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Licensed under the Apache License, Version 2.0 (the "License"); 5b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * you may not use this file except in compliance with the License. 6b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * You may obtain a copy of the License at 7b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * 8b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * http://www.apache.org/licenses/LICENSE-2.0 9b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * 10b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * Unless required by applicable law or agreed to in writing, software 11b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * distributed under the License is distributed on an "AS IS" BASIS, 12b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * See the License for the specific language governing permissions and 14b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson * limitations under the License. 15b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson */ 16b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 17b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#ifndef FRAMEWORKS_EX_VARIABLESPEED_JNI_DECODE_BUFFER_H_ 18b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#define FRAMEWORKS_EX_VARIABLESPEED_JNI_DECODE_BUFFER_H_ 19b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 20b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <integral_types.h> 21b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <macros.h> 22b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <stdlib.h> 23b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#include <vector> 24b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 25b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson// DecodeBuffer is used to store arrays of int16 values for audio. 26b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson// 27b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson// This class is not thread-safe. You should provide your own 28b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson// synchronization if you wish to use it from multiple threads. 29b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudsonclass DecodeBuffer { 30b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson public: 31b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson DecodeBuffer(size_t sizeOfOneBuffer, size_t maxSize); 32b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson virtual ~DecodeBuffer(); 33b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t GetSizeInBytes() const; 34b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson void AddData(int8_t* pointer, size_t lengthInBytes); 35b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson void Clear(); 36b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson void AdvanceHeadPointerShorts(size_t numberOfShorts); 37b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson int16 GetAtIndex(size_t index); 38b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson bool IsTooLarge() const; 39b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t GetTotalAdvancedCount() const; 40b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 41b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson private: 42b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson void PushValue(int16 value); 43b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 44b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t sizeOfOneBuffer_; 45b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t maxSize_; 46b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t start_; 47b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t end_; 48b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson size_t advancedCount_; 49b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // This vector isn't ideal because we perform a number of queue-like 50b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // operations: namely removing from the front and appending at the back. 51b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // However we also need constant-time access to the elements of this 52b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // vector, and therefore it's not good enough to use a std::queue. 53b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson // In practice this data structure choice doesn't seem to be a bottleneck. 54b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson std::vector<int16*> data_; 55b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 56b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson DISALLOW_COPY_AND_ASSIGN(DecodeBuffer); 57b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson}; 58b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson 59b83ad73794088498d6d38cd3b4fc9311f505d051Hugo Hudson#endif // FRAMEWORKS_EX_VARIABLESPEED_JNI_DECODE_BUFFER_H_ 60