#include "../JuceLibraryCode/JuceHeader.h" enum State { Done, Start, Play, Stop }; class MainContentComponent : public AudioAppComponent, public ChangeListener, public Button::Listener { public: MainContentComponent() : state(Done) { addAndMakeVisible(&openbtn); openbtn.setButtonText("Open"); openbtn.addListener(this); addAndMakeVisible(&playbtn); playbtn.setButtonText("Play"); playbtn.addListener(this); playbtn.setColour(TextButton::buttonColourId, Colours::green); playbtn.setEnabled(false); addAndMakeVisible (&stopbtn); stopbtn.setButtonText("Stop"); stopbtn.addListener(this); stopbtn.setColour(TextButton::buttonColourId, Colours::red); stopbtn.setEnabled(false); formatManager.registerBasicFormats(); transportSource.addChangeListener(this); setSize(300, 200); setAudioChannels(0, 2); } ~MainContentComponent() { shutdownAudio(); } void changeListenerCallback(ChangeBroadcaster* source) override { if (source == &transportSource) { if (transportSource.isPlaying()) changeState(Play); else changeState(Done); } } void prepareToPlay(int s, double r) override { transportSource.prepareToPlay(s, r); } void getNextAudioBlock(const AudioSourceChannelInfo& buf) override { if (readerSource == nullptr) { buf.clearActiveBufferRegion(); return; } transportSource.getNextAudioBlock(buf); } void releaseResources() override { transportSource.releaseResources(); } void paint (Graphics& g) override { g.fillAll(getLookAndFeel().findColour(ResizableWindow::backgroundColourId)); } void resized() override { openbtn.setBounds(10, 10, getWidth() - 20, 20); playbtn.setBounds(10, 40, getWidth() - 20, 20); stopbtn.setBounds (10, 70, getWidth() - 20, 20); } private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) TextButton openbtn; TextButton playbtn; TextButton stopbtn; AudioFormatManager formatManager; ScopedPointer readerSource; AudioTransportSource transportSource; State state; void changeState(State news) { if (state == news) return; state = news; switch (state) { case Done: stopbtn.setEnabled(false); playbtn.setEnabled(true); transportSource.setPosition (0.0); break; case Start: playbtn.setEnabled (false); transportSource.start(); break; case Play: stopbtn.setEnabled (true); break; case Stop: transportSource.stop(); break; } } void buttonClicked(Button* button) override { if (button == &openbtn) openClicked(); if (button == &playbtn) playClicked(); if (button == &stopbtn) stopClicked(); } void openClicked() { FileChooser chooser ("Select a file", File::nonexistent, "*.wav"); if (!chooser.browseForFileToOpen()) return; File file(chooser.getResult()); AudioFormatReader* reader = formatManager.createReaderFor(file); if (reader == nullptr) return; ScopedPointer news = new AudioFormatReaderSource(reader, true); transportSource.setSource(news, 0, nullptr, reader->sampleRate); playbtn.setEnabled(true); readerSource = news.release(); } void playClicked() { changeState(Start); } void stopClicked() { changeState(Stop); } }; Component* createMainContentComponent() { return new MainContentComponent(); }