/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-9 by Raw Material Software Ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License (Version 2), as published by the Free Software Foundation. A copy of the license is included in the JUCE distribution, or can be found online at www.gnu.org/licenses. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ #include "../jucedemo_headers.h" #if JUCE_USE_CAMERA //============================================================================== class CameraDemo : public Component, public ComboBoxListener, public ButtonListener, public CameraDevice::Listener { public: //============================================================================== CameraDemo() : cameraSelectorComboBox ("Camera"), snapshotButton ("Take a snapshot"), recordMovieButton ("Record a movie file (to your desktop)..."), recordingMovie (false) { setName ("Camera"); addAndMakeVisible (&cameraSelectorComboBox); createListOfCameras(); cameraSelectorComboBox.setSelectedId (1); cameraSelectorComboBox.addListener (this); addAndMakeVisible (&snapshotButton); snapshotButton.addListener (this); snapshotButton.setEnabled (false); addAndMakeVisible (&recordMovieButton); recordMovieButton.addListener (this); recordMovieButton.setEnabled (false); cameraSelectorComboBox.setSelectedId (2); } ~CameraDemo() { } void paint (Graphics& g) { g.drawImageWithin (lastSnapshot, getWidth() / 2 + 10, 40, getWidth() / 2 - 20, getHeight() - 50, RectanglePlacement::centred, false); } void resized() { cameraSelectorComboBox.setBounds (10, 4, 250, 24); snapshotButton.changeWidthToFitText (24); snapshotButton.setTopLeftPosition (cameraSelectorComboBox.getRight() + 20, 4); recordMovieButton.changeWidthToFitText (24); recordMovieButton.setTopLeftPosition (snapshotButton.getRight() + 20, 4); if (cameraPreviewComp != 0) cameraPreviewComp->setBounds (10, 40, getWidth() / 2 - 20, getHeight() - 50); } void comboBoxChanged (ComboBox*) { // This is called when the user chooses a camera from the drop-down list. cameraDevice = 0; cameraPreviewComp = 0; recordingMovie = false; if (cameraSelectorComboBox.getSelectedId() > 1) { // Try to open the user's choice of camera.. cameraDevice = CameraDevice::openDevice (cameraSelectorComboBox.getSelectedId() - 2); // and if it worked, create a preview component for it.. if (cameraDevice != 0) addAndMakeVisible (cameraPreviewComp = cameraDevice->createViewerComponent()); } snapshotButton.setEnabled (cameraDevice != 0); recordMovieButton.setEnabled (cameraDevice != 0); resized(); } void createListOfCameras() { cameraSelectorComboBox.clear(); cameraSelectorComboBox.addItem ("No camera", 1); cameraSelectorComboBox.addSeparator(); StringArray cameras = CameraDevice::getAvailableDevices(); for (int i = 0; i < cameras.size(); ++i) cameraSelectorComboBox.addItem (cameras[i], i + 2); } void buttonClicked (Button* b) { if (cameraDevice != 0) { if (b == &recordMovieButton) { // The user has clicked the record movie button.. if (! recordingMovie) { // Start recording to a file on the user's desktop.. recordingMovie = true; File file (File::getSpecialLocation (File::userDesktopDirectory) .getNonexistentChildFile ("JuceCameraDemo", CameraDevice::getFileExtension())); cameraDevice->startRecordingToFile (file); recordMovieButton.setButtonText ("Stop Recording"); } else { // Already recording, so stop... recordingMovie = false; cameraDevice->stopRecording(); recordMovieButton.setButtonText ("Start recording (to a file on your desktop)"); } } else { // When the user clicks the snapshot button, we'll attach ourselves to // the camera as a listener, and wait for an image to arrive... cameraDevice->addListener (this); } } } // This is called by the camera device when a new image arrives void imageReceived (const Image& image) { // In this app we just want to take one image, so as soon as this happens, // we'll unregister ourselves as a listener. if (cameraDevice != 0) cameraDevice->removeListener (this); // This callback won't be on the message thread, so need to lock it before using // data that may already be in use.. const MessageManagerLock mm; lastSnapshot = image; repaint(); } private: //============================================================================== ScopedPointer cameraDevice; ScopedPointer cameraPreviewComp; Image lastSnapshot; ComboBox cameraSelectorComboBox; TextButton snapshotButton; TextButton recordMovieButton; bool recordingMovie; }; //============================================================================== Component* createCameraDemo() { return new CameraDemo(); } #endif