Files
2026-08-16 18:24:52 +07:00

194 lines
6.1 KiB
Plaintext

//-----------------------------------------------------------------------------
// Project : VST SDK
//
// Category : Helpers
// Filename : public.sdk/source/vst/interappaudio/VSTInterAppAudioAppDelegateBase.mm
// 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.
//-----------------------------------------------------------------------------
#import "VSTInterAppAudioAppDelegateBase.h"
#import "public.sdk/source/vst/interappaudio/AudioIO.h"
#import "public.sdk/source/vst/interappaudio/HostApp.h"
#import "public.sdk/source/vst/interappaudio/MidiIO.h"
#import "public.sdk/source/vst/interappaudio/VST3Editor.h"
#import "public.sdk/source/vst/interappaudio/VST3Plugin.h"
using namespace Steinberg::Vst::InterAppAudio;
//------------------------------------------------------------------------
static OSType fourCharCodeToOSType (NSString* inCode)
{
OSType rval = 0;
NSData* data = [inCode dataUsingEncoding:NSMacOSRomanStringEncoding];
[data getBytes:&rval length:sizeof (rval)];
HTONL (rval);
return rval;
}
//------------------------------------------------------------------------
@interface VSTInterAppAudioAppDelegateBase ()
//------------------------------------------------------------------------
{
VST3Plugin plugin;
VST3Editor editor;
BOOL audioIOInitialized;
}
@end
//------------------------------------------------------------------------
@implementation VSTInterAppAudioAppDelegateBase
//------------------------------------------------------------------------
//------------------------------------------------------------------------
- (BOOL)initAudioIO
{
id auArray = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"AudioComponents"];
if (auArray)
{
id desc = [auArray objectAtIndex:0];
if (desc)
{
NSString* typeStr = [desc objectForKey:@"type"];
NSString* subtypeStr = [desc objectForKey:@"subtype"];
NSString* manufacturerStr = [desc objectForKey:@"manufacturer"];
NSString* nameStr = [desc objectForKey:@"name"];
if (typeStr && subtypeStr && manufacturerStr && nameStr)
{
OSType type = fourCharCodeToOSType (typeStr);
OSType subtype = fourCharCodeToOSType (subtypeStr);
OSType manufacturer = fourCharCodeToOSType (manufacturerStr);
AudioIO* audioIO = AudioIO::instance ();
if (audioIO->init (type, subtype, manufacturer, (__bridge CFStringRef)nameStr) ==
Steinberg::kResultTrue)
{
if (plugin.init ())
{
InterAppAudioHostApp::instance ()->setPlugin (&plugin);
audioIO->addProcessor (&plugin);
audioIOInitialized = YES;
return YES;
}
}
}
}
}
return NO;
}
//------------------------------------------------------------------------
- (BOOL)createUI
{
if (audioIOInitialized)
{
[UIApplication sharedApplication].statusBarHidden = YES;
self.window = [UIWindow new];
self.window.backgroundColor = [UIColor redColor];
CGRect screenSize = self.window.bounds;
if (editor.init (screenSize))
{
self.window.rootViewController = editor.getViewController ();
[self.window makeKeyAndVisible];
if (editor.attach (plugin.getEditController ()) == false)
{
return NO;
}
}
return YES;
}
return NO;
}
//------------------------------------------------------------------------
- (void)savePluginState:(NSCoder*)coder
{
NSData* processorState = plugin.getProcessorState ();
NSData* controllerState = plugin.getControllerState ();
if (processorState)
[coder encodeObject:processorState forKey:@"VST3ProcessorState"];
if (controllerState)
[coder encodeObject:controllerState forKey:@"VST3ControllerState"];
}
//------------------------------------------------------------------------
- (void)restorePluginState:(NSCoder*)coder
{
NSData* processorState = [coder decodeObjectForKey:@"VST3ProcessorState"];
if (processorState)
{
plugin.setProcessorState (processorState);
}
NSData* controllerState = [coder decodeObjectForKey:@"VST3ControllerState"];
if (controllerState)
{
plugin.setControllerState (controllerState);
}
}
//------------------------------------------------------------------------
// UIApplicationDelegate methods
//------------------------------------------------------------------------
- (BOOL)application:(UIApplication*)application
willFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
return [self initAudioIO];
}
//------------------------------------------------------------------------
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
BOOL result = [self createUI];
if (result)
{
AudioIO::instance ()->start ();
}
return result;
}
//------------------------------------------------------------------------
- (BOOL)application:(UIApplication*)application shouldSaveApplicationState:(NSCoder*)coder
{
[self savePluginState:coder];
[coder encodeBool:MidiIO::instance ().isEnabled () forKey:@"MIDI Enabled"];
return YES;
}
//------------------------------------------------------------------------
- (BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder*)coder
{
[self restorePluginState:coder];
BOOL midiEnabled = [coder decodeBoolForKey:@"MIDI Enabled"];
MidiIO::instance ().setEnabled (midiEnabled);
return YES;
}
//------------------------------------------------------------------------
- (void)applicationDidBecomeActive:(UIApplication*)application
{
AudioIO* audioIO = AudioIO::instance ();
audioIO->start ();
}
//------------------------------------------------------------------------
- (void)applicationWillResignActive:(UIApplication*)application
{
AudioIO* audioIO = AudioIO::instance ();
if (audioIO->getInterAppAudioConnected () == false && MidiIO::instance ().isEnabled () == false)
{
audioIO->stop ();
}
}
@end