41 #ifndef __CABufferList_h__
42 #define __CABufferList_h__
45 #include "CAStreamBasicDescription.h"
46 #include "CAXException.h"
48 void CAShowAudioBufferList(
const AudioBufferList &abl,
int framesToPrint,
const AudioStreamBasicDescription &fmt,
const char *label=NULL);
49 void CAShowAudioBufferList(
const AudioBufferList &abl,
int framesToPrint,
int wordSize,
const char *label=NULL);
50 extern "C" void CAShowAudioBufferList(
const AudioBufferList *abl,
int framesToPrint,
int wordSize);
51 extern "C" int CrashIfClientProvidedBogusAudioBufferList(
const AudioBufferList *abl,
bool nullOK=
false);
68 void *
operator new(
size_t ,
int nBuffers) {
69 return ::operator
new(
sizeof(CABufferList) + (nBuffers-1) *
sizeof(AudioBuffer));
71 static CABufferList * New(
const char *name,
const CAStreamBasicDescription &format)
73 UInt32 numBuffers = format.NumberChannelStreams(), channelsPerBuffer = format.NumberInterleavedChannels();
74 return new(numBuffers) CABufferList(name, numBuffers, channelsPerBuffer);
78 CABufferList(
const char *name, UInt32 numBuffers, UInt32 channelsPerBuffer) :
83 mNumberBuffers = numBuffers;
84 AudioBuffer *buf = mBuffers;
85 for (UInt32 i = mNumberBuffers; i--; ++buf) {
86 buf->mNumberChannels = channelsPerBuffer;
87 buf->mDataByteSize = 0;
96 delete[] mBufferMemory;
99 const char * Name() {
return mName; }
101 const AudioBufferList & GetBufferList()
const {
return *(AudioBufferList *)&mNumberBuffers; }
103 AudioBufferList & GetModifiableBufferList()
105 VerifyNotTrashingOwnedBuffer();
106 return _GetBufferList();
109 UInt32 GetNumberBuffers()
const {
return mNumberBuffers; }
111 UInt32 GetNumBytes()
const
113 return mBuffers[0].mDataByteSize;
116 void SetBytes(UInt32 nBytes,
void *data)
118 VerifyNotTrashingOwnedBuffer();
119 XAssert(mNumberBuffers == 1);
120 mBuffers[0].mDataByteSize = nBytes;
121 mBuffers[0].mData = data;
124 void CopyAllFrom(CABufferList *srcbl, CABufferList *ptrbl)
133 ptrbl->VerifyNotTrashingOwnedBuffer();
134 UInt32 nBytes = srcbl->GetNumBytes();
135 AudioBuffer *mybuf = mBuffers, *srcbuf = srcbl->mBuffers,
136 *ptrbuf = ptrbl->mBuffers;
137 for (UInt32 i = mNumberBuffers; i--; ++mybuf, ++srcbuf, ++ptrbuf) {
138 memmove(mybuf->mData, srcbuf->mData, srcbuf->mDataByteSize);
139 ptrbuf->mData = mybuf->mData;
140 ptrbuf->mDataByteSize = srcbuf->mDataByteSize;
143 srcbl->BytesConsumed(nBytes);
146 void AppendFrom(CABufferList *blp, UInt32 nBytes)
148 VerifyNotTrashingOwnedBuffer();
149 AudioBuffer *mybuf = mBuffers, *srcbuf = blp->mBuffers;
150 for (UInt32 i = mNumberBuffers; i--; ++mybuf, ++srcbuf) {
151 XAssert(nBytes <= srcbuf->mDataByteSize);
152 memcpy((Byte *)mybuf->mData + mybuf->mDataByteSize, srcbuf->mData, nBytes);
153 mybuf->mDataByteSize += nBytes;
155 blp->BytesConsumed(nBytes);
158 void PadWithZeroes(UInt32 desiredBufferSize)
162 VerifyNotTrashingOwnedBuffer();
163 if (GetNumBytes() > desiredBufferSize)
return;
164 AudioBuffer *buf = mBuffers;
165 for (UInt32 i = mNumberBuffers; i--; ++buf) {
166 memset((Byte *)buf->mData + buf->mDataByteSize, 0, desiredBufferSize - buf->mDataByteSize);
167 buf->mDataByteSize = desiredBufferSize;
171 void SetToZeroes(UInt32 nBytes)
173 VerifyNotTrashingOwnedBuffer();
174 AudioBuffer *buf = mBuffers;
175 for (UInt32 i = mNumberBuffers; i--; ++buf) {
176 memset((Byte *)buf->mData, 0, nBytes);
177 buf->mDataByteSize = nBytes;
186 Boolean SameDataAs(
const CABufferList* anotherBufferList)
189 if (mNumberBuffers != anotherBufferList->mNumberBuffers)
return false;
191 for (UInt32 i = 0; i < mNumberBuffers; ++i) {
192 if (mBuffers[i].mData != anotherBufferList->mBuffers[i].mData)
return false;
197 void BytesConsumed(UInt32 nBytes)
200 VerifyNotTrashingOwnedBuffer();
201 AudioBuffer *buf = mBuffers;
202 for (UInt32 i = mNumberBuffers; i--; ++buf) {
203 XAssert(nBytes <= buf->mDataByteSize);
204 buf->mData = (Byte *)buf->mData + nBytes;
205 buf->mDataByteSize -= nBytes;
209 void SetFrom(
const AudioBufferList *abl)
211 VerifyNotTrashingOwnedBuffer();
212 memcpy(&_GetBufferList(), abl, (
char *)&abl->mBuffers[abl->mNumberBuffers] - (
char *)abl);
215 void SetFrom(
const CABufferList *blp)
217 SetFrom(&blp->GetBufferList());
220 void SetFrom(
const AudioBufferList *abl, UInt32 nBytes)
222 VerifyNotTrashingOwnedBuffer();
223 AudioBuffer *mybuf = mBuffers;
224 const AudioBuffer *srcbuf = abl->mBuffers;
225 for (UInt32 i = mNumberBuffers; i--; ++mybuf, ++srcbuf) {
226 mybuf->mNumberChannels = srcbuf->mNumberChannels;
227 mybuf->mDataByteSize = nBytes;
228 mybuf->mData = srcbuf->mData;
232 void SetFrom(
const CABufferList *blp, UInt32 nBytes)
234 SetFrom(&blp->GetBufferList(), nBytes);
237 AudioBufferList * ToAudioBufferList(AudioBufferList *abl)
const
239 memcpy(abl, &GetBufferList(), (
char *)&abl->mBuffers[mNumberBuffers] - (
char *)abl);
243 void AllocateBuffers(UInt32 nBytes);
244 void AllocateBuffersAndCopyFrom(UInt32 nBytes, CABufferList *inCopyFromList, CABufferList *inSetPtrList);
246 void DeallocateBuffers();
248 void UseExternalBuffer(Byte *ptr, UInt32 nBytes);
250 void AdvanceBufferPointers(UInt32 nBytes)
255 VerifyNotTrashingOwnedBuffer();
256 AudioBuffer *buf = mBuffers;
257 for (UInt32 i = mNumberBuffers; i--; ++buf) {
258 buf->mData = (Byte *)buf->mData + nBytes;
259 buf->mDataByteSize -= nBytes;
263 void SetNumBytes(UInt32 nBytes)
265 VerifyNotTrashingOwnedBuffer();
266 AudioBuffer *buf = mBuffers;
267 for (UInt32 i = mNumberBuffers; i--; ++buf)
268 buf->mDataByteSize = nBytes;
271 void Print(
const char *label=NULL,
int nframes=0,
int wordSize=0)
const
275 printf(
"%s - ", label);
276 CAShowAudioBufferList(&GetBufferList(), nframes, wordSize);
278 printf(
" owned memory @ 0x%p:\n", mBufferMemory);
282 AudioBufferList & _GetBufferList() {
return *(AudioBufferList *)&mNumberBuffers; }
284 void VerifyNotTrashingOwnedBuffer()
288 XAssert(mBufferMemory == NULL);
292 Byte * mBufferMemory;
294 UInt32 mNumberBuffers;
295 AudioBuffer mBuffers[1];
298 #endif // __CABufferList_h__