// // Created by Alex Birch on 10/09/2017. // #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "SharesParams.h" #include #include #include "BankAndPreset.h" #include "PresetsToBanks.h" // https://stackoverflow.com/a/13446565/5257399 //using std::shared_ptr; using namespace std; class FluidSynthModel: public ValueTree::Listener { public: FluidSynthModel( AudioProcessorValueTreeState& valueTreeState, // SharesParams& sharedParams ValueTree& valueTree ); ~FluidSynthModel(); shared_ptr getSynth(); void initialise(); BanksToPresets getBanks(); void changePreset(int bank, int preset); int getChannel(); void onFileNameChanged(const String &absPath, int bank, int preset); void setControllerValue(int controller, int value); //============================================================================== /** Used to receive callbacks when a button is clicked. @see Button::addListener, Button::removeListener */ class Listener { public: /** Destructor. */ virtual ~Listener(); /** Called when the button is clicked. */ virtual void fontChanged (FluidSynthModel*, const String &absPath); }; /** Registers a listener to receive events when this button's state changes. If the listener is already registered, this will not register it again. @see removeListener */ void addListener (Listener* newListener); /** Removes a previously-registered button listener @see addListener */ void removeListener (Listener* listener); void setSampleRate(float sampleRate); const String& getCurrentSoundFontAbsPath(); virtual void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, const Identifier& property) override; inline virtual void valueTreeChildAdded (ValueTree& parentTree, ValueTree& childWhichHasBeenAdded) override {}; inline virtual void valueTreeChildRemoved (ValueTree& parentTree, ValueTree& childWhichHasBeenRemoved, int indexFromWhichChildWasRemoved) override {}; inline virtual void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved, int oldIndex, int newIndex) override {}; inline virtual void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) override {}; inline virtual void valueTreeRedirected (ValueTree& treeWhichHasBeenChanged) override {}; private: // class ValueTreeListener: public ValueTree::Listener { // public: //// ValueTreeListener(); //// ~ValueTreeListener(); // virtual void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, // const Identifier& property) override; // inline virtual void valueTreeChildAdded (ValueTree& parentTree, // ValueTree& childWhichHasBeenAdded) override {}; // inline virtual void valueTreeChildRemoved (ValueTree& parentTree, // ValueTree& childWhichHasBeenRemoved, // int indexFromWhichChildWasRemoved) override {}; // inline virtual void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved, // int oldIndex, int newIndex) override {}; // inline virtual void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) override {}; // inline virtual void valueTreeRedirected (ValueTree& treeWhichHasBeenChanged) override {}; // JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueTreeListener) // }; int handleMidiEvent(void* data, fluid_midi_event_t* event); // ValueTreeListener valueTreeListener; AudioProcessorValueTreeState& valueTreeState; // SharesParams& sharedParams; ValueTree& valueTree; // https://stackoverflow.com/questions/38980315/is-stdunique-ptr-deletion-order-guaranteed // members are destroyed in reverse of the order they're declared // http://www.fluidsynth.org/api/ // in their examples, they destroy the synth before destroying the settings unique_ptr settings; // TODO: shared_ptr may ruin our guarantee of synth's being destroyed first, so consider changing the access we expose shared_ptr synth; // unique_ptr midiDriver; String currentSoundFontAbsPath; float currentSampleRate; fluid_preset_t* getFirstPreset(); void selectFirstPreset(); unique_ptr getFirstBankAndPreset(); void unloadAndLoadFont(const String &absPath); void loadFont(const String &absPath); bool shouldLoadFont(const String &absPath); void changePresetImpl(int bank, int preset); bool initialised; unsigned int sfont_id; unsigned int channel; // fluid_mod_t* mod; ListenerList eventListeners; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FluidSynthModel) };