os/mm/devsound/sounddevbt/src/swcodecwrapper/mmfBtSwCodecDataPath.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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