diff -r 8b2d6d0384b0 -r d9aefe59d544 camerauis/cameraxui/cxengine/src/cxecameradevicecontrolsymbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraxui/cxengine/src/cxecameradevicecontrolsymbian.cpp Fri Apr 16 14:51:30 2010 +0300 @@ -0,0 +1,322 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "cxecameradevicecontrolsymbian.h" +#include "cxesettingsimp.h" +#include "cxefeaturemanagerimp.h" +#include "cxesettingsmodel.h" +#include "cxutils.h" +#include "cxenamespace.h" +#include "cxeerrormappingsymbian.h" +#include "cxestate.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cxecameradevicecontrolsymbianTraces.h" +#endif + + + +CxeCameraDeviceControlSymbian::CxeCameraDeviceControlSymbian() + : CxeStateMachine("CxeCameraDeviceControlSymbian"), + mCameraDevice(NULL), + mCameraIndex(Cxe::PrimaryCameraIndex), + mCameraMode(Cxe::ImageMode) +{ + CX_DEBUG_ENTER_FUNCTION(); + +#ifdef FORCE_SECONDARY_CAMERA + mCameraIndex = Cxe::SecondaryCameraIndex; +#endif + qRegisterMetaType(); + initializeStates(); + + mCameraDevice = new CxeCameraDevice(); + + CX_DEBUG_EXIT_FUNCTION(); +} + +CxeCameraDeviceControlSymbian::~CxeCameraDeviceControlSymbian() +{ + CX_DEBUG_ENTER_FUNCTION(); + + // release current camera + releaseCurrentCamera(); + + delete mCameraDevice; + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::init() +{ + CX_DEBUG_ENTER_FUNCTION(); + + CxeError::Id err = mCameraDevice->newCamera(mCameraIndex, this); + + if (err) { + emit initModeComplete(err); + } + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::reserve() +{ + CX_DEBUG_ENTER_FUNCTION(); + + CX_DEBUG_ASSERT(mCameraDevice && mCameraDevice->camera()); + + if (state() == Idle) { + setState(Initializing); + mCameraDevice->camera()->Reserve(); + OstTrace0(camerax_performance, CXECAMERADEVICECONTROLSYMBIAN_RESERVE, "msg: e_CX_RESERVE 1"); + } else if (state() == PendingRelease) { + // if we get a reserve request and if there is a pending release + // it is just fine to continue the init operation. + setState(Initializing); + } else { + // nothing to do + } + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::powerOn() +{ + CX_DEBUG_ENTER_FUNCTION(); + + CX_DEBUG_ASSERT(mCameraDevice && mCameraDevice->camera()); + if (state() == Initializing) { + mCameraDevice->camera()->PowerOn(); + OstTrace0(camerax_performance, CXECAMERADEVICECONTROLSYMBIAN_POWERON, "msg: e_CX_POWER_ON 1"); + } + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::HandleEvent(const TECAMEvent &aEvent) +{ + doHandleEvent( aEvent ); + emit cameraEvent( aEvent.iEventType.iUid, aEvent.iErrorCode ); +} + +void CxeCameraDeviceControlSymbian::doHandleEvent(const TECAMEvent &aEvent) +{ + CX_DEBUG_ENTER_FUNCTION(); + + CX_DEBUG(("Cxe: event 0x%08x, %d", aEvent.iEventType.iUid, aEvent.iErrorCode)); + + if(aEvent.iEventType == KUidECamEventReserveComplete) { + handleReserveComplete(aEvent.iErrorCode); + } + else if(aEvent.iEventType == KUidECamEventPowerOnComplete) { + handlePowerOnComplete(aEvent.iErrorCode); + } + else if(aEvent.iEventType == KUidECamEventCameraNoLongerReserved) + { + handleNoLongerReserved(aEvent.iErrorCode); + } + else + { + // We don't care about this event -- ignore + } + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::handleReserveComplete(int error) +{ + CX_DEBUG_ENTER_FUNCTION(); + OstTrace0( camerax_performance, CXECAMERADEVICECONTROLSYMBIAN_HANDLERESERVECOMPLETE, "msg: e_CX_RESERVE 0" ); + + if(state() == PendingRelease) { + release(); + } else { + if (!error) { + powerOn(); + } else { + emit initModeComplete(CxeErrorHandlingSymbian::map(error)); + setState(Idle); + } + } + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::handlePowerOnComplete(int error) +{ + CX_DEBUG_ENTER_FUNCTION(); + OstTrace0(camerax_performance, CXECAMERADEVICECONTROLSYMBIAN_HANDLEPOWERONCOMPLETE, "msg: e_CX_POWER_ON 0"); + + if(state() == PendingRelease) { + release(); + } else { + if (!error) { + setState(Ready); + emit deviceReady(); // this will trigger prepare for either still or video mode + } else { + setState(PendingRelease); + release(); + emit initModeComplete(CxeErrorHandlingSymbian::map(error)); + } + } + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::handleNoLongerReserved(int /* error */) +{ + setState( Idle ); + //! @todo: handle cases where camera is lost +} + + +/* +* switch between camera <-> primary <-> secondary +*/ + +CxeError::Id CxeCameraDeviceControlSymbian::switchCamera(Cxe::CameraIndex cameraIndex) +{ + CX_DEBUG_ENTER_FUNCTION(); + +#ifdef FORCE_SECONDARY_CAMERA + // 2nd camera forced use, make us believe camera never needs to be swithed. + CX_DEBUG(("CxeCameraDeviceControlSymbian::switchCamera() second camera forced, skip switch")); + cameraIndex = mCameraIndex; +#endif + + // during mode change, we have to re-create camera reference and release resources. + // in all other cases if the camera indexes are same, it means that camera reference + // is already created and hence we can return immediately. + if (cameraIndex == mCameraIndex) { + CX_DEBUG_EXIT_FUNCTION(); + return CxeError::None; + } + + releaseCurrentCamera(); + + CxeError::Id err = mCameraDevice->newCamera(cameraIndex, this); + + if (err == CxeError::None){ + // CCamera object created, so make sure that appropriate index is used + mCameraIndex = cameraIndex; + } + + if (!err) { // if there is no error creating new camera, then start Reserve + reserve(); + } + + CX_DEBUG_EXIT_FUNCTION(); + return err; +} + +void CxeCameraDeviceControlSymbian::release() +{ + CX_DEBUG_ENTER_FUNCTION(); + + if (state() == Idle) { + // nothing to do + return; + } + + if (state() == Initializing) { + setState(PendingRelease); + } else { + mCameraDevice->releaseCamera(); + setState(Idle); + } + + CX_DEBUG_EXIT_FUNCTION(); +} + +/* +* Release resources w.r.t current camera +*/ +void CxeCameraDeviceControlSymbian::releaseCurrentCamera() +{ + CX_DEBUG_ENTER_FUNCTION(); + + release(); + // delete old camera instance, this will inturn generates "prepareForCameraDelete" event + // across all interested classes which wants to do cleanup for new camera reference change + mCameraDevice->deleteCamera(); + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::ViewFinderReady(MCameraBuffer &aCameraBuffer, TInt aError) +{ + CX_DEBUG_ENTER_FUNCTION(); + emit vfFrameReady(&aCameraBuffer, aError); + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::ImageBufferReady(MCameraBuffer& aCameraBuffer, TInt aError) +{ + CX_DEBUG_ENTER_FUNCTION(); + + emit imageBufferReady( &aCameraBuffer, aError ); + + CX_DEBUG_EXIT_FUNCTION(); +} + +void CxeCameraDeviceControlSymbian::VideoBufferReady(MCameraBuffer &/*aCameraBuffer*/, TInt /*aError*/) +{ + CX_DEBUG_IN_FUNCTION(); +} + +Cxe::CameraIndex CxeCameraDeviceControlSymbian::cameraIndex() const +{ + return mCameraIndex; +} + +Cxe::CameraMode CxeCameraDeviceControlSymbian::mode() const +{ + return mCameraMode; +} + +void CxeCameraDeviceControlSymbian::setMode(Cxe::CameraMode mode) +{ + mCameraMode = mode; +} + +CxeCameraDeviceControl::State CxeCameraDeviceControlSymbian::state() const +{ + return static_cast(stateId()); +} + +void CxeCameraDeviceControlSymbian::handleStateChanged(int newStateId, CxeError::Id error) +{ + emit stateChanged(static_cast(newStateId), error); +} + +void CxeCameraDeviceControlSymbian::initializeStates() +{ + // addState( id, name, allowed next states ) + addState(new CxeState( Idle , "Idle", Initializing)); + addState(new CxeState( Initializing, "Initializing", PendingRelease | Ready | Idle)); + addState(new CxeState( Ready, "Ready", Idle)); + addState(new CxeState( PendingRelease, "PendingRelease", Initializing | Idle)); + + setInitialState(Idle); +} + +CxeCameraDevice *CxeCameraDeviceControlSymbian::cameraDevice() +{ + return mCameraDevice; +} + +// end of file