Browse Source

Added some missing files for camera support

tags/2021-05-28
jules 16 years ago
parent
commit
c31e68daf1
1 changed files with 204 additions and 0 deletions
  1. +204
    -0
      extras/juce demo/src/binarydata/CameraDemo.cpp

+ 204
- 0
extras/juce demo/src/binarydata/CameraDemo.cpp View File

@@ -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

Loading…
Cancel
Save