43 inline bool HasGoodBufferPointers(
const AudioBufferList &abl, UInt32 nBytes)
45 const AudioBuffer *buf = abl.mBuffers;
46 for (UInt32 i = abl.mNumberBuffers; i--;++buf) {
47 if (buf->mData == NULL || buf->mDataByteSize < nBytes)
58 AUInputElement::AUInputElement(AUBase *audioUnit) :
59 AUIOElement(audioUnit),
68 void AUInputElement::SetConnection(
const AudioUnitConnection &conn)
70 if (conn.sourceAudioUnit == 0) {
75 mInputType = kFromConnection;
77 mConnRenderProc = NULL;
80 #if !CA_AU_IS_ONLY_PLUGIN
81 UInt32 size =
sizeof(AudioUnitRenderProc);
82 OSStatus result = AudioUnitGetProperty( conn.sourceAudioUnit,
83 kAudioUnitProperty_FastDispatch,
84 kAudioUnitScope_Global,
85 kAudioUnitRenderSelect,
89 mConnInstanceStorage = GetComponentInstanceStorage (conn.sourceAudioUnit);
91 mConnRenderProc = NULL;
92 #else // !TARGET_OS_IPHONE
93 mConnInstanceStorage = NULL;
94 mConnRenderProc = NULL;
98 void AUInputElement::Disconnect()
100 mInputType = kNoInput;
101 mIOBuffer.Deallocate();
110 void AUInputElement::SetInputCallback(AURenderCallback proc,
void *refCon)
115 mInputType = kFromCallback;
117 mInputProcRefCon = refCon;
122 OSStatus AUInputElement::SetStreamFormat(
const CAStreamBasicDescription &fmt)
124 OSStatus err = AUIOElement::SetStreamFormat(fmt);
125 if (err == AUBase::noErr)
130 OSStatus AUInputElement::PullInput( AudioUnitRenderActionFlags & ioActionFlags,
131 const AudioTimeStamp & inTimeStamp,
132 AudioUnitElement inElement,
136 return kAudioUnitErr_NoConnection;
138 AudioBufferList *pullBuffer;
140 if (HasConnection() || !WillAllocateBuffer())
141 pullBuffer = &mIOBuffer.PrepareNullBuffer(mStreamFormat, nFrames);
143 pullBuffer = &mIOBuffer.PrepareBuffer(mStreamFormat, nFrames);
145 return PullInputWithBufferList (ioActionFlags, inTimeStamp, inElement, nFrames, pullBuffer);