Standalone plugin does not receive audio input macOS

Hi

I am trying to build a standalone app for my plugin solely for debug purposes. I do not receive audio input from my audio device. The system is: macOS Mojave 10.14.5 (18F132).

I have created the plugin via Projucer, with the “Standalone” plugin format selected. I’m currently just using the bare-bones Application that was auto generated. I have clicked the button where it says that audio input is muted to avoid feedback, and unchecked the “mute audio input button”. In the panel, no matter which input channels I choose, the meter next to the input selector (where audio interface is selected) shows no incoming audio. Of course the correct interface is selected.

The plugin’s processBlock is called, but with all samples equal to zero. It works in the AudioPlugInHost project, and also loading the plugin in a DAW reveals that it receives audio. It’s only in the Standalone target in the Plugin project it doesn’t work.

I have a feeling this is an issue with access to the microphone, because in my system preferences I see now that the DemoRunner and AudioPluginHost applications are given access to the microphone, but not my standalone app.

Unfortunately I can not use the AudioPluginHost for debugging, because the plugin requires the transport to move, while the AudioPluginHost provides no transport. Therefore I have to tweak my standalone app to provide a moving transport (I believe it’s less complicated than the AudioPluginHost), but currently, before tweaking, the plugin receives no audio at all.

Update: I have now tried to enable code signing and App Sandbox with access to microphone via the Capabilities panel, to no avail.

I have confirmed that StandalonePluginHolder::audioDeviceIOCallback, all the way down to CoreAudioClasses::CoreAudioInternal::audioIOProc gets called with all samples equal to zero.

Uh… ok. I figured it out. In order for the application to ask permission to use the microphone, you need to tell macOS what to tell the user about mic usage. This has to be set in Info-Standalone_Plugin.plist, under Resources. A key must be added, Privacy - Microphone Usage Description, with the text describing to the user what the microphone is used for.

Sorry for spamming…

There’s a setting for enabling this in the Projucer so you don’t need to edit the plist each time you re-save - just set the “Microphone Access” setting to enabled in the Xcode exporter.

Thank you! Maybe this should be on by default? However, it’s possible this happened because I first created the Xcode project without a standalone target, then went back to Projucer to enable the standalone plugin format and re-save.

I constructed a simpler example that is a mashup of the plugin template project generated by the Projucer v5.4.3.

It only works in some cases:

  • AU on macOS
  • AUv3 on iOS

But does NOT work in these cases:

  • standalone on macOS
  • AUv3 on macOS
  • Standalone on iOS

For the full story and the source code please see the attachment or get it here from dropbox:

MicPluginTest.zip (13.4 KB)

Thanks to some help from Eyal Amir I think there’s a fix for this - the solution is to not do the mic recording from the audio device directly - but rather take the input in the processBlock function - then wire up the recorder there. We were able to get mic input on the mac in the standalone case on the mac, but I haven’t checked the other cases. When I get a better example I will repost it.