From 45af2e86648d31c87b1446bd89866a022bc0ca97 Mon Sep 17 00:00:00 2001 From: hellerve Date: Wed, 14 Jun 2017 16:47:42 -0400 Subject: [PATCH] play_sound now fully fledged audio player --- play_sound/Source/MainComponent.cpp | 102 ++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 30 deletions(-) diff --git a/play_sound/Source/MainComponent.cpp b/play_sound/Source/MainComponent.cpp index 5da72f1..df82f04 100644 --- a/play_sound/Source/MainComponent.cpp +++ b/play_sound/Source/MainComponent.cpp @@ -4,15 +4,20 @@ enum State { Done, Start, Play, - Stop + Stop, + Paused, + Pause }; class MainContentComponent : public AudioAppComponent, public ChangeListener, - public Button::Listener { + public Button::Listener, + public Timer { public: MainContentComponent() : state(Done) { - + addAndMakeVisible(&time); + time.setText("00:00:00", NotificationType::dontSendNotification); + addAndMakeVisible(&openbtn); openbtn.setButtonText("Open"); openbtn.addListener(this); @@ -29,8 +34,9 @@ public: stopbtn.setColour(TextButton::buttonColourId, Colours::red); stopbtn.setEnabled(false); - formatManager.registerBasicFormats(); - transportSource.addChangeListener(this); + formats.registerBasicFormats(); + source.addChangeListener(this); + setSize(300, 200); @@ -40,29 +46,43 @@ public: ~MainContentComponent() { shutdownAudio(); } + + int truncn(double i, int n) { + return ((int) trunc(i)) % n; + } - void changeListenerCallback(ChangeBroadcaster* source) override { - if (source == &transportSource) { - if (transportSource.isPlaying()) changeState(Play); - else changeState(Done); + void timerCallback() override { + RelativeTime pos = RelativeTime(source.getCurrentPosition()); + String str = String::formatted("%02d:%02d:%02d", truncn(pos.inMinutes(), 60), + truncn(pos.inSeconds(), 60), + truncn(pos.inMilliseconds(), 1000)/10); + + time.setText(str, NotificationType::dontSendNotification); + } + + void changeListenerCallback(ChangeBroadcaster* s) override { + if (s == &source) { + if (source.isPlaying()) changeState(Play); + else if(state == Stop || state == Play) changeState(Done); + else if (state == Pause) changeState(Paused); } } void prepareToPlay(int s, double r) override { - transportSource.prepareToPlay(s, r); + source.prepareToPlay(s, r); } void getNextAudioBlock(const AudioSourceChannelInfo& buf) override { - if (readerSource == nullptr) { + if (readers == nullptr) { buf.clearActiveBufferRegion(); return; } - transportSource.getNextAudioBlock(buf); + source.getNextAudioBlock(buf); } void releaseResources() override { - transportSource.releaseResources(); + source.releaseResources(); } void paint (Graphics& g) override { @@ -70,9 +90,11 @@ public: } void resized() override { - openbtn.setBounds(10, 10, getWidth() - 20, 20); - playbtn.setBounds(10, 40, getWidth() - 20, 20); - stopbtn.setBounds (10, 70, getWidth() - 20, 20); + int w = getWidth() - 20; + time.setBounds(10, 10, w, 20); + openbtn.setBounds(10, 30, w, 20); + playbtn.setBounds(10, 60, w, 20); + stopbtn.setBounds(10, 90, w, 20); } @@ -81,9 +103,10 @@ private: TextButton openbtn; TextButton playbtn; TextButton stopbtn; - AudioFormatManager formatManager; - ScopedPointer readerSource; - AudioTransportSource transportSource; + Label time; + AudioFormatManager formats; + ScopedPointer readers; + AudioTransportSource source; State state; void changeState(State news) { @@ -95,20 +118,35 @@ private: case Done: stopbtn.setEnabled(false); playbtn.setEnabled(true); - transportSource.setPosition (0.0); + source.setPosition(0.0); + time.setText("00:00:00", NotificationType::dontSendNotification); break; case Start: - playbtn.setEnabled (false); - transportSource.start(); + source.start(); + playbtn.setButtonText("Pause"); + stopbtn.setButtonText("Stop"); break; case Play: - stopbtn.setEnabled (true); + stopbtn.setEnabled(true); + startTimer(30); break; - + + case Pause: + source.stop(); + stopTimer(); + break; + + case Paused: + playbtn.setButtonText("Resume"); + stopbtn.setButtonText("Restart"); + break; + case Stop: - transportSource.stop(); + source.stop(); + stopTimer(); + playbtn.setButtonText("Play"); break; } } @@ -124,22 +162,26 @@ private: if (!chooser.browseForFileToOpen()) return; File file(chooser.getResult()); - AudioFormatReader* reader = formatManager.createReaderFor(file); + AudioFormatReader* reader = formats.createReaderFor(file); if (reader == nullptr) return; ScopedPointer news = new AudioFormatReaderSource(reader, true); - transportSource.setSource(news, 0, nullptr, reader->sampleRate); + source.setSource(news, 0, nullptr, reader->sampleRate); playbtn.setEnabled(true); - readerSource = news.release(); + readers = news.release(); } void playClicked() { - changeState(Start); + if (state == Stop || state == Done || state == Paused) changeState(Start); + else if (state == Play) changeState(Pause); } void stopClicked() { - changeState(Stop); + if (state == Paused) { + changeState(Done); + changeState(Start); + } else changeState(Stop); } };