1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 18 #ifndef CTSAUDIO_RWBUFFER_H 19 #define CTSAUDIO_RWBUFFER_H 20 21 #include <stdint.h> 22 #include <utils/String8.h> 23 #include "Log.h" 24 25 /// utility for R/W buffer 26 class RWBuffer { 27 public: RWBuffer(int capacity)28 explicit RWBuffer(int capacity) 29 : mCapacity(capacity), 30 mWrPoint(0), 31 mRdPoint(0) { 32 mBuffer = new char[capacity]; 33 } 34 ~RWBuffer()35 ~RWBuffer() { 36 delete[] mBuffer; 37 } 38 reset()39 void reset() { 40 mWrPoint = 0; 41 mRdPoint = 0; 42 } 43 resetWr()44 void resetWr() { 45 mWrPoint = 0; 46 } 47 resetRd()48 void resetRd() { 49 mRdPoint = 0; 50 } 51 getBuffer()52 const char* getBuffer() { 53 return mBuffer; 54 } getUnwrittenBuffer()55 char* getUnwrittenBuffer() { 56 return mBuffer + mWrPoint; 57 } 58 assertWriteCapacity(int sizeToWrite)59 inline void assertWriteCapacity(int sizeToWrite) { 60 ASSERT((mWrPoint + sizeToWrite) <= mCapacity); 61 } increaseWritten(int size)62 void increaseWritten(int size) { 63 assertWriteCapacity(0); // damage already done, but detect and panic if happened 64 mWrPoint += size; 65 } 66 getSizeWritten()67 int getSizeWritten() { 68 return mWrPoint; 69 } 70 getSizeRead()71 int getSizeRead() { 72 return mRdPoint; 73 } 74 write(T v)75 template <typename T> void write(T v) { 76 char* src = (char*)&v; 77 assertWriteCapacity(sizeof(T)); 78 memcpy(mBuffer + mWrPoint, src, sizeof(T)); 79 mWrPoint += sizeof(T); 80 } writeStr(const android::String8 & str)81 void writeStr(const android::String8& str) { 82 size_t len = str.length(); 83 assertWriteCapacity(len); 84 memcpy(mBuffer + mWrPoint, str.string(), len); 85 mWrPoint += len; 86 } read()87 template <typename T> T read() { 88 T v; 89 ASSERT((mRdPoint + sizeof(T)) <= mWrPoint); 90 memcpy(&v, mBuffer + mRdPoint, sizeof(T)); 91 mRdPoint += sizeof(T); 92 } 93 94 private: 95 int mCapacity; 96 int mWrPoint; 97 int mRdPoint; 98 char* mBuffer; 99 }; 100 101 102 #endif // CTSAUDIO_RWBUFFER_H 103