| /* |
| * 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_BUFFER_H |
| #define CTSAUDIO_BUFFER_H |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include <utils/String8.h> |
| |
| #include <utils/RefBase.h> |
| |
| #include <Log.h> |
| |
| /** |
| * Buffer passed for audio playback and recording |
| * The buffer is supposed to be used with sp to guarantee that audio thread can |
| * access it even if the client thread is dead. |
| */ |
| class Buffer: public virtual android::RefBase { |
| public: |
| Buffer(size_t capacity, size_t size = 0, bool stereo = true); |
| |
| virtual ~Buffer(); |
| |
| inline size_t getCapacity() { |
| return mCapacity; |
| }; |
| |
| inline size_t getSize() { |
| return mSize; |
| }; |
| |
| inline size_t getSamples() { |
| return (getSize() / (isStereo() ? 4 : 2)); |
| }; |
| |
| inline void setSize(size_t size) { |
| mSize = size; |
| }; |
| |
| inline void increaseSize(size_t size) { |
| mSize += size; |
| } |
| inline char* getData() { |
| return mData; |
| }; |
| |
| inline void setData(char* data, size_t len) { |
| ASSERT(len <= mCapacity); |
| memcpy(mData, data, len); |
| mSize = len; |
| }; |
| |
| inline char* getUnhanledData() { |
| return mData + mHandled; |
| }; |
| |
| inline bool bufferHandled() { |
| return mSize <= mHandled; |
| }; |
| |
| inline void restart() { |
| mHandled = 0; |
| }; |
| /// size was recorded |
| inline void increaseHandled(size_t size) { |
| mHandled += size; |
| }; |
| |
| inline void setHandled(size_t size) { |
| mHandled = size; |
| } |
| /// amount recorded |
| inline size_t amountHandled() { |
| return mHandled; |
| }; |
| |
| inline size_t amountToHandle() { |
| return mSize - mHandled; |
| }; |
| |
| inline bool isStereo() { |
| return mStereo; |
| }; |
| enum ConvertOption { |
| EKeepCh0 = 0, |
| EKeepCh1 = 1, |
| EAverage = 2 |
| }; |
| /// change stereo buffer to mono |
| void changeToMono(ConvertOption option); |
| /// change mono buffer to stereo. This does not increase allocated memory. |
| /// So it will fail if capacity is not big enough. |
| bool changeToStereo(); |
| |
| /// save the buffer to file |
| /// extension appropriate for the data type will be appended to file name |
| bool saveToFile(const android::String8& filename); |
| |
| bool operator ==(const Buffer& b) const; |
| |
| /// load raw data from given file. |
| /// data format is decided by extension |
| /// .r2s: 16 bps, stereo |
| /// .r2m: 16bps, mono |
| static Buffer* loadFromFile(const android::String8& filename); |
| private: |
| // max data that can be hold |
| size_t mCapacity; |
| // data stored for playback / to store for recording |
| size_t mSize; |
| // how much data was handled / recorded |
| size_t mHandled; |
| // stereo or mono |
| bool mStereo; |
| // payload |
| char* mData; |
| }; |
| |
| |
| |
| #endif // CTSAUDIO_BUFFER_H |