RE: Audio Units - newbie questions
RE: Audio Units - newbie questions
- Subject: RE: Audio Units - newbie questions
- From: "Muon Software Ltd - Dave" <email@hidden>
- Date: Wed, 12 Oct 2005 11:57:39 +0100
- Importance: Normal
Olivier - that looks startlingly similar to my current code - the code which
Bill says won't work :-)
ComponentResult CMuonTachyon::Render( AudioUnitRenderActionFlags
&ioActionFlags,
const AudioTimeStamp &inTimeStamp,
UInt32 nFrames )
{
ComponentResult result = noErr;
//prepare the output busses
int nNumBusses=Outputs().GetNumberOfElements();
int i=0;
for (i=0;i<nNumBusses;i++)
{
GetOutput(i)->PrepareBuffer(nFrames);
}
if (nFrames>(UInt32)m_nBlockSize)
{
//is this likely to happen?
m_nBlockSize=(int)GetMaxFramesPerSlice();
getLock();
m_ptrSynth->reset((int)m_fSampleRate,m_nBlockSize);
releaseLock();
}
//populate our list of buffers
if (nNumBusses==1)
{
//got a single output buss
AUOutputElement* ptrOutput = GetOutput(0);
AudioBufferList& bufferList = ptrOutput->GetBufferList();
//find out how many buffers this bus contains
UInt32 nBuffers=bufferList.mNumberBuffers;
if (nBuffers==1)
{
//bus contains a single (mono) buffer
memset((float*)bufferList.mBuffers[0].mData,0,nFrames*sizeof(float));
for (i=0;i<kNumOutputs;i++)
{
//use the same buffer pointer for all our outputs
m_ptrAudioBuffers[i]=(float*)bufferList.mBuffers[0].mData;
}
}
else if (nBuffers==2)
{
//bus is stereo
memset((float*)bufferList.mBuffers[0].mData,0,nFrames*sizeof(float));
memset((float*)bufferList.mBuffers[1].mData,0,nFrames*sizeof(float));
for (i=0;i<kNumOutputs;i+=2)
{
//use the pair of buffer pointers for all our buffers
m_ptrAudioBuffers[i]=(float*)bufferList.mBuffers[0].mData;
m_ptrAudioBuffers[i+1]=(float*)bufferList.mBuffers[1].mData;
}
}
else
{
return kAudioUnitErr_FormatNotSupported;
}
}
else if (nNumBusses==kNumOutputs/2)
{
//looks like we have multiple output busses
int nOutputIndex=0;
for (i=0;i<nNumBusses;i++)
{
AUOutputElement* ptrOutput = GetOutput(i);
AudioBufferList& bufferList = ptrOutput->GetBufferList();
//find out how many buffers this bus contains
UInt32 nBuffers=bufferList.mNumberBuffers;
if (nBuffers==1)
{
//bus contains a single (mono) buffer
memset((float*)bufferList.mBuffers[0].mData,0,nFrames*sizeof(float));
m_ptrAudioBuffers[nOutputIndex]=(float*)bufferList.mBuffers[0].mData;
m_ptrAudioBuffers[nOutputIndex+1]=(float*)bufferList.mBuffers[0].mData;
nOutputIndex+=2;
}
else if (nBuffers==2)
{
//bus is stereo
memset((float*)bufferList.mBuffers[0].mData,0,nFrames*sizeof(float));
memset((float*)bufferList.mBuffers[1].mData,0,nFrames*sizeof(float));
m_ptrAudioBuffers[nOutputIndex]=(float*)bufferList.mBuffers[0].mData;
m_ptrAudioBuffers[nOutputIndex+1]=(float*)bufferList.mBuffers[1].mData;
nOutputIndex+=2;
}
else
{
return kAudioUnitErr_FormatNotSupported;
}
}
}
else
{
//this configuration isn't supported
result = kAudioUnitErr_FormatNotSupported;
}
if (result==noErr)
{
if (m_bInitialised==false || m_ptrSynth->queryState()==false)
{
//accumulating mode...
m_ptrSynth->generate_empty(false,(int)nFrames, m_ptrAudioBuffers);
}
else
{
getLock();
updateTempo();
//accumulating mode...
m_ptrSynth->generate_synth(false, (int)nFrames, m_ptrAudioBuffers);
//update the editor with any MIDI-driven parameter changes
processParameterChanges();
releaseLock();
}
}
return result;
};
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden