Add mic button to show when audio input is being used, and enable audio input if the audio device is changed

version-1-1
James H Ball 2025-01-10 16:51:11 +00:00
rodzic 04dab15870
commit a078bd3865
6 zmienionych plików z 69 dodań i 1 usunięć

Wyświetl plik

@ -24,9 +24,21 @@ SosciPluginEditor::SosciPluginEditor(SosciAudioProcessor& p) : CommonPluginEdito
resized();
visualiserFullScreen->addListener(this);
if (juce::JUCEApplication::isStandaloneApp()) {
juce::StandalonePluginHolder* standalone = juce::StandalonePluginHolder::getInstance();
juce::AudioDeviceManager& manager = standalone->deviceManager;
manager.addChangeListener(this);
currentInputDevice = getInputDeviceName();
}
}
SosciPluginEditor::~SosciPluginEditor() {
if (juce::JUCEApplication::isStandaloneApp()) {
juce::StandalonePluginHolder* standalone = juce::StandalonePluginHolder::getInstance();
juce::AudioDeviceManager& manager = standalone->deviceManager;
manager.removeChangeListener(this);
}
audioProcessor.visualiserParameters.visualiserFullScreen->removeListener(this);
menuBar.setModel(nullptr);
}
@ -98,3 +110,28 @@ void SosciPluginEditor::parameterValueChanged(int parameterIndex, float newValue
}
void SosciPluginEditor::parameterGestureChanged(int parameterIndex, bool gestureIsStarting) {}
void SosciPluginEditor::changeListenerCallback(juce::ChangeBroadcaster* source) {
if (juce::JUCEApplication::isStandaloneApp()) {
juce::String inputDevice = getInputDeviceName();
if (inputDevice != currentInputDevice) {
currentInputDevice = inputDevice;
// switch to getting audio from input if the user changes the input device
// because we assume they are debugging and want to hear the audio from mic
audioProcessor.stopAudioFile();
}
}
}
juce::String SosciPluginEditor::getInputDeviceName() {
if (juce::StandalonePluginHolder::getInstance() == nullptr) {
return "Unknown";
}
juce::StandalonePluginHolder* standalone = juce::StandalonePluginHolder::getInstance();
juce::AudioDeviceManager& manager = standalone->deviceManager;
auto device = manager.getCurrentAudioDevice();
auto deviceType = manager.getCurrentDeviceTypeObject();
int inputIndex = deviceType->getIndexOfDevice(device, true);
auto inputName = deviceType->getDeviceNames(true)[inputIndex];
return inputName;
}

Wyświetl plik

@ -9,7 +9,7 @@
#include "components/SosciMainMenuBarModel.h"
#include "components/SvgButton.h"
class SosciPluginEditor : public CommonPluginEditor, public juce::FileDragAndDropTarget, public juce::AudioProcessorParameter::Listener {
class SosciPluginEditor : public CommonPluginEditor, public juce::FileDragAndDropTarget, public juce::AudioProcessorParameter::Listener, public juce::ChangeListener {
public:
SosciPluginEditor(SosciAudioProcessor&);
~SosciPluginEditor() override;
@ -21,10 +21,15 @@ public:
void visualiserFullScreenChanged();
void parameterValueChanged(int parameterIndex, float newValue) override;
void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override;
void changeListenerCallback(juce::ChangeBroadcaster* source) override;
private:
SosciAudioProcessor& audioProcessor;
juce::String getInputDeviceName();
juce::String currentInputDevice;
ScrollableComponent visualiserSettingsWrapper = ScrollableComponent(visualiserSettings);
SosciMainMenuBarModel model{*this, audioProcessor};

Wyświetl plik

@ -109,6 +109,9 @@ void AudioPlayerComponent::setPaused(bool paused) {
void AudioPlayerComponent::parserChanged() {
setup();
repaint();
if (onParserChanged != nullptr) {
onParserChanged();
}
}
void AudioPlayerComponent::resized() {

Wyświetl plik

@ -63,6 +63,9 @@ public:
void setup();
void parserChanged() override;
void setPaused(bool paused);
bool isInitialised() const { return audioProcessor.wavParser.isInitialised(); }
std::function<void()> onParserChanged;
private:
CommonAudioProcessor& audioProcessor;

Wyświetl plik

@ -115,8 +115,24 @@ VisualiserComponent::VisualiserComponent(
popoutWindow();
};
if (visualiserOnly && juce::JUCEApplication::isStandaloneApp()) {
addAndMakeVisible(audioInputButton);
audioInputButton.setTooltip("Appears red when audio input is being used. Click to enable audio input and close any open audio files.");
audioInputButton.setClickingTogglesState(false);
audioInputButton.setToggleState(!audioPlayer.isInitialised(), juce::NotificationType::dontSendNotification);
audioPlayer.onParserChanged = [this] {
juce::MessageManager::callAsync([this] {
audioInputButton.setToggleState(!audioPlayer.isInitialised(), juce::NotificationType::dontSendNotification);
});
};
audioInputButton.onClick = [this] {
audioProcessor.stopAudioFile();
};
}
addAndMakeVisible(audioPlayer);
openGLContext.setRenderer(this);
openGLContext.attachTo(*this);
@ -441,6 +457,9 @@ void VisualiserComponent::resized() {
} else {
settingsButton.setVisible(false);
}
if (visualiserOnly && juce::JUCEApplication::isStandaloneApp()) {
audioInputButton.setBounds(buttons.removeFromRight(30));
}
#if SOSCI_FEATURES
sharedTextureButton.setBounds(buttons.removeFromRight(30));
#endif

Wyświetl plik

@ -87,6 +87,7 @@ private:
SvgButton fullScreenButton{ "fullScreen", BinaryData::fullscreen_svg, juce::Colours::white, juce::Colours::white };
SvgButton popOutButton{ "popOut", BinaryData::open_in_new_svg, juce::Colours::white, juce::Colours::white };
SvgButton settingsButton{ "settings", BinaryData::cog_svg, juce::Colours::white, juce::Colours::white };
SvgButton audioInputButton{ "audioInput", BinaryData::microphone_svg, juce::Colours::white, juce::Colours::red };
#if SOSCI_FEATURES
SvgButton sharedTextureButton{ "sharedTexture", BinaryData::spout_svg, juce::Colours::white, juce::Colours::red };