Initial release

This commit is contained in:
civ
2026-08-16 18:24:52 +07:00
commit 876886a39a
13244 changed files with 2353959 additions and 0 deletions
@@ -0,0 +1,150 @@
//-----------------------------------------------------------------------------
// Project : VST SDK
//
// Category : Helpers
// Filename : public.sdk/source/vst/interappaudio/AudioIO.h
// Created by : Steinberg, 08/2013.
// Description : VST 3 InterAppAudio
// Flags : clang-format SMTGSequencer
//
//-----------------------------------------------------------------------------
// This file is part of a Steinberg SDK. It is subject to the license terms
// in the LICENSE file found in the top-level directory of this distribution
// and at www.steinberg.net/sdklicenses.
// No part of the SDK, including this file, may be copied, modified, propagated,
// or distributed except according to the terms contained in the LICENSE file.
//-----------------------------------------------------------------------------
#pragma once
/// \cond ignore
#include "pluginterfaces/base/funknown.h"
#include "pluginterfaces/vst/vsttypes.h"
#include <AudioToolbox/AudioToolbox.h>
#include <AudioUnit/AUComponent.h>
#include <vector>
#ifndef __OBJC__
struct UIImage;
struct NSString;
#endif
namespace Steinberg {
namespace Vst {
namespace InterAppAudio {
class AudioIO;
//------------------------------------------------------------------------
class IMidiProcessor
{
public:
virtual void onMIDIEvent (UInt32 status, UInt32 data1, UInt32 data2, UInt32 sampleOffset,
bool withinRealtimeThread) = 0;
};
//------------------------------------------------------------------------
class IAudioIOProcessor : public IMidiProcessor
{
public:
virtual void willStartAudio (AudioIO* audioIO) = 0;
virtual void didStopAudio (AudioIO* audioIO) = 0;
virtual void process (const AudioTimeStamp* timeStamp, UInt32 busNumber, UInt32 numFrames,
AudioBufferList* ioData, bool& outputIsSilence, AudioIO* audioIO) = 0;
};
//------------------------------------------------------------------------
class AudioIO
{
public:
static AudioIO* instance ();
tresult init (OSType type, OSType subType, OSType manufacturer, CFStringRef name);
bool switchToHost ();
bool sendRemoteControlEvent (AudioUnitRemoteControlEvent event);
UIImage* getHostIcon ();
tresult start ();
tresult stop ();
tresult addProcessor (IAudioIOProcessor* processor);
tresult removeProcessor (IAudioIOProcessor* processor);
// accessors
AudioUnit getRemoteIO () const { return remoteIO; }
SampleRate getSampleRate () const { return sampleRate; }
bool getInterAppAudioConnected () const { return interAppAudioConnected; }
// host context information
bool getBeatAndTempo (Float64& beat, Float64& tempo);
bool getMusicalTimeLocation (UInt32& deltaSampleOffset, Float32& timeSigNumerator,
UInt32& timeSigDenominator, Float64& downBeat);
bool getTransportState (Boolean& isPlaying, Boolean& isRecording,
Boolean& transportStateChanged, Float64& sampleInTimeLine,
Boolean& isCycling, Float64& cycleStartBeat, Float64& cycleEndBeat);
void setStaticFallbackTempo (Float64 tempo) { staticTempo = tempo; }
Float64 getStaticFallbackTempo () const { return staticTempo; }
static NSString* kConnectionStateChange;
//------------------------------------------------------------------------
protected:
AudioIO ();
~AudioIO ();
static OSStatus inputCallbackStatic (void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber,
UInt32 inNumberFrames, AudioBufferList* ioData);
static OSStatus renderCallbackStatic (void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber,
UInt32 inNumberFrames, AudioBufferList* ioData);
static void propertyChangeStatic (void* inRefCon, AudioUnit inUnit, AudioUnitPropertyID inID,
AudioUnitScope inScope, AudioUnitElement inElement);
static void midiEventCallbackStatic (void* inRefCon, UInt32 inStatus, UInt32 inData1,
UInt32 inData2, UInt32 inOffsetSampleFrame);
OSStatus inputCallback (AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber,
UInt32 inNumberFrames, AudioBufferList* ioData);
OSStatus renderCallback (AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber,
UInt32 inNumberFrames, AudioBufferList* ioData);
void midiEventCallback (UInt32 inStatus, UInt32 inData1, UInt32 inData2,
UInt32 inOffsetSampleFrame);
void remoteIOPropertyChanged (AudioUnitPropertyID inID, AudioUnitScope inScope,
AudioUnitElement inElement);
void setAudioSessionActive (bool state);
tresult setupRemoteIO (OSType type);
tresult setupAUGraph (OSType type);
void updateInterAppAudioConnectionState ();
AudioUnit remoteIO {nullptr};
AUGraph graph {nullptr};
AudioBufferList* ioBufferList {nullptr};
HostCallbackInfo hostCallback {};
UInt32 maxFrames {4096};
Float64 staticTempo {120.};
SampleRate sampleRate;
bool interAppAudioConnected {false};
std::vector<IAudioIOProcessor*> audioProcessors;
enum InternalState
{
kUninitialized,
kInitialized,
kStarted,
};
InternalState internalState {kUninitialized};
};
//------------------------------------------------------------------------
} // namespace InterAppAudio
} // namespace Vst
} // namespace Steinberg
/// \endcond