41 #ifndef __AUInputFormatConverter_h__
42 #define __AUInputFormatConverter_h__
44 #include "FormatConverterClient.h"
45 #include "AUTimestampGenerator.h"
53 class AUInputFormatConverter :
public FormatConverterClient {
56 AUInputFormatConverter(AUBase *hostAU,
int inputBus) :
59 mPreviousSilentFrames(0x1000)
62 mTimestampGenerator.mVerbosity = 0;
63 strcpy(mTimestampGenerator.mDebugName,
"AUConverter");
70 ~AUInputFormatConverter()
74 virtual OSStatus Initialize(
const AudioStreamBasicDescription &src,
const AudioStreamBasicDescription &dest)
76 OSStatus err = FormatConverterClient::Initialize(src, dest);
78 mIsPCMToPCM = (src.mFormatID == kAudioFormatLinearPCM) && (dest.mFormatID == kAudioFormatLinearPCM);
79 mHasSRC = (fnonzero(src.mSampleRate) && fnonzero(dest.mSampleRate) && fnotequal(src.mSampleRate, dest.mSampleRate));
83 virtual OSStatus Reset()
85 mPreviousSilentFrames = 0x1000;
86 mTimestampGenerator.Reset();
87 return FormatConverterClient::Reset();
90 void SetStartInputTimeAtZero(
bool b)
92 mTimestampGenerator.SetStartInputAtZero(b);
96 OSStatus AUFillComplexBuffer(
const AudioTimeStamp & inTimeStamp,
97 UInt32 & ioOutputDataPacketSize,
98 AudioBufferList & outOutputData,
99 AudioStreamPacketDescription* outPacketDescription,
102 mTimestampGenerator.AddOutputTime(inTimeStamp, ioOutputDataPacketSize, mOutputFormat.mSampleRate);
103 mSilentOutput =
true;
104 OSStatus err = FillComplexBuffer(ioOutputDataPacketSize, outOutputData, outPacketDescription);
106 if (!mIsPCMToPCM || (mHasSRC && mPreviousSilentFrames < 32))
107 mSilentOutput =
false;
108 mPreviousSilentFrames += ioOutputDataPacketSize;
110 mPreviousSilentFrames = 0;
111 outSilence = mSilentOutput;
116 virtual OSStatus FormatConverterInputProc(
117 UInt32 & ioNumberDataPackets,
118 AudioBufferList & ioData,
119 AudioStreamPacketDescription** outDataPacketDescription)
121 OSStatus err = ca_noErr;
123 AudioUnitRenderActionFlags actionFlags = 0;
124 AUInputElement *input = mHost->GetInput(mHostBus);
125 *ioNumberDataPackets = std::min(*ioNumberDataPackets, This->mHost->GetMaxFramesPerSlice());
126 const AudioTimeStamp &inputTime = mTimestampGenerator.GenerateInputTime(ioNumberDataPackets, mInputFormat.mSampleRate);
127 err = input->PullInput(actionFlags, inputTime, mHostBus, ioNumberDataPackets);
129 input->CopyBufferListTo(ioData);
130 if (!(actionFlags & kAudioUnitRenderAction_OutputIsSilence))
131 mSilentOutput =
false;
142 AUTimestampGenerator mTimestampGenerator;
146 UInt32 mPreviousSilentFrames;
149 #endif // __AUInputFormatConverter_h__