| /* |
| * Copyright (C) 2012 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 CTSAUDIO_RWBUFFER_H |
| #define CTSAUDIO_RWBUFFER_H |
| |
| #include <stdint.h> |
| #include <utils/String8.h> |
| #include "Log.h" |
| |
| /// utility for R/W buffer |
| class RWBuffer { |
| public: |
| RWBuffer(int capacity) |
| : mCapacity(capacity), |
| mWrPoint(0), |
| mRdPoint(0) { |
| mBuffer = new char[capacity]; |
| } |
| |
| ~RWBuffer() { |
| delete[] mBuffer; |
| } |
| |
| void reset() { |
| mWrPoint = 0; |
| mRdPoint = 0; |
| } |
| |
| void resetWr() { |
| mWrPoint = 0; |
| } |
| |
| void resetRd() { |
| mRdPoint = 0; |
| } |
| |
| const char* getBuffer() { |
| return mBuffer; |
| } |
| char* getUnwrittenBuffer() { |
| return mBuffer + mWrPoint; |
| } |
| |
| inline void assertWriteCapacity(int sizeToWrite) { |
| ASSERT((mWrPoint + sizeToWrite) <= mCapacity); |
| } |
| void increaseWritten(int size) { |
| assertWriteCapacity(0); // damage already done, but detect and panic if happened |
| mWrPoint += size; |
| } |
| |
| int getSizeWritten() { |
| return mWrPoint; |
| } |
| |
| int getSizeRead() { |
| return mRdPoint; |
| } |
| |
| template <typename T> void write(T v) { |
| char* src = (char*)&v; |
| assertWriteCapacity(sizeof(T)); |
| memcpy(mBuffer + mWrPoint, src, sizeof(T)); |
| mWrPoint += sizeof(T); |
| } |
| void writeStr(const android::String8& str) { |
| size_t len = str.length(); |
| assertWriteCapacity(len); |
| memcpy(mBuffer + mWrPoint, str.string(), len); |
| mWrPoint += len; |
| } |
| template <typename T> T read() { |
| T v; |
| ASSERT((mRdPoint + sizeof(T)) <= mWrPoint); |
| memcpy(&v, mBuffer + mRdPoint, sizeof(T)); |
| mRdPoint += sizeof(T); |
| } |
| |
| private: |
| int mCapacity; |
| int mWrPoint; |
| int mRdPoint; |
| char* mBuffer; |
| }; |
| |
| |
| #endif // CTSAUDIO_RWBUFFER_H |