devsound/devsoundrefplugin/src/swcodecwrapper/mmfSwCodecDataPath.cpp
author hgs
Wed, 13 Oct 2010 12:08:48 +0100
changeset 3 28bdc4aca325
parent 0 79dd3e2336a0
permissions -rw-r--r--
2010wk42_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     2
// All rights reserved.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     7
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    10
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    11
// Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    12
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    13
// Description:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    14
// source\server\mmfswcodecdatapath.cpp
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    15
// 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    16
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    17
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    18
#include "mmfSwCodecDataPath.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
CMMFSwCodecDataPath::~CMMFSwCodecDataPath()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
Retrieves a custom interface to the device.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
Usually the derived class should
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
return the implementation for this.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
@param	aInterface
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
		Interface UID, defined with the custom interface.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
@return NULL 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
*/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
TAny* CMMFSwCodecDataPath::CustomInterface(TUid /*aInterface*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
	return NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    41
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    42
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    43
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    44
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
 * CycleAudioBufferL
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
 * Sets up a usable buffer for passing to MMF
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
 *	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
 * This method has been written such that it must allocate a new buffer before
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
 * replacing the existing one. The purpose of this is to force creation of a 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
 * new buffer. Simply deleting and then re-allocing may result in the same 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
 * address being used.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
 * 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
 * Only cycles if there is enough memory
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
#ifdef __CYCLE_MMF_DATABUFFERS__
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
CMMFDataBuffer* CMMFSwCodecDataPath::CycleAudioBuffer(CMMFDataBuffer* aBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
	CMMFDataBuffer* buffer = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
	TUint bufferSize = aBuffer->Data().MaxLength();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
#ifdef __USE_MMF_TRANSFERBUFFERS__
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
	TRAPD(err, buffer = CreateTransferBufferL(bufferSize, static_cast<CMMFTransferBuffer*>(aBuffer)));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
#else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
	TRAPD(err,buffer = CMMFDataBuffer::NewL(bufferSize));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
	if (err == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
		delete aBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
#endif
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
	if (err != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
		{//there was a problem creating buffer eg OOM so use same buffer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
		buffer = aBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
	return buffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
#endif
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
 * DoCleanupRHandleBase
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
 * This method will initially Close the handle and then delete it.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
#ifdef __USE_MMF_TRANSFERBUFFERS__
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
inline static void DoCleanupRHandleBase(TAny* aRHandleBase)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
	ASSERT(aRHandleBase);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
	RHandleBase* rHandleBase = STATIC_CAST(RHandleBase*, aRHandleBase);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
	TRAPD(error, rHandleBase->Close());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
	delete aRHandleBase;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
CMMFTransferBuffer* CMMFSwCodecDataPath::CreateTransferBufferL(TUint aBufferSize, CMMFTransferBuffer* aOldBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
	CMMFTransferBuffer* buffer = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
	RTransferBuffer* transBuffer = new  (ELeave) RTransferBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
	TCleanupItem bufferCleanupItem(DoCleanupRHandleBase, transBuffer); //closes and deletes.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
	CleanupStack::PushL(bufferCleanupItem);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
	RTransferWindow* transWindow = new (ELeave) RTransferWindow;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
	TCleanupItem windowCleanupItem(DoCleanupRHandleBase, transWindow); //closes and deletes.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
	CleanupStack::PushL(windowCleanupItem);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
	User::LeaveIfError(transBuffer->Create(aBufferSize));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
	User::LeaveIfError(transWindow->Create(aBufferSize));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
	User::LeaveIfError(transWindow->MapInBuffer(*transBuffer));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
	buffer = CMMFTransferBuffer::NewL(*transWindow);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
	delete aOldBuffer; //closes RTransferWindow
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119
	delete iTransferWindow;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   120
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   121
	if(iTransferBuffer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   122
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   123
		iTransferBuffer->Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   124
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   125
	delete iTransferBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   126
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   127
	iTransferBuffer = transBuffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   128
	iTransferWindow = transWindow;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   129
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   130
	CleanupStack::Pop(transWindow); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   131
	CleanupStack::Pop(transBuffer); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   132
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   133
	return buffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   134
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   135
#endif
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   136
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   137
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   138
#ifdef __USE_MMF_PTRBUFFERS__
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   139
CMMFPtrBuffer* CMMFSwCodecDataPath::CreatePtrBufferL(TUint aBufferSize)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   140
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   141
	CMMFPtrBuffer* buffer = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   142
	if (iPtrBufferMemoryBlock)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   143
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   144
		delete iPtrBufferMemoryBlock;//incase already exisits
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   145
		iPtrBufferMemoryBlock = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   146
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   147
	iPtrBufferMemoryBlock = HBufC8::NewL(aBufferSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   148
	TPtr8 ptrMemoryBlock(iPtrBufferMemoryBlock->Des());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   149
	buffer = CMMFPtrBuffer::NewL(ptrMemoryBlock);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   150
	return buffer;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   151
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   152
#endif  // __USE_MMF_PTRBUFFERS__
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   153
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   154
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   155