}
if (m_dev && m_dev->stop(false)) {
+ emit prepareForDeviceChange();
delete m_dev;
}
else if (m_dev) {
signals:
void deviceCountChanged();
void deviceIdChanged();
+ void prepareForDeviceChange();
void deviceChanged();
void modeChanged();
void idleStateChanged();
m_renderer(0),
m_cam(0),
m_conf(0),
+ m_dev(0),
m_enabled(true) {
#if defined(QT4)
if (m_cam) {
QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
+ QObject::disconnect(m_cam, SIGNAL(prepareForDeviceChange()), this, SLOT(prepareForDeviceChange()));
}
m_cam = camera;
if (m_cam) {
QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
+ QObject::connect(m_cam, SIGNAL(prepareForDeviceChange()), this, SLOT(prepareForDeviceChange()));
}
if (isComponentComplete()) {
return;
}
- QtCamDevice *dev = m_cam->device();
+ if (m_dev) {
+ qmlInfo(this) << "Cannot set a new device without cleaning up the existing one";
+ abort();
+ }
+
+ m_dev = m_cam->device();
- if (dev) {
- dev->setViewfinder(this);
+ if (m_dev) {
+ m_dev->setViewfinder(this);
}
emit renderAreaChanged();
return m_renderer ? m_renderer->sinkElement() : 0;
}
-bool Viewfinder::setDevice(QtCamDevice *device) {
- Q_UNUSED(device);
-
- return true;
-}
-
void Viewfinder::stop() {
if (m_renderer) {
m_renderer->reset();
update();
}
}
+
+void Viewfinder::prepareForDeviceChange() {
+ if (m_dev) {
+ m_dev->setViewfinder(0);
+ m_dev = 0;
+ }
+}
class QtCamViewfinderRenderer;
class Camera;
class CameraConfig;
+class QtCamDevice;
#if defined(QT4)
class Viewfinder : public QDeclarativeItem, public QtCamViewfinder {
#endif
GstElement *sinkElement();
- bool setDevice(QtCamDevice *device);
void stop();
signals:
private slots:
void deviceChanged();
void updateRequested();
+ void prepareForDeviceChange();
private:
QtCamViewfinderRenderer *m_renderer;
Camera *m_cam;
CameraConfig *m_conf;
+ QtCamDevice *m_dev;
bool m_enabled;
};
return true;
}
- if (!viewfinder->setDevice(this)) {
- return false;
- }
-
d_ptr->viewfinder = viewfinder;
d_ptr->sink = 0;
return d_ptr->renderer->sinkElement();
}
-bool QtCamGraphicsViewfinder::setDevice(QtCamDevice *device) {
- if (device && d_ptr->dev == device) {
- return true;
- }
-
- if (d_ptr->dev) {
- qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be replaced.";
- return false;
- }
-
- if (!device) {
- qWarning() << "QtCamGraphicsViewfinder: viewfinder cannot be unset.";
- return false;
- }
-
- // This is to break the loop.
- d_ptr->dev = device;
- if (!device->setViewfinder(this)) {
- d_ptr->dev = 0;
- return false;
- }
-
- d_ptr->resetBackend();
-
- return true;
-}
-
void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget) {
Q_UNUSED(widget);
virtual ~QtCamGraphicsViewfinder();
virtual GstElement *sinkElement();
- virtual bool setDevice(QtCamDevice *device);
virtual void stop();
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
virtual ~QtCamViewfinder();
virtual GstElement *sinkElement() = 0;
- virtual bool setDevice(QtCamDevice *device) = 0;
virtual void stop() = 0;
virtual QRectF renderArea() const = 0;