signal71 / symbiosis-au-vst

Automatically exported from code.google.com/p/symbiosis-au-vst
0 stars 0 forks source link

Support variable I/O count (at least on single bus plugs) #9

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
What steps will reproduce the problem?
Wrapping using any of the techniques.

What is the expected output? What do you see instead?
Expected wrapped plugins to support mono or stereo.
Plugins only support stereo tracks.

What version of the product are you using? On what operating system?
Latest, OSX 10.5.

Please provide any additional information below.
Tried the included example plugin and several others that support
mono and stereo in Cubase/Live, but in Logic and auval they only
support stereo operation.

Original issue reported on code.google.com by garyer...@googlemail.com on 5 Aug 2010 at 1:53

GoogleCodeExporter commented 8 years ago
[deleted comment]
GoogleCodeExporter commented 8 years ago
Well, mono only or stereo only should work, but judging from your PM on KvR I 
assume you mean supporting a combination. I'll post my answer here too and 
update the case status.

This is a problem with VST actually. VSTs have a fixed number of inputs and 
outputs. From time to time there have been attempts to allow changing the 
number of inputs / outputs from the VST host, but support never caught on. The 
usual solution is for the plug-in developer to offer two or more variations of 
the DLLs instead.

This is why the limitation exist in the Symbiosis wrapper too.

In AU world things are different, although far from clear or consistent, 
especially when it comes to supporting more than one output bus. For example, 
for effects, all input and output busses have to be the same format: either 
mono or stereo. You can't mix them. For example you can't have one mono plus 
one stereo in. Something you might prefer on a vocoder for instance. Funny 
though, for *instruments* mixed stereo and mono outputs *are* supported.

Anyhow, what you are requesting can be accomplished. A single bus effect can be 
set to allow mono or stereo, and the AU should get its 
"kAudioUnitProperty_StreamFormat" updated accordingly. If you want to hack 
Symbiosis, check the "kAudioUnitProperty_SupportedNumChannels" property (return 
a list of your supported channel layouts). Also, check "isIOPinConnected" 
around line 2950 ("FIX : only works without multiple buses"). You might be able 
to use the VST "isInputConnected" and "isOutputConnected" if you edit 
"isIOPinConnected" in Symbiosis, but you may have to do some more hacks than 
just un-commenting the lines there.

You should also know that a lot of AU stuff with busses and variable formats 
won't work in older hosts like Logic 7, but I'm not sure how big of an issue 
this is anymore. Anyhow, I'll keep the case open in Google Code to see if I can 
come up with a clean solution for supporting variable IO count without breaking 
compatibility with older hosts.

Concerning Cocoa. Naturally I want to support this (or actually I don't want to 
but need to). However, support for 64-bit and Cocoa in VST world on Mac (read: 
Cubase 64-bit) has to mature more before I commit to creating a stable solution.

Original comment by malstro...@gmail.com on 5 Aug 2010 at 8:10

GoogleCodeExporter commented 8 years ago
Thanks for your reply.
I'm not referring to combinations of mono and stereo though,just straight mono 
or stereo versions. Your included example for instance only reports supporting 
2,2 and can't be added to a mono track in Logic, I tried several other 
commercial vsts that work in either mono or stereo in Cubase/Live etc and they 
too appear as stereo only. I think as you said because 
kAudioUnitProperty_SupportedNumChannels does not return a list of 1,1 and 2,2 
rather it returns 1,1 or 2,2.

Original comment by garyer...@googlemail.com on 5 Aug 2010 at 8:32

GoogleCodeExporter commented 8 years ago
I just brought up the combination issue as an example of inconsistencies in AU. 
What I believe you do ask for is to support mono *and* stereo with the same 
plug-in binary, right?

If you change kInputCount and kOutputCount in Sinoplex.cpp to 1, Sinoplex 
should show up as mono only in Logic (if they are set to 2, Sinoplex should 
show up as stereo only). If you wrap other commercial vsts they are probably 
built as stereo plug-ins, so they will show up as stereo only.

I am not sure how Cubase works at the moment, but Ableton Live is agnostic 
about the input and output count (also with Audio Units!). You can use stereo 
or mono plug-ins on stereo or mono tracks in any combination. I think this is a 
good approach. It puts the user in charge and isn't restrictive, but it will 
mean a certain CPU loss as the host needs to mix / split the output before and 
after the plug-in. 

Most AU hosts (including Logic) don't work this way. The host will not 
automatically mix down stereo to mono just because the plug-in says it is mono. 
If the plug-in is written to take mono input, that is the only way you can use 
it. If it is written to take stereo input, that is the only way you can use it. 
*But* AU has this other facility that VST lacks. A single plug-in can specify 
that it should handle both mono / stereo (this is where 
kAudioUnitProperty_SupportedNumChannels comes in), but you still need to write 
code to support it.

The only way I could automatically support what you ask for in Symbiosis is to 
do what Ableton Live does, but inside Symbiosis instead. Mix and split stereo 
<-> mono and fake that we support any combination. However, if I did this it 
would be an optional feature as this isn't really Symbiosis issue to solve. 
Notice that a lot of VST hosts will have this same restriction as well. A mono 
plug-in will not be usable directly on a stereo track and vice versa.

Original comment by malstro...@gmail.com on 5 Aug 2010 at 9:34

GoogleCodeExporter commented 8 years ago
(To sum it up, if one goes to the bottom of it, it isn't really a Symbiosis or 
Audio Units issue, but actually an issue of how different *hosts* handle the 
situation of combining mono and stereo effects on the same signal path.)

Original comment by malstro...@gmail.com on 5 Aug 2010 at 9:37

GoogleCodeExporter commented 8 years ago
OK - thanks again. 
I guess anyone who doesn't want to distribute separate mono and stereo versions 
of their wrapped vst plugins will as you say have to dig around and modify 
Symbiosis to do so - Cytomic's "The Glue" seems to be an example of this.

Original comment by garyer...@googlemail.com on 5 Aug 2010 at 9:58

GoogleCodeExporter commented 8 years ago
Yes, The Glue is a good example. I actually have Andy's modifications lying 
around somewhere. I searched for it now on my laptop, but it wasn't here. It's 
probably on my office computer. I'll post it as soon as I find it. As I recall 
it was a small modification. Mainly adding code to 
kAudioUnitProperty_SupportedNumChannels and kAudioUnitProperty_StreamFormat.

I'll try to find time to make better support for all this in Symbiosis. I'm 
thinking adding a flag to SYConfig in .plist and supporting the VST calls 
isInputConnected/isOutputConnected. Perhaps I'll also set the audio buffer 
pointers to the same address when the plug-in is used in mono mode. This way it 
will be easy to detect in the VST code and adapt the dsp behavior accordingly.

Original comment by malstro...@gmail.com on 5 Aug 2010 at 11:27

GoogleCodeExporter commented 8 years ago
Can you please follow up on this with the mentioned code and it would be great 
if you find some solution also for surround setups like 1/2 -> 5.1 channels

Original comment by em...@stelkens.de on 20 Dec 2010 at 2:21

GoogleCodeExporter commented 8 years ago
"Perhaps I'll also set the audio buffer pointers to the same address when the 
plug-in is used in mono mode. This way it will be easy to detect in the VST 
code and adapt the dsp behavior accordingly."

This is how all of my plugins sense mono in VST, but I also implement 

bool vstplugin::setSpeakerArrangement (VstSpeakerArrangement* pluginInput, 
                                       VstSpeakerArrangement* pluginOutput) 
{ 
    setSpeaker = true;
    if (pluginInput->numChannels == 1 && pluginOutput->numChannels == 1)        
        channelMode = kMonoMode;

    if (pluginInput->numChannels == 2 && pluginOutput->numChannels == 2)        
        channelMode = kStereoMode;

    return true; 
} 

for Cubase (Cubase calls this function, but never sets the buffers to the same 
address, even when mono). The ability to switch from mono to stereo is 
important in my plugins, as they all are heavy CPU users.

Original comment by soundh...@gmail.com on 27 Feb 2011 at 6:18

GoogleCodeExporter commented 8 years ago
@em...@stelkens.de : sorry, didn't see this until now for some reason. Can't 
find Andy's code any more. I am going to work on good support for variable I/O 
asap. For one thing, I would like to use this for Bitspeek in the future.

@soundh...@gmail.com : thanks for the info! Good to know that the 
same-address-solution is used by other hosts. Speaking of Cubase, I have found 
that it is pretty lousy on mixing mono and stereo inserts on a mixer channel. 
For example, if you insert a mono effect on a stereo channel, it will only 
process the left channel.

Original comment by malstro...@gmail.com on 27 Feb 2011 at 8:22

GoogleCodeExporter commented 8 years ago
In 1.29b I made it possible to support both mono and stereo I/O. This is from 
the comment in Symbiosis.plist:

Set "CanDoMonoIO" to true if (any of) the plug-in input(s) and / or output(s) 
are in stereo and it makes sense to use them with mono signals as well. (The 
VST process() will then receive the same buffer pointer for left and right 
channels whenever the plug-in is used in a mono configuration.)

Original comment by malstro...@gmail.com on 30 Aug 2011 at 10:20