--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/devsoundrefplugin/tsrc/swcdwrap/TSU_MMF_SWCDWRAP_PlayHwDevObserver.cpp Fri Oct 08 19:40:43 2010 +0100
@@ -0,0 +1,220 @@
+// Copyright (c) 2003-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:
+//
+
+// Test system includes
+#include "TSU_MMF_SWCDWRAP_PlayHwDevObserver.h"
+
+CTestPlayMMFHwDeviceObserver::CTestPlayMMFHwDeviceObserver(CMMFHwDevice* aHwDevice) : CTestMMFHwDeviceObserver(aHwDevice)
+ {
+ iStopActiveSchedulerOnStop = ETrue;
+ iCallPauseAndResumeAfterSendingLastBuffer = EFalse;
+ }
+
+CTestPlayMMFHwDeviceObserver::~CTestPlayMMFHwDeviceObserver()
+ {
+ iSourceFile.Close();
+ delete iDataBuffer;
+ delete iFileReader;
+ }
+
+
+TInt CTestPlayMMFHwDeviceObserver::FillBufferFromFileSync(const TDesC& aFileName, TUint aBufferSize)
+ {
+ TInt error = KErrNone;
+ iStopped = EFalse;
+
+ if (!iFileServerSession.Handle())
+ {//open a handle to the file server
+ error = iFileServerSession.Connect();
+ }
+
+ if (!error)
+ {//have a file server session so open file
+ error = iSourceFile.Open(iFileServerSession, aFileName, EFileRead);
+ }
+
+ if (!error)
+ {//create buffer to store source data
+ if (iDataBuffer)
+ {
+ delete iDataBuffer;
+ iDataBuffer = NULL;
+ }
+ TRAP(error, iDataBuffer = HBufC8::NewL(aBufferSize));
+ }
+
+ if (!error)
+ {//read file into the source buffer
+ TPtr8 dataBufferDes(const_cast<TUint8*>(iDataBuffer->Ptr()), aBufferSize);
+ iSourceFile.Read(dataBufferDes);
+ iAsyncMode = EFalse;
+ }
+
+ return error;
+ }
+
+
+TInt CTestPlayMMFHwDeviceObserver::ReadBufferDirectFromFileAsync(const TDesC& aFileName, TUint aNumberOfBuffers)
+ {
+ TInt error = KErrNone;
+ iStopped = EFalse;
+
+ if (!iFileServerSession.Handle())
+ {//open a handle to the file server
+ error = iFileServerSession.Connect();
+ }
+
+ if (!error)
+ {//have a file server session so open file
+ error = iSourceFile.Open(iFileServerSession, aFileName, EFileRead);
+ }
+
+ if (!error)
+ {
+ if (!iFileReader)
+ TRAP(error,iFileReader = new(ELeave) CTestFileReader(iSourceFile, this));
+ }
+
+ if (!error)
+ {
+ iNumberOfBuffers = aNumberOfBuffers;
+ iAsyncMode = ETrue;
+ }
+
+ return error;
+ }
+
+
+TInt CTestPlayMMFHwDeviceObserver::FillThisHwBuffer(CMMFBuffer& aHwDataBuffer)
+ {
+ //called on playing when buffer needs to be filled with data to play
+ TInt error = KErrNone;
+ iCurrentBufferNumber++; //first buffer is buffer #1
+ iCurrentHwDeviceDataBuffer = &(static_cast<CMMFDataBuffer&>(aHwDataBuffer));
+
+ if (iAsyncMode)
+ error = FillThisHwBufferFromFile(*iCurrentHwDeviceDataBuffer);
+ else
+ error = FillThisHwBufferFromDes(*iCurrentHwDeviceDataBuffer);
+ if (!iError)
+ iError = error; //log error in observer error
+ return error;
+ }
+
+
+TInt CTestPlayMMFHwDeviceObserver::FillThisHwBufferFromDes(CMMFDataBuffer& aHwDataBuffer)
+ {
+ CMMFDataBuffer* dataBuffer = static_cast<CMMFDataBuffer*>(&aHwDataBuffer);
+
+ TUint bufferSize = 0;
+ if (dataBuffer->RequestSize())
+ bufferSize = dataBuffer->RequestSize();
+ else bufferSize = dataBuffer->Data().MaxLength();
+
+ TUint sourceDataLength = static_cast<TUint>(iDataBuffer->Des().MaxLength());
+
+ if (iBufferPosition < sourceDataLength)
+ {
+ if ((sourceDataLength - iBufferPosition) <= bufferSize)
+ {//reached end of data
+ bufferSize = (sourceDataLength - iBufferPosition);
+ dataBuffer->SetLastBuffer(ETrue);
+ }
+ dataBuffer->Data().Copy((iDataBuffer->Ptr()+iBufferPosition), bufferSize);
+ iBufferPosition+=bufferSize;
+ }
+ else
+ {//have exceeded length of data
+ dataBuffer->SetLastBuffer(ETrue);
+ }
+
+ return iHwDevice->ThisHwBufferFilled(*dataBuffer);
+ }
+
+
+TInt CTestPlayMMFHwDeviceObserver::FillThisHwBufferFromFile(CMMFDataBuffer& aHwDataBuffer)
+ {
+ return iFileReader->Read(aHwDataBuffer);
+ }
+
+
+void CTestPlayMMFHwDeviceObserver::FileReadComplete(TInt aError)
+ {
+ if (aError == KErrNone)
+ {
+ if (iCurrentBufferNumber >= iNumberOfBuffers)
+ {
+ iCurrentHwDeviceDataBuffer->SetLastBuffer(ETrue);
+ }
+ if (iCurrentHwDeviceDataBuffer->BufferSize()
+ < static_cast<TUint>(iCurrentHwDeviceDataBuffer->Data().MaxLength()))
+ {//EOF
+ iCurrentHwDeviceDataBuffer->SetLastBuffer(ETrue);
+ }
+ TInt error = iHwDevice->ThisHwBufferFilled(*iCurrentHwDeviceDataBuffer);
+ if (iCallPauseAndResumeAfterSendingLastBuffer&&iCurrentHwDeviceDataBuffer->LastBuffer())
+ {
+ TInt err = iHwDevice->Pause();
+ iCallPauseAndResumeAfterSendingLastBuffer = EFalse;//only call pause once
+ if (!err)//resume
+ err = iHwDevice->Start(EDevDecode, EDevOutFlow);
+ if (!error)//note could potentialy have 2 errors here err & error
+ error = err; //if so swallow the second error err and keep first
+ }
+ if (!iError)
+ iError = error; //log error in observer error
+ }
+ else
+ {
+ iError = aError;
+ }
+ }
+
+
+void CTestPlayMMFHwDeviceObserver::Stopped()
+ {
+ if (iStopActiveSchedulerOnStop)
+ {
+ StopActiveScheduler();
+ }
+ iStopped = ETrue;
+ }
+
+
+RFile& CTestPlayMMFHwDeviceObserver::ReadFile()
+ {
+ return iSourceFile;
+ }
+
+void CTestPlayMMFHwDeviceObserver::CancelFileRead()
+ {
+ iFileReader->Cancel();
+ }
+
+TBool CTestPlayMMFHwDeviceObserver::IsStopped()
+ {
+ return iStopped;
+ }
+
+void CTestPlayMMFHwDeviceObserver::StopActiveSchedulerOnStop(TBool aStopActiveSchedulerOnStop)
+ {
+ iStopActiveSchedulerOnStop = aStopActiveSchedulerOnStop;
+ }
+
+void CTestPlayMMFHwDeviceObserver::CallPauseAndResumeAfterSendingLastBuffer()
+ {
+ iCallPauseAndResumeAfterSendingLastBuffer = ETrue;
+ }
+