--- /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 <cxesoundplayersymbian.h>
+#include <AudioPreference.h>
+#include <ProfileEngineSDKCRKeys.h>
+#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<CxeSoundPlayerSymbian::State>();
+ 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<State>(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<bool>(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
+