|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
- 27th April 2017).
-
- End User License Agreement: www.juce.com/juce-5-licence
- Privacy Policy: www.juce.com/juce-5-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- #pragma once
-
- #include "../JuceLibraryCode/JuceHeader.h"
-
- //==============================================================================
- class AudioThumbnailComponent : public Component,
- public FileDragAndDropTarget,
- public ChangeBroadcaster,
- private ChangeListener,
- private Timer
- {
- public:
- AudioThumbnailComponent (AudioDeviceManager& adm, AudioFormatManager& afm)
- : audioDeviceManager (adm),
- thumbnailCache (5),
- thumbnail (128, afm, thumbnailCache)
- {
- thumbnail.addChangeListener (this);
- }
-
- ~AudioThumbnailComponent()
- {
- thumbnail.removeChangeListener (this);
- }
-
- void paint (Graphics& g) override
- {
- g.fillAll (Colour (0xff495358));
-
- g.setColour (Colours::white);
-
- if (thumbnail.getTotalLength() > 0.0)
- {
- thumbnail.drawChannels (g, getLocalBounds().reduced (2),
- 0.0, thumbnail.getTotalLength(), 1.0f);
-
- g.setColour (Colours::black);
- g.fillRect (static_cast<float> (currentPosition * getWidth()), 0.0f,
- 1.0f, static_cast<float> (getHeight()));
- }
- else
- {
- g.drawFittedText ("No audio file loaded.\nDrop a file here or click the \"Load File...\" button.", getLocalBounds(),
- Justification::centred, 2);
- }
- }
-
- bool isInterestedInFileDrag (const StringArray&) override { return true; }
- void filesDropped (const StringArray& files, int, int) override { loadFile (File (files[0]), true); }
-
- void setCurrentFile (const File& f)
- {
- if (currentFile == f)
- return;
-
- loadFile (f);
- }
-
- File getCurrentFile() { return currentFile; }
-
- void setTransportSource (AudioTransportSource* newSource)
- {
- transportSource = newSource;
-
- struct ResetCallback : public CallbackMessage
- {
- ResetCallback (AudioThumbnailComponent& o) : owner (o) {}
- void messageCallback() override { owner.reset(); }
-
- AudioThumbnailComponent& owner;
- };
-
- (new ResetCallback (*this))->post();
- }
-
- private:
- AudioDeviceManager& audioDeviceManager;
- AudioThumbnailCache thumbnailCache;
- AudioThumbnail thumbnail;
- AudioTransportSource* transportSource = nullptr;
-
- File currentFile;
- double currentPosition = 0.0;
-
- //==============================================================================
- void changeListenerCallback (ChangeBroadcaster*) override { repaint(); }
-
- void reset()
- {
- currentPosition = 0.0;
- repaint();
-
- if (transportSource == nullptr)
- stopTimer();
- else
- startTimerHz (25);
- }
-
- void loadFile (const File& f, bool notify = false)
- {
- if (currentFile == f || ! f.existsAsFile())
- return;
-
- currentFile = f;
- thumbnail.setSource (new FileInputSource (f));
-
- if (notify)
- sendChangeMessage();
- }
-
- void timerCallback() override
- {
- if (transportSource != nullptr)
- {
- currentPosition = transportSource->getCurrentPosition() / thumbnail.getTotalLength();
- repaint();
- }
- }
-
- void mouseDrag (const MouseEvent& e) override
- {
- if (transportSource != nullptr)
- {
- const ScopedLock sl (audioDeviceManager.getAudioCallbackLock());
-
- transportSource->setPosition ((jmax (static_cast<double> (e.x), 0.0) / getWidth())
- * thumbnail.getTotalLength());
- }
- }
- };
-
- //==============================================================================
- class AudioPlayerHeader : public Component,
- private Button::Listener,
- private ChangeListener,
- private Value::Listener
- {
- public:
- AudioPlayerHeader();
- ~AudioPlayerHeader();
-
- void paint (Graphics&) override;
- void resized() override;
-
- AudioThumbnailComponent thumbnailComp;
-
- private:
- //==============================================================================
- void buttonClicked (Button*) override;
- void changeListenerCallback (ChangeBroadcaster*) override;
- void valueChanged (Value& value) override;
-
- //==============================================================================
- TextButton loadButton { "Load File..." }, playButton { "Play" };
- ToggleButton loopButton { "Loop File" };
- };
-
- //==============================================================================
- class DemoParametersComponent : public Component
- {
- public:
- DemoParametersComponent (const std::vector<DSPDemoParameterBase*>& demoParams)
- {
- parameters = demoParams;
-
- for (auto demoParameter : parameters)
- {
- addAndMakeVisible (demoParameter->getComponent());
-
- auto* paramLabel = new Label ({}, demoParameter->name);
-
- paramLabel->attachToComponent (demoParameter->getComponent(), true);
- paramLabel->setJustificationType (Justification::centredLeft);
- addAndMakeVisible (paramLabel);
- labels.add (paramLabel);
- }
- }
-
- void resized() override
- {
- auto bounds = getLocalBounds();
- bounds.removeFromLeft (100);
-
- for (auto* p : parameters)
- {
- auto* comp = p->getComponent();
-
- comp->setSize (jmin (bounds.getWidth(), p->getPreferredWidth()), p->getPreferredHeight());
-
- auto compBounds = bounds.removeFromTop (p->getPreferredHeight());
- comp->setCentrePosition (compBounds.getCentre());
- }
- }
-
- int getHeightNeeded()
- {
- auto height = 0;
-
- for (auto* p : parameters)
- height += p->getPreferredHeight();
-
- return height + 10;
- }
-
- private:
- std::vector<DSPDemoParameterBase*> parameters;
- OwnedArray<Label> labels;
- };
-
- //==============================================================================
- class MainContentComponent : public Component,
- private ListBoxModel
- {
- public:
- MainContentComponent();
-
- void paint (Graphics&) override;
- void resized() override;
-
- AudioThumbnailComponent& getThumbnailComponent() { return header.thumbnailComp; }
- void initParameters();
-
- private:
- //==============================================================================
- void paintListBoxItem (int rowNumber, Graphics&, int width, int height, bool rowIsSelected) override;
- int getNumRows() override;
- void selectedRowsChanged (int lastRowSelected) override;
-
- void setupDemoColours();
-
- //==============================================================================
- AudioPlayerHeader header;
- ListBox demoList { "Demo List" };
-
- CPlusPlusCodeTokeniser cppTokeniser;
- CodeDocument codeDocument;
- CodeEditorComponent codeEditor { codeDocument, &cppTokeniser };
-
- ScopedPointer<DemoParametersComponent> parametersComponent;
- };
|