Is it valid to add an iOS config to a VST?


#1

Hi, first attempts at converting a VST I have to iOS and am getting this when I add the iOS export:

// The following checks should cause a compile error if you’ve forgotten to
// define all your plugin settings properly…

#if ! (JucePlugin_Build_VST || JucePlugin_Build_VST3
|| JucePlugin_Build_AU || JucePlugin_Build_AUv3
||JucePlugin_Build_RTAS || JucePlugin_Build_AAX
|| JucePlugin_Build_Standalone || JucePlugin_Build_LV2)
#error “You need to enable at least one plugin format!”
#endif

Is it valid to add this target to a VST or should I be starting off with an audio application?

thx


#2

@leehu you need to provide more details and context.

If you’ve used JUCE in the first place and just wanna have App of your plug-in as an iOS App. with AUv3 ticketed and iOS Target from Projucer you should get it up and running pretty quickly.


#3

Ok, thx. I have an existing VST which works and runs fine.

I now want to to this into an app I can run on an iPad. So I added an iOS export target. I then opened and built this and got the above assertion.

So, from what you are saying, I need to build the AUv3 as well as the VST…?


#4

Hi, I’ve added the AUv3 target and have progressed further, but get these few unresolveds at the link stage:
OBJC_CLASS_NSAppleScript", referenced from: objc-class-ref in libMIDISynthLib.a(juce_core.o) "_OBJC_CLASS__NSWorkspace”, referenced from:
objc-class-ref in libMIDISynthLib.a(juce_core.o)
"_NSApp", referenced from:
juce::Process::isForegroundProcess() in libMIDISynthLib.a(juce_core.o)
juce::Process::makeForegroundProcess() in libMIDISynthLib.a(juce_core.o)
juce::Process::hide() in libMIDISynthLib.a(juce_core.o)
"_CreateTextEncoding", referenced from:
juce::String::convertToPrecomposedUnicode() const in libMIDISynthLib.a(juce_core.o)
"_CreateUnicodeToTextInfo", referenced from:
juce::String::convertToPrecomposedUnicode() const in libMIDISynthLib.a(juce_core.o)
"_ConvertFromUnicodeToText", referenced from:
juce::String::convertToPrecomposedUnicode() const in libMIDISynthLib.a(juce_core.o)
"_DisposeUnicodeToTextInfo", referenced from:
juce::String::convertToPrecomposedUnicode() const in libMIDISynthLib.a(juce_core.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)


#5

Ok, that was my build error - was linking in the OSX library rather than the iOS one, so looks like I have a build now - thanks for the pointer!


#6

One last question, does this build an App to run on the iPad or an AU to be hosted inside other Apps?


#7

@leehu this builds AUv3 which is an App that is also capable of running within hosts.
So you’ll have a standalone app and also it will be available with AUv3 supported hosts*.

One side note, this limits your iOS targets and as far as I remember will be supported only on modern iOS devices. (for example my iPad 2 doesn’t support AUv3 even though latest iOS 9.x DID support AUv3).


#8

Hi, ok, thanks… I was wondering about the standalone as when I run up the simulator I cant see an app there…


#9

maybe I’m missing a step to install the app…? Can’t seem to find any tutorials on building iOS apps with Juce


#10

I’ve just quickly created an audio application (rather than plugin) and built this for iOS and it shows up on the simulator straight away, so it looks like it’s something to do with building the AUv3 which isn’t showing up as an app…


#11

For AUv3, you need to also enable the “Standalone Plug-In” target - otherwise there is no way to deploy your AUv3.


#12

brilliant - got it, thanks…

wow, very impressive…!

are there any APIs I can call to determine what kind of device I’m running on or would I just use Desktop to get dimensions etc.??


#13

It appears as though I need to call reset() on the MIDIMessageCollector object in order to process incoming MIDI - where do I get access to this?

// you need to call reset() to set the correct sample rate before using this object
jassert (sampleRate != 44100.0001);

#14

Adding the AUv3 target requires me to change the OSX version for building the VST to 10.11 - won’t this restrict me from delivering to 10.8-10.10 users or does this not affect VST?


#15

I’m also getting lots of these warning since adding the AUv3 and standalone targets:
ld: warning: direct access in function ‘juce::LeakedObjectDetector<juce::OwnedArray<Preset, juce::DummyCriticalSection> >::getCounter()’ from file ‘/Users/lee/Development/cpp/JUCE/Projects/MIDISynth-Circuit/Builds/MacOSX/build/Debug/libMIDISynth-Circuit.a(PluginProcessor.o)’ to global weak symbol ‘juce::LeakedObjectDetector<juce::OwnedArray<Preset, juce::DummyCriticalSection> >::getCounter()::counter’ from file ‘/Users/lee/Development/cpp/JUCE/Projects/MIDISynthLib/Builds/MacOSX/build/Debug/libMIDISynthLib.a(AudioProcessor_Base.o)’ means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings.


#16

Thanks for pointing this out. I’ve now added code to the Projucer so that it will always compile the AUv3 target (and only the AUv3 target) with at least the 10.11 SDK (or newer if you selected something newer in the Projucer). The other targets (VST, VST3, …) will remain unaffected and compile with the deployment target selected in the Projucer. You will need to re-build the Projucer for this to work.

If your are targeting an older OS X version (for example 10.6) you’ll also need to be sure that the C++ library is the GNU C++ library:


#17

great, thanks, will give it a go


Standalone plugin assertion fails
#18

I think this might have been missed (I did post a few questions at the same time) - any thoughts on this when adding the standalone target? I can’t see an obvious was for public access to the MIDIMessageCollector instance… thx


#19

Which MIDIMessageCollector is this? Is this an instance you created? The “audio plugin demo” - which uses midi input - works fine iOS.


#20

Hi, no - its an instance that’s being created by the AudioProcessorPlayer instance that’s in the StandalonePluginHolder. Just not sure how to get at this from inside my plugin…?