diff -r f54ad444594d -r 61bc0f252b2b camerauis/cameraxui/cxengine/src/cxesoundplayersymbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/camerauis/cameraxui/cxengine/src/cxesoundplayersymbian.cpp Tue Aug 31 15:03:46 2010 +0300 @@ -0,0 +1,274 @@ +/* +* Copyright (c) 2009-2010 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 +#include +#include +#include "cxutils.h" +#include "cxecameradevicecontrolsymbian.h" +#include "cxestate.h" +#include "cxesettings.h" + + +const TUint KCxeAudioPriority = KAudioPriorityCameraTone; + +_LIT(KCxeCaptureSound, "z:\\system\\sounds\\digital\\capture.wav"); +_LIT(KCxeVideoStartSound, "z:\\system\\sounds\\digital\\videoStart.wav"); +_LIT(KCxeVideoStopSound, "z:\\system\\sounds\\digital\\videoStop.wav"); +_LIT(KCxeAutoFocusSound, "z:\\system\\sounds\\digital\\autoFocus.wav"); + + +CxeSoundPlayerSymbian::CxeSoundPlayerSymbian(CaptureSound soundId, + CxeSettings &settings) : + CxeStateMachine("CxeSoundPlayerSymbian"), + mAudioPlayer(NULL), + mSoundId(soundId), + mUseSound(true), + mCaptureSoundForced(false), + mSettings(settings) +{ + CX_DEBUG_ENTER_FUNCTION(); + + checkCaptureSoundSettings(); + + // connect to setting changed signal in order to monitor + // profile warning tone changes + connect(&mSettings, + SIGNAL(settingValueChanged(long int, unsigned long int, QVariant)), + this, SLOT(enableSound(long int, unsigned long int, QVariant))); + + qRegisterMetaType(); + initializeStates(); + + doOpen(); + CX_DEBUG_EXIT_FUNCTION(); +} + +CxeSoundPlayerSymbian::~CxeSoundPlayerSymbian() +{ + CX_DEBUG_ENTER_FUNCTION(); + + delete mAudioPlayer; + + CX_DEBUG_EXIT_FUNCTION(); +} + +/*! + * Plays the current sound file if soundplayer is in correct state. Once + * playing is finished or there is an error playComplete signal is emitted. + * \sa playComplete() + */ +void CxeSoundPlayerSymbian::play() +{ + CX_DEBUG_ENTER_FUNCTION(); + CX_DEBUG(("CxeSoundPlayerSymbian::play mSoundId: %d, state: %d", mSoundId, state())); + + // Only play the capture sound if CMdaAudioPlayerUtility is initialised + if (state() == Ready) { + + if (mUseSound) { + //! @todo: Define & implement what to do, when sound is already playing. + // Important for sequence mode. + setState(Playing); + mAudioPlayer->Play(); + } else { + CX_DEBUG(("CxeSoundPlayerSymbian::play capture sounds turned off")); + + // sounds are off and we don't play the sound, + // act as the sound has been played + emit playComplete(KErrNone); + } + + } else if( state() == NotReady ) { + // Here sound loading has failed. + // Emit signal with error code. + emit playComplete(KErrNotReady); + } + + CX_DEBUG_EXIT_FUNCTION(); +} + + +void CxeSoundPlayerSymbian::MapcInitComplete(TInt aStatus, const TTimeIntervalMicroSeconds &/*aDuration*/) +{ + CX_DEBUG_IN_FUNCTION(); + CX_DEBUG(("MapcInitComplete aStatus: %d", aStatus)); + + if (aStatus) { + setState(NotReady); + } else { + setState(Ready); + } +} + +void CxeSoundPlayerSymbian::MapcPlayComplete(TInt aStatus) +{ + CX_DEBUG_IN_FUNCTION(); + CX_DEBUG(("MapcPlayComplete aStatus: %d", aStatus)); + + if (aStatus != KErrNone && aStatus != KErrInUse) { + // An error occurred. Close and reopen sound player to be sure. + mAudioPlayer->Close(); + setState(NotReady); + doOpen(); + } else { + setState(Ready); + } + + emit playComplete(aStatus); +} + +void CxeSoundPlayerSymbian::doOpen() +{ + CX_DEBUG(("Calling OpenFileL for sound %d", mSoundId)); + TInt error = KErrNone; + const TDesC* filename = 0; + switch (mSoundId) { + case StillCapture: + filename = &KCxeCaptureSound; + break; + case VideoCaptureStart: + filename = &KCxeVideoStartSound; + break; + case VideoCaptureStop: + filename = &KCxeVideoStopSound; + break; + case AutoFocus: + filename = &KCxeAutoFocusSound; + break; + default: + // sound is not known + mSoundId = Unknown; + break; + } + + if (filename) { + if (mAudioPlayer) { + delete mAudioPlayer; + mAudioPlayer = 0; + } + TRAP(error, mAudioPlayer = + CMdaAudioPlayerUtility::NewFilePlayerL(*filename, + *this, KCxeAudioPriority, + TMdaPriorityPreference(KAudioPrefCamera))); + if (!error) { + setState(Opening); + } else { + setState(NotReady); + } + } else { + setState(NotReady); + } +} + + +void CxeSoundPlayerSymbian::handleStateChanged(int newStateId, CxeError::Id error) +{ + Q_UNUSED(newStateId); + Q_UNUSED(error); + // No implementation needed, because state is not visible outside of this class +} + +/*! + * Returns the current sound player state. + * \return Current state + */ +CxeSoundPlayerSymbian::State CxeSoundPlayerSymbian::state() const +{ + return static_cast(stateId()); +} + +/*! + * Initialize CxeStateMachine. + */ +void CxeSoundPlayerSymbian::initializeStates() +{ + // addState(id, name, allowed next states) + addState(new CxeState(NotReady, "NotReady", Opening)); + addState(new CxeState(Opening, "Opening", NotReady | Ready)); + addState(new CxeState(Ready, "Ready", Playing | Opening | NotReady)); + addState(new CxeState(Playing, "Playing", Ready | Opening | NotReady)); + + setInitialState(NotReady); +} + +/*! + * Enables or disables the capture sound. If capture sound is forced to + * be always on, then the capture sound cannot be disabled. + * + * \param uid UID of the changed setting + * \param key Key of the changed setting + * \param value New setting value + */ +void CxeSoundPlayerSymbian::enableSound(long int uid, unsigned long int key, QVariant value) +{ + + // selftimer is only interested in warning tones + if (uid == KCRUidProfileEngine.iUid && key == KProEngActiveWarningTones) { + CX_DEBUG_IN_FUNCTION(); + // possible values are: + // 0 -> warning tones off + // 1 -> warning tones on + bool warningTonesEnabled = (value.toInt() == 1); + + // update sound + mUseSound = mCaptureSoundForced || warningTonesEnabled; + } + + CX_DEBUG(("CxeSoundPlayerSymbian::enableSound <> Use sound [%d]", + mUseSound)); +} + +/*! + * Checks the initial capture sound settings based on profile warning tones + * and whether the capture sound is forced to be always on. Connects settings + * signal for capture sounds changes to enableCaptureSound slot. + * + * \sa enableCaptureSound() + */ +void CxeSoundPlayerSymbian::checkCaptureSoundSettings() +{ + + CX_DEBUG_ENTER_FUNCTION(); + + QVariant value(0); + + // get current profile setting for using camerasound + // camera sound follows warning tone setting + unsigned long int key = KProEngActiveWarningTones; + long int uid = KCRUidProfileEngine.iUid; + mSettings.get(uid, key, Cxe::Repository, value); + + // possible values are: + // 0 -> warning tones off + // 1 -> warning tones on + bool warningTonesEnabled = (value.toInt() == 1); + CX_DEBUG(("Warning tones enabled [%d]", value.toInt())); + + // check whether capture sound is forced or not + mCaptureSoundForced = mSettings.get(CxeSettingIds::CAPTURE_SOUND_ALWAYS_ON, false); + CX_DEBUG(("Capture sound forced [%d]", mCaptureSoundForced)); + + // use sound if forced on or warningtones are enabled + mUseSound = mCaptureSoundForced || warningTonesEnabled; + CX_DEBUG(("Use sound [%d]", mUseSound)); + + CX_DEBUG_EXIT_FUNCTION(); +} + + +// end of file +