#include "../jucedemo_headers.h" #if JUCE_DIRECTSHOW //============================================================================== class DirectShowWindowWithFileBrowser : public Component, public FilenameComponentListener { public: DirectShowWindowWithFileBrowser (DirectShowComponent::VideoRendererType type) : fileChooser ("movie", File::nonexistent, true, false, false, "*", String::empty, "(choose a video file to play)"), dshowComp (type) { addAndMakeVisible (&dshowComp); addAndMakeVisible (&fileChooser); fileChooser.addListener (this); fileChooser.setBrowseButtonText ("browse"); } void resized() { dshowComp.setBounds (0, 0, getWidth(), getHeight() - 60); if (transportControl != 0) transportControl->setBounds (0, dshowComp.getBottom() + 4, getWidth(), 26); fileChooser.setBounds (0, getHeight() - 24, getWidth(), 24); } void filenameComponentChanged (FilenameComponent*) { // this is called when the user changes the filename in the file chooser box if (dshowComp.loadMovie (fileChooser.getCurrentFile())) { addAndMakeVisible (transportControl = new TransportControl (dshowComp)); resized(); dshowComp.play(); } else { AlertWindow::showMessageBox (AlertWindow::WarningIcon, "Couldn't load the file!", "Sorry, DirectShow didn't manage to load that file!"); } } private: DirectShowComponent dshowComp; FilenameComponent fileChooser; //============================================================================== // A quick-and-dirty transport control, containing a play button and a position slider.. class TransportControl : public Component, public ButtonListener, public SliderListener, public Timer { public: TransportControl (DirectShowComponent& dshowComp_) : playButton ("Play/Pause"), position (String::empty), dshowComp (dshowComp_) { addAndMakeVisible (&playButton); playButton.addListener (this); addAndMakeVisible (&position); position.setRange (0, dshowComp.getMovieDuration(), 0); position.setSliderStyle (Slider::LinearHorizontal); position.setTextBoxStyle (Slider::NoTextBox, false, 80, 20); position.addListener (this); startTimer (1000 / 50); } void buttonClicked (Button* buttonThatWasClicked) { if (dshowComp.isPlaying()) dshowComp.stop(); else dshowComp.play(); } void sliderValueChanged (Slider* sliderThatWasMoved) { dshowComp.setPosition (position.getValue()); } void resized() { const int playButtonWidth = 90; playButton.setBounds (0, 0, playButtonWidth, getHeight()); position.setBounds (playButtonWidth, 0, getWidth() - playButtonWidth, getHeight()); } void timerCallback() { if (! position.isMouseButtonDown()) position.setValue (dshowComp.getPosition(), false); } private: TextButton playButton; Slider position; DirectShowComponent& dshowComp; }; ScopedPointer transportControl; }; //============================================================================== class DirectShowDemo : public Component { public: //============================================================================== DirectShowDemo() : dsComp1 (DirectShowComponent::dshowVMR7), dsComp2 (DirectShowComponent::dshowEVR) { setName ("DirectShow"); // add a movie component.. addAndMakeVisible (&dsComp1); addAndMakeVisible (&dsComp2); } ~DirectShowDemo() { dsComp1.setVisible (false); dsComp2.setVisible (false); } void resized() { dsComp1.setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f); dsComp2.setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f); } private: //============================================================================== DirectShowWindowWithFileBrowser dsComp1, dsComp2; }; //============================================================================== Component* createDirectShowDemo() { return new DirectShowDemo(); } #endif