A few people have needed help disabling the pop-up banner “Audio input is muted by default”:
Hi,
I’m writing a JUCE plugin which can also be deployed to standalone app. The plugin is in fact just a MIDI controller for a synthesiser (it just sends MIDI OUT), but I want to have it as an audio plugin so it can be added in audio processing chains (i.e. in next to the “external input” of a Live device). I’ve seen this kind of plugins by other companies work in this way. The fact is that I want to remove the “Audio input is muted” that shows by default as there’s no need for that in my case.…
Standalone Plugins mute input by default to avoid feedback loop. Does anyone know how to disable this safety system?
The mute/unmute state is saved and restored on Windows and Mac. However, it does not work like that on iOS.
I need help enabling the default mute, which has disappeared for some reason.
I have been looking extensively at juce_StandaloneFilterWindow.h, specifically the SettingsComponent
constructor, the showAudioSettingsDialog
, and the saveAudioDeviceState
/reloadAudioDeviceState
methods.
What is very strange is this check
bool getProcessorHasPotentialFeedbackLoop() const { return processorHasPotentialFeedbackLoop; }
returns a bool which is a const true
// avoid feedback loop by default
bool processorHasPotentialFeedbackLoop = true;
yet, this block of code:
if (owner.getProcessorHasPotentialFeedbackLoop())
{
addAndMakeVisible (shouldMuteButton);
addAndMakeVisible (shouldMuteLabel);
shouldMuteLabel.attachToComponent (&shouldMuteButton, true);
}
is getting “false” for the potential feedback loop:
What is going on here?
thanks!
edit: Even when I disable the if check and just insist that the shouldMutebutton and shouldMuteLabel are added, they still do not appear.
I tried this to force the mute:
SmplcompAudioProcessor::SmplcompAudioProcessor()
: AudioProcessor(), parameters(*this, nullptr, "PARAMETERS", createParameterLayout())
{
if (juce::JUCEApplicationBase::isStandaloneApp())
{
if (auto* pluginHolder = juce::StandalonePluginHolder::getInstance())
{
pluginHolder->getMuteInputValue().setValue(false);
}
}
but it didn’t have any effect, iirc, pluginHolder was not yet fully initialized at this point during the processor’s construction.
In the end, setting this parameter was the culprit:
Having {0, 0} as a channel configuration prevents creation of the mute button and label. Solved!