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 #ifndef CTSAUDIO_BUFFER_H
18 #define CTSAUDIO_BUFFER_H
19 
20 #include <stdlib.h>
21 #include <string.h>
22 #include <utils/String8.h>
23 
24 #include <utils/RefBase.h>
25 
26 #include <Log.h>
27 
28 /**
29  * Buffer passed for audio playback and recording
30  * The buffer is supposed to be used with sp to guarantee that audio thread can
31  * access it even if the client thread is dead.
32  */
33 class Buffer: public virtual android::RefBase {
34 public:
35     explicit Buffer(size_t capacity, size_t size = 0, bool stereo = true);
36 
37     virtual ~Buffer();
38 
getCapacity()39     inline size_t getCapacity() {
40         return mCapacity;
41     };
42 
getSize()43     inline size_t getSize() {
44         return mSize;
45     };
46 
getSamples()47     inline size_t getSamples() {
48         return (getSize() / (isStereo() ? 4 : 2));
49     };
50 
setSize(size_t size)51     inline void setSize(size_t size) {
52         mSize = size;
53     };
54 
increaseSize(size_t size)55     inline void increaseSize(size_t size) {
56         mSize += size;
57     }
getData()58     inline char* getData() {
59         return mData;
60     };
61 
setData(char * data,size_t len)62     inline void setData(char* data, size_t len) {
63         ASSERT(len <= mCapacity);
64         memcpy(mData, data, len);
65         mSize = len;
66     };
67 
getUnhanledData()68     inline char* getUnhanledData() {
69         return mData + mHandled;
70     };
71 
bufferHandled()72     inline bool bufferHandled() {
73         return mSize <= mHandled;
74     };
75 
restart()76     inline void restart() {
77         mHandled = 0;
78     };
79     /// size was recorded
increaseHandled(size_t size)80     inline void increaseHandled(size_t size) {
81         mHandled += size;
82     };
83 
setHandled(size_t size)84     inline void setHandled(size_t size) {
85         mHandled = size;
86     }
87     /// amount recorded
amountHandled()88     inline size_t amountHandled() {
89         return mHandled;
90     };
91 
amountToHandle()92     inline size_t amountToHandle() {
93         return mSize - mHandled;
94     };
95 
isStereo()96     inline bool isStereo() {
97         return mStereo;
98     };
99     enum ConvertOption {
100         EKeepCh0 = 0,
101         EKeepCh1 = 1,
102         EAverage = 2
103     };
104     /// change stereo buffer to mono
105     void changeToMono(ConvertOption option);
106     /// change mono buffer to stereo. This does not increase allocated memory.
107     /// So it will fail if capacity is not big enough.
108     bool changeToStereo();
109 
110     /// save the buffer to file
111     /// extension appropriate for the data type will be appended to file name
112     bool saveToFile(const android::String8& filename);
113 
114     bool operator ==(const Buffer& b) const;
115 
116     /// load raw data from given file.
117     /// data format is decided by extension
118     /// .r2s: 16 bps, stereo
119     /// .r2m: 16bps, mono
120     static Buffer* loadFromFile(const android::String8& filename);
121 private:
122     // max data that can be hold
123     size_t mCapacity;
124     // data stored for playback / to store for recording
125     size_t mSize;
126     // how much data was handled / recorded
127     size_t mHandled;
128     // stereo or mono
129     bool mStereo;
130     // payload
131     char* mData;
132 };
133 
134 
135 
136 #endif // CTSAUDIO_BUFFER_H
137