engine/src/SoundEngine.cpp
changeset 2 29cda98b007e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/engine/src/SoundEngine.cpp	Thu Feb 25 14:29:19 2010 +0000
@@ -0,0 +1,200 @@
+/*
+* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB
+*
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* EmbedDev AB - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <e32std.h>
+#include "SettingsEngine.h"
+#include "SoundEngine.h"
+#include "PodcastModel.h"
+#include "ShowInfo.h"
+#include "ShowEngine.h"
+
+CSoundEngine* CSoundEngine::NewL(CPodcastModel& aPodcastModel)
+{
+	CSoundEngine* self = new (ELeave) CSoundEngine(aPodcastModel);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+}
+
+CSoundEngine::~CSoundEngine()
+{	
+	iObservers.Close();
+}
+
+CSoundEngine::CSoundEngine(CPodcastModel& aPodcastModel): iPodcastModel(aPodcastModel)
+{
+}
+
+void CSoundEngine::ConstructL()
+{   
+}
+
+EXPORT_C void CSoundEngine::AddObserver(MSoundEngineObserver* aObserver)
+{
+	iObservers.Append(aObserver);
+}
+
+void CSoundEngine::RemoveObserver(MSoundEngineObserver* observer)
+	{
+	TInt index = iObservers.Find(observer);
+	
+	if (index > KErrNotFound)
+		{
+		iObservers.Remove(index);
+		}
+	}
+
+void CSoundEngine::OpenFileL(const TDesC& aFileName, TBool aPlayOnInit)
+{
+	iState = ESoundEngineNotInitialized;
+	iMaxPos = 0;
+	iLastOpenedFileName= aFileName;
+	
+	iPlayOnInit = aPlayOnInit;
+	iState = ESoundEngineOpening;
+}
+
+const TFileName& CSoundEngine::LastFileName()
+{
+	return iLastOpenedFileName;
+}
+
+EXPORT_C TTimeIntervalMicroSeconds CSoundEngine::Position()
+{
+	TTimeIntervalMicroSeconds pos = 0;
+	
+	if(iState > ESoundEngineOpening)
+	{
+		
+	}
+
+	// store maximum position, we need this if we get interrupted by a phone call
+	if (pos > iMaxPos) {
+		iMaxPos = pos;
+	}
+	return iMaxPos;
+}
+
+EXPORT_C void CSoundEngine::SetPosition(TUint aPos)
+{
+	if(iState > ESoundEngineOpening)
+	{
+		TTimeIntervalMicroSeconds pos = ((TUint64)aPos)*1000000;
+		if(iState == ESoundEnginePlaying)
+		{
+			//iPlayer->Pause();
+		}
+
+		iMaxPos = pos;
+		//iPlayer->SetPosition(pos);
+		
+		if(iState == ESoundEnginePlaying)
+		{
+			//iPlayer->Play();
+		}
+	}
+}
+
+EXPORT_C void CSoundEngine::Play()
+{
+	if(iState > ESoundEngineOpening)
+	{
+		//iPlayer->SetPosition(iMaxPos);
+		//iPlayer->Play();
+		iState = ESoundEnginePlaying;
+
+		NotifyPlaybackStarted();
+	}
+}
+
+EXPORT_C void CSoundEngine::Stop(TBool aMarkPlayed)
+{
+	if(iState > ESoundEngineOpening)
+	{
+		if (aMarkPlayed) {
+			// seem to need to do this here, even though we do it in MapcPlayComplete
+			iPodcastModel.PlayingPodcast()->SetPlayState(EPlayed);
+		}
+		iState = ESoundEngineStopped;
+		SetPosition(0);
+		//iPlayer->Stop();
+		//iPlayer->Close();
+		iMaxPos = 0;
+		
+		NotifyPlaybackStopped();
+	}
+}
+
+EXPORT_C void CSoundEngine::Pause(TBool aOverrideState)
+{
+	DP("Pause");
+	if(iState > ESoundEngineOpening || aOverrideState)
+	{
+		iState = ESoundEnginePaused;
+		//iPlayer->Pause();
+
+		// had a crash here, so we check for NULL first
+		if (iPodcastModel.PlayingPodcast() != NULL) {
+			iPodcastModel.PlayingPodcast()->SetPosition(iMaxPos);
+		}
+	}
+}
+
+EXPORT_C TSoundEngineState CSoundEngine::State()
+{
+	return iState;
+}
+
+void CSoundEngine::NotifyPlaybackStopped()
+	{
+	for (int i=0;i<iObservers.Count();i++) {
+		TRAPD(err, iObservers[i]->PlaybackStoppedL());
+	}
+	
+	}
+
+
+void CSoundEngine::NotifyPlaybackStarted()
+	{
+	for (int i=0;i<iObservers.Count();i++) {
+		TRAPD(err, iObservers[i]->PlaybackStartedL());
+	}
+	
+	}
+
+void CSoundEngine::NotifyPlaybackInitialized()
+	{
+	for (int i=0;i<iObservers.Count();i++) {
+		TRAPD(err, iObservers[i]->PlaybackInitializedL());
+	}
+	}
+
+void CSoundEngine::NotifyVolumeChanged()
+	{
+	TInt max = 0;//iPlayer->MaxVolume();
+	
+	TInt vol = 0;
+	//iPlayer->GetVolume(vol);
+	
+	DP2("NotifyVolumeChanged, vol=%d, max=%d", vol, max);
+	for (int i=0;i<iObservers.Count();i++) {
+		TRAPD(err, iObservers[i]->VolumeChanged(vol, max));
+	}
+	
+	}