/******************************************************************************* The block below describes the properties of this PIP. A PIP is a short snippet of code that can be read by the Projucer and used to generate a JUCE project. BEGIN_JUCE_PIP_METADATA name: OpenGLPlugIn dependencies: juce_audio_basics, juce_audio_formats, juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra, juce_opengl exporters: vs2017 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 type: AudioProcessor mainClass: OpenGLPlugIn useLocalCopy: 0 END_JUCE_PIP_METADATA *******************************************************************************/ #pragma once //============================================================================== class OpenGLPlugIn : public AudioProcessor { public: //============================================================================== OpenGLPlugIn() : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo()) .withOutput ("Output", AudioChannelSet::stereo())) { } ~OpenGLPlugIn() { } //============================================================================== void prepareToPlay (double, int) override { // Use this method as the place to do any pre-playback // initialisation that you need.. } void releaseResources() override { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void processBlock (AudioBuffer& buffer, MidiBuffer&) override { ScopedNoDenormals noDenormals; auto totalNumInputChannels = getTotalNumInputChannels(); auto totalNumOutputChannels = getTotalNumOutputChannels(); // In case we have more outputs than inputs, this code clears any output // channels that didn't contain input data, (because these aren't // guaranteed to be empty - they may contain garbage). // This is here to avoid people getting screaming feedback // when they first compile a plugin, but obviously you don't need to keep // this code if your algorithm always overwrites all the output channels. for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); } //============================================================================== AudioProcessorEditor* createEditor() override { return new OpenGLPlugInEditor (this); } bool hasEditor() const override { return true; } //============================================================================== const String getName() const override { return "OpenGLPlugIn"; } bool acceptsMidi() const override { return false; } bool producesMidi() const override { return false; } double getTailLengthSeconds() const override { return 0; } //============================================================================== int getNumPrograms() override { return 1; } int getCurrentProgram() override { return 0; } void setCurrentProgram (int) override {} const String getProgramName (int) override { return {}; } void changeProgramName (int, const String&) override {} //============================================================================== void getStateInformation (MemoryBlock&) override { // You should use this method to store your parameters in the memory block. // You could do that either as raw data, or use the XML or ValueTree classes // as intermediaries to make it easy to save and load complex data. } void setStateInformation (const void*, int) override { // You should use this method to restore your parameters from this memory block, // whose contents will have been created by the getStateInformation() call. } //============================================================================== bool isBusesLayoutSupported (const BusesLayout& layouts) const override { // This is the place where you check if the layout is supported. // In this template code we only support mono or stereo. if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono() && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo()) return false; // This checks if the input layout matches the output layout if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) return false; return true; } private: class OpenGLPlugInEditor : public AudioProcessorEditor { public: OpenGLPlugInEditor (AudioProcessor* p) : AudioProcessorEditor (p) { setSize (400, 200); context.attachTo (*this); } ~OpenGLPlugInEditor() { context.detach(); } private: void paint (Graphics& g) override { g.fillAll (Colours::slategrey); g.setColour (Colours::orangered); g.fillEllipse (juce::Rectangle (0, 0, 200, 200).withCentre (getLocalBounds().getCentre()).toFloat()); } OpenGLContext context; }; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLPlugIn) };