On Fri, Jul 4, 2008 at 12:04 PM, Mikael Hakman <email@hidden> wrote:
On Friday, July 04, 2008 5:41 AM, Glenn McCord wrote:
If I understand your code correctly then in your AudioInputProc, the
statement:
(*savedAudioBufferList) = (*inInputData);
copies contents of inInputData structure to savedAudioBufferList
structure,
both of which are of AudioBufferList type. AudioBufferList is defined as:
struct AudioBufferList {
UInt32 mNumberBuffers;
AudioBuffer mBuffers[kVariableLengthArray];
};
Constant kVariableLengthArray is defined as:
enum {
kVariableLengthArray = 1
};
This means that the copy operation copies entire inInputData->mBuffers[0]
including its mData member over to savedAudioBufferList. After copy,
savedAudioBufferList->mBuffers[0].mData will point to the same area as
inInputData->mBuffers[0].mData. Which means that nothing will be buffered
and your original in Start() allocated buffer area is lost. In your data
copy loop latter on, you "copy" the contents to itself. Your
AudioOutputProc
works therefore on the original data address passed to your
AudioInputProc
by your audio driver which at that time was returned to your driver and
probably is reused again for new samples.
Is making a copy of the inInputBuffer going to copy the AudioBuffer
array called inInputBuffer->mBuffers[0] or is it going to copy an
address?
Should I memcpy mBuffers[0] with:
memcpy(savedAudioBufferList->mBuffers, inInputBuffer->mBuffers,
sizeof(AudioBuffer)) ?
BTW, why do you use a loop and copy each sample separately? Why not use
memcpy and copy the whole shebang at once?
I was trying to use memcpy initially but for some reason I couldn't
get the application to work. I can't remember the details now, so
maybe it was some other code that was causing the grief.
I'm assuming I can only memcpy that void * mData array by itself and
not the AudioBufferList struct in its entirety.
memcpy( savedBuffer->mData, savedBuffer->mData,
inputBuffer->mDataByteSize);
My code is at work and I don't have a mac, so I can't test things until
Monday.