mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
91 lines
2.9 KiB
Objective-C
91 lines
2.9 KiB
Objective-C
/*!
|
|
@file AudioUnitSDK/AUInputElement.h
|
|
@copyright © 2000-2021 Apple Inc. All rights reserved.
|
|
*/
|
|
#ifndef AudioUnitSDK_AUInputElement_h
|
|
#define AudioUnitSDK_AUInputElement_h
|
|
|
|
#include <AudioUnitSDK/AUBuffer.h>
|
|
#include <AudioUnitSDK/AUScopeElement.h>
|
|
|
|
namespace ausdk {
|
|
|
|
/*!
|
|
@class AUInputElement
|
|
@brief Implements an audio unit input element, managing the source of input from a callback
|
|
or connection.
|
|
*/
|
|
class AUInputElement : public AUIOElement {
|
|
public:
|
|
using AUIOElement::AUIOElement;
|
|
|
|
// AUElement override
|
|
OSStatus SetStreamFormat(const AudioStreamBasicDescription& fmt) override;
|
|
[[nodiscard]] bool NeedsBufferSpace() const override { return IsCallback(); }
|
|
void SetConnection(const AudioUnitConnection& conn);
|
|
void SetInputCallback(AURenderCallback proc, void* refCon);
|
|
[[nodiscard]] bool IsActive() const noexcept { return mInputType != EInputType::NoInput; }
|
|
[[nodiscard]] bool IsCallback() const noexcept
|
|
{
|
|
return mInputType == EInputType::FromCallback;
|
|
}
|
|
[[nodiscard]] bool HasConnection() const noexcept
|
|
{
|
|
return mInputType == EInputType::FromConnection;
|
|
}
|
|
OSStatus PullInput(AudioUnitRenderActionFlags& ioActionFlags, const AudioTimeStamp& inTimeStamp,
|
|
AudioUnitElement inElement, UInt32 nFrames);
|
|
OSStatus PullInputWithBufferList(AudioUnitRenderActionFlags& ioActionFlags,
|
|
const AudioTimeStamp& inTimeStamp, AudioUnitElement inElement, UInt32 nFrames,
|
|
AudioBufferList& inBufferList);
|
|
|
|
protected:
|
|
void Disconnect();
|
|
|
|
private:
|
|
enum class EInputType { NoInput, FromConnection, FromCallback };
|
|
EInputType mInputType{ EInputType::NoInput };
|
|
|
|
// if from callback:
|
|
AURenderCallback mInputProc{ nullptr };
|
|
void* mInputProcRefCon{ nullptr };
|
|
|
|
// if from connection:
|
|
AudioUnitConnection mConnection{};
|
|
};
|
|
|
|
inline OSStatus AUInputElement::PullInputWithBufferList(AudioUnitRenderActionFlags& ioActionFlags,
|
|
const AudioTimeStamp& inTimeStamp, AudioUnitElement inElement, UInt32 nFrames,
|
|
AudioBufferList& inBufferList)
|
|
{
|
|
OSStatus theResult = noErr;
|
|
|
|
if (HasConnection()) {
|
|
// only support connections for V2 audio units
|
|
theResult = AudioUnitRender(mConnection.sourceAudioUnit, &ioActionFlags, &inTimeStamp,
|
|
mConnection.sourceOutputNumber, nFrames, &inBufferList);
|
|
} else {
|
|
// kFromCallback:
|
|
theResult = (mInputProc)(mInputProcRefCon, &ioActionFlags, &inTimeStamp, inElement, nFrames,
|
|
&inBufferList);
|
|
}
|
|
|
|
if (mInputType == EInputType::NoInput) { // defense: the guy upstream could have disconnected
|
|
// it's a horrible thing to do, but may happen!
|
|
return kAudioUnitErr_NoConnection;
|
|
}
|
|
|
|
#if !TARGET_OS_IPHONE || DEBUG
|
|
if (theResult == noErr) { // if there's already an error, there's no point (and maybe some harm)
|
|
// in validating.
|
|
if (ABL::IsBogusAudioBufferList(inBufferList) & 1) {
|
|
return kAudioUnitErr_InvalidPropertyValue;
|
|
}
|
|
}
|
|
#endif
|
|
return theResult;
|
|
}
|
|
|
|
} // namespace ausdk
|
|
|
|
#endif // AudioUnitSDK_AUInputElement_h
|