devsound/sounddevbt/src/swcodecwrapper/mmfBtSwCodecDataPath.cpp
changeset 0 40261b775718
equal deleted inserted replaced
-1:000000000000 0:40261b775718
       
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // source\server\MmfBtSwCodecDatapath.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #include "mmfBtSwCodecDataPath.h"
       
    19 
       
    20 CMMFSwCodecDataPath::~CMMFSwCodecDataPath()
       
    21 	{
       
    22 	}
       
    23 
       
    24 /*
       
    25  * CycleAudioBufferL
       
    26  *
       
    27  * Sets up a usable buffer for passing to MMF
       
    28  *	
       
    29  * This method has been written such that it must allocate a new buffer before
       
    30  * replacing the existing one. The purpose of this is to force creation of a 
       
    31  * new buffer. Simply deleting and then re-allocing may result in the same 
       
    32  * address being used.
       
    33  * 
       
    34  * Only cycles if there is enough memory
       
    35  *
       
    36  */
       
    37 #ifdef __CYCLE_MMF_DATABUFFERS__
       
    38 CMMFDataBuffer* CMMFSwCodecDataPath::CycleAudioBuffer(CMMFDataBuffer* aBuffer)
       
    39 	{
       
    40 	CMMFDataBuffer* buffer = NULL;
       
    41 	TUint bufferSize = aBuffer->Data().MaxLength();
       
    42 
       
    43 #ifdef __USE_MMF_TRANSFERBUFFERS__
       
    44 	TRAPD(err, buffer = CreateTransferBufferL(bufferSize, static_cast<CMMFTransferBuffer*>(aBuffer)));
       
    45 #else
       
    46 	TRAPD(err,buffer = CMMFDataBuffer::NewL(bufferSize));
       
    47 
       
    48 	if (err == KErrNone)
       
    49 		{
       
    50 		delete aBuffer;
       
    51 		}
       
    52 #endif
       
    53 	if (err != KErrNone)
       
    54 		{//there was a problem creating buffer eg OOM so use same buffer
       
    55 		buffer = aBuffer;
       
    56 		}
       
    57 
       
    58 	return buffer;
       
    59 
       
    60 	}
       
    61 #endif
       
    62 
       
    63 /*
       
    64  * DoCleanupRHandleBase
       
    65  *
       
    66  * This method will initially Close the handle and then delete it.
       
    67  *
       
    68  */
       
    69 #ifdef __USE_MMF_TRANSFERBUFFERS__
       
    70 inline static void DoCleanupRHandleBase(TAny* aRHandleBase)
       
    71 	{
       
    72 	ASSERT(aRHandleBase);
       
    73 	RHandleBase* rHandleBase = STATIC_CAST(RHandleBase*, aRHandleBase);
       
    74 	TRAPD(error, rHandleBase->Close());
       
    75 	delete aRHandleBase;
       
    76 	}
       
    77 
       
    78 CMMFTransferBuffer* CMMFSwCodecDataPath::CreateTransferBufferL(TUint aBufferSize, CMMFTransferBuffer* aOldBuffer)
       
    79 	{
       
    80 	CMMFTransferBuffer* buffer = NULL;
       
    81 
       
    82 	RTransferBuffer* transBuffer = new  (ELeave) RTransferBuffer;
       
    83 	
       
    84 	TCleanupItem bufferCleanupItem(DoCleanupRHandleBase, transBuffer); //closes and deletes.
       
    85 	CleanupStack::PushL(bufferCleanupItem);
       
    86 
       
    87 	RTransferWindow* transWindow = new (ELeave) RTransferWindow;
       
    88 	
       
    89 	TCleanupItem windowCleanupItem(DoCleanupRHandleBase, transWindow); //closes and deletes.
       
    90 	CleanupStack::PushL(windowCleanupItem);
       
    91 
       
    92 	User::LeaveIfError(transBuffer->Create(aBufferSize));
       
    93 	User::LeaveIfError(transWindow->Create(aBufferSize));
       
    94 	User::LeaveIfError(transWindow->MapInBuffer(*transBuffer));
       
    95 
       
    96 	buffer = CMMFTransferBuffer::NewL(*transWindow);
       
    97 
       
    98 	delete aOldBuffer; //closes RTransferWindow
       
    99 	delete iTransferWindow;
       
   100 
       
   101 	if(iTransferBuffer)
       
   102 		{
       
   103 		iTransferBuffer->Close();
       
   104 		}
       
   105 	delete iTransferBuffer;
       
   106 
       
   107 	iTransferBuffer = transBuffer;
       
   108 	iTransferWindow = transWindow;
       
   109 
       
   110 	CleanupStack::Pop(transWindow); 
       
   111 	CleanupStack::Pop(transBuffer); 
       
   112 
       
   113 	return buffer;
       
   114 	}
       
   115 #endif
       
   116 
       
   117 
       
   118 #ifdef __USE_MMF_PTRBUFFERS__
       
   119 CMMFPtrBuffer* CMMFSwCodecDataPath::CreatePtrBufferL(TUint aBufferSize)
       
   120 	{
       
   121 	CMMFPtrBuffer* buffer = NULL;
       
   122 	if (iPtrBufferMemoryBlock)
       
   123 		delete iPtrBufferMemoryBlock;//incase already exisits
       
   124 	iPtrBufferMemoryBlock = HBufC8::NewL(aBufferSize);
       
   125 	TPtr8 ptrMemoryBlock(iPtrBufferMemoryBlock->Des());
       
   126 	buffer = CMMFPtrBuffer::NewL(ptrMemoryBlock);
       
   127 	return buffer;
       
   128 	}
       
   129 #endif  // __USE_MMF_PTRBUFFERS__
       
   130 
       
   131