devsound/devsoundrefplugin/src/swcodecwrapper/mmfSwCodecDataPath.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/devsoundrefplugin/src/swcodecwrapper/mmfSwCodecDataPath.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,155 @@
+// 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:
+// source\server\mmfswcodecdatapath.cpp
+// 
+//
+
+#include "mmfSwCodecDataPath.h"
+
+
+CMMFSwCodecDataPath::~CMMFSwCodecDataPath()
+	{
+
+	}
+	
+/**
+Retrieves a custom interface to the device.
+Usually the derived class should
+return the implementation for this.
+
+@param	aInterface
+		Interface UID, defined with the custom interface.
+		
+@return NULL 
+
+*/
+TAny* CMMFSwCodecDataPath::CustomInterface(TUid /*aInterface*/)
+	{
+	return NULL;
+	}
+	
+	
+
+/*
+ * CycleAudioBufferL
+ *
+ * Sets up a usable buffer for passing to MMF
+ *	
+ * This method has been written such that it must allocate a new buffer before
+ * replacing the existing one. The purpose of this is to force creation of a 
+ * new buffer. Simply deleting and then re-allocing may result in the same 
+ * address being used.
+ * 
+ * Only cycles if there is enough memory
+ *
+ */
+#ifdef __CYCLE_MMF_DATABUFFERS__
+CMMFDataBuffer* CMMFSwCodecDataPath::CycleAudioBuffer(CMMFDataBuffer* aBuffer)
+	{
+	CMMFDataBuffer* buffer = NULL;
+	TUint bufferSize = aBuffer->Data().MaxLength();
+
+#ifdef __USE_MMF_TRANSFERBUFFERS__
+	TRAPD(err, buffer = CreateTransferBufferL(bufferSize, static_cast<CMMFTransferBuffer*>(aBuffer)));
+#else
+	TRAPD(err,buffer = CMMFDataBuffer::NewL(bufferSize));
+
+	if (err == KErrNone)
+		{
+		delete aBuffer;
+		}
+#endif
+	if (err != KErrNone)
+		{//there was a problem creating buffer eg OOM so use same buffer
+		buffer = aBuffer;
+		}
+
+	return buffer;
+
+	}
+#endif
+
+/*
+ * DoCleanupRHandleBase
+ *
+ * This method will initially Close the handle and then delete it.
+ *
+ */
+#ifdef __USE_MMF_TRANSFERBUFFERS__
+inline static void DoCleanupRHandleBase(TAny* aRHandleBase)
+	{
+	ASSERT(aRHandleBase);
+	RHandleBase* rHandleBase = STATIC_CAST(RHandleBase*, aRHandleBase);
+	TRAPD(error, rHandleBase->Close());
+	delete aRHandleBase;
+	}
+
+CMMFTransferBuffer* CMMFSwCodecDataPath::CreateTransferBufferL(TUint aBufferSize, CMMFTransferBuffer* aOldBuffer)
+	{
+	CMMFTransferBuffer* buffer = NULL;
+
+	RTransferBuffer* transBuffer = new  (ELeave) RTransferBuffer;
+	
+	TCleanupItem bufferCleanupItem(DoCleanupRHandleBase, transBuffer); //closes and deletes.
+	CleanupStack::PushL(bufferCleanupItem);
+
+	RTransferWindow* transWindow = new (ELeave) RTransferWindow;
+	
+	TCleanupItem windowCleanupItem(DoCleanupRHandleBase, transWindow); //closes and deletes.
+	CleanupStack::PushL(windowCleanupItem);
+
+	User::LeaveIfError(transBuffer->Create(aBufferSize));
+	User::LeaveIfError(transWindow->Create(aBufferSize));
+	User::LeaveIfError(transWindow->MapInBuffer(*transBuffer));
+
+	buffer = CMMFTransferBuffer::NewL(*transWindow);
+
+	delete aOldBuffer; //closes RTransferWindow
+	delete iTransferWindow;
+
+	if(iTransferBuffer)
+		{
+		iTransferBuffer->Close();
+		}
+	delete iTransferBuffer;
+
+	iTransferBuffer = transBuffer;
+	iTransferWindow = transWindow;
+
+	CleanupStack::Pop(transWindow); 
+	CleanupStack::Pop(transBuffer); 
+
+	return buffer;
+	}
+#endif
+
+
+#ifdef __USE_MMF_PTRBUFFERS__
+CMMFPtrBuffer* CMMFSwCodecDataPath::CreatePtrBufferL(TUint aBufferSize)
+	{
+	CMMFPtrBuffer* buffer = NULL;
+	if (iPtrBufferMemoryBlock)
+		{
+		delete iPtrBufferMemoryBlock;//incase already exisits
+		iPtrBufferMemoryBlock = NULL;
+		}
+	iPtrBufferMemoryBlock = HBufC8::NewL(aBufferSize);
+	TPtr8 ptrMemoryBlock(iPtrBufferMemoryBlock->Des());
+	buffer = CMMFPtrBuffer::NewL(ptrMemoryBlock);
+	return buffer;
+	}
+#endif  // __USE_MMF_PTRBUFFERS__
+
+
+