From c31e68daf1b438903149930fbc6c3ebaa72b8be7 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 24 Jun 2009 18:02:34 +0000 Subject: [PATCH] Added some missing files for camera support --- .../juce demo/src/binarydata/CameraDemo.cpp | 204 ++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 extras/juce demo/src/binarydata/CameraDemo.cpp diff --git a/extras/juce demo/src/binarydata/CameraDemo.cpp b/extras/juce demo/src/binarydata/CameraDemo.cpp new file mode 100644 index 0000000000..7c9ce91d4a --- /dev/null +++ b/extras/juce demo/src/binarydata/CameraDemo.cpp @@ -0,0 +1,204 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also 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 CameraImageListener +{ +public: + //============================================================================== + CameraDemo() + { + setName (T("Camera")); + + cameraDevice = 0; + cameraPreviewComp = 0; + lastSnapshot = 0; + recordingMovie = false; + + addAndMakeVisible (cameraSelectorComboBox = new ComboBox (T("Camera"))); + createListOfCameras(); + cameraSelectorComboBox->setSelectedId (1); + cameraSelectorComboBox->addListener (this); + + addAndMakeVisible (snapshotButton = new TextButton (T("Take a snapshot"))); + snapshotButton->addButtonListener (this); + snapshotButton->setEnabled (false); + + addAndMakeVisible (recordMovieButton = new TextButton (T("Record a movie file (to your desktop)..."))); + recordMovieButton->addButtonListener (this); + recordMovieButton->setEnabled (false); + + cameraSelectorComboBox->setSelectedId (2); + } + + ~CameraDemo() + { + deleteAllChildren(); + delete cameraDevice; + delete lastSnapshot; + } + + void paint (Graphics& g) + { + if (lastSnapshot != 0) + 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. + deleteAndZero (cameraDevice); + deleteAndZero (cameraPreviewComp); + 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 (T("JuceCameraDemo"), + CameraDevice::getFileExtension())); + + cameraDevice->startRecordingToFile (file); + recordMovieButton->setButtonText (T("Stop Recording")); + } + else + { + // Already recording, so stop... + recordingMovie = false; + cameraDevice->stopRecording(); + recordMovieButton->setButtonText (T("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 (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; + deleteAndZero (lastSnapshot); + lastSnapshot = image.createCopy(); + repaint(); + } + +private: + //============================================================================== + CameraDevice* cameraDevice; + + ComboBox* cameraSelectorComboBox; + TextButton* snapshotButton; + TextButton* recordMovieButton; + Component* cameraPreviewComp; + bool recordingMovie; + + Image* lastSnapshot; +}; + + +//============================================================================== +Component* createCameraDemo() +{ + return new CameraDemo(); +} + +#endif