VST3PluginTestHost and ITransportControl

In the release notes for SDK 3.8.1 there is this section:

VST3PluginTestHost v3.11.0:

I installed, SDK 3.8.1, as well as VST3PluginTestHost (and confirmed it is 3.11.0)

I am following the example you provided about how to get the transport control

    Vst::ITransportControl* transportControl = nullptr;
    hostContext->queryInterface (Vst::ITransportControl::iid, (void**)&transportControl);

I am calling this code in my controller (which inherits from Steinberg::Vst::EditController) in the tresult PLUGIN_API initialize(FUnknown *context) override implementation.

When running in the VST3PluginTestHost, I am getting a nullptr after getting the interface which seems to indicate that VST3PluginTestHost does not implement it.

Am I doing something wrong?

Thanks

PS: I am on macOS

I wanted to follow up on this: I tested in on Windows as well, same code, same version of VST3PluginTestHost and it is the same.

Did you check the example? (vst3_public_sdk/samples/vst/transportcontrol at master · steinbergmedia/vst3_public_sdk · GitHub)

Yes I did. The only difference I can see is that I am not calling processContextRequirements.needTransportState() in the constructor of my processor. I added it in my code with the exact same outcome (unclear if it is required or not TBH).

That being said, I just ran an experiment and compiled the transport-example on my machine:

> cmake /Volumes/Vault/Applications/Steinberg/VST_SDK.3810/vst3sdk -G Xcode
> cmake --build . --target transport-control

I then open VST3PluginTestHost and no single button responds do anything.

I then modified the source of the example, like this (added 2 print statements):

	if (UTF8StringView (name) == "TransportController")
	{
        printf("TransportController\n");

		Vst::ITransportControl* transportControl = nullptr;
		hostContext->queryInterface (Vst::ITransportControl::iid, (void**)&transportControl);

        printf("TransportController, transportControl=%p\n", transportControl);

		auto* controller = new Vst::UITransportController (transportControl);
		if (transportControl)
			transportControl->release ();
		return controller;
	}

I then stop VST3PluginTestHost, restart it and here is the output (I am starting the tool from the command line to get the output):

TransportController
TransportController, transportControl=0x0

which proves that I am getting nullptr in the built-in example with the provided VST3PluginTestHost

In the following screenshot, you can see that the playback is “On” as shown by the green icon and the “Playback On” section in the plugin. Clicking the “Playback Stop” button in the plugin does nothing.


This is a bug in VST3PluginTestHost, in Release mode this interface is not added to the hostcontext… sorry for this…

You could try Cubase 15.0.30 or Wavelab 13 which support this new VST3 API.

We will fix this in VST3PluginTesthost in the next update.

I am glad I am not doing anything wrong. Unfortunately I do not own any of these programs so I will just wait for the fix.

Just to confirm, is processContextRequirements.needTransportState() required to have the interface exposed working or is it unrelated?

unrelated… this ( processContextRequirements.needTransportState()) is only for requesting information contained in the processContext pass at each process call.