--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmdevicefw/mdf/src/codecapi/puloader.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,153 @@
+// Copyright (c) 2005-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:
+//
+
+/**
+ @file
+ @publishedPartner
+ @prototype
+*/
+
+#include <mdf/mdfprocessingunit.h>
+#include <mmf/common/mmfutilities.h>
+#include "puloader.h"
+#include <mdf/codecapiresolverdata.h>
+#include <mdf/codecapiuids.hrh>
+#include <mdf/codecapiresolver.hrh>
+#include <mm/mmcleanup.h>
+#include <ecom/ecom.h>
+
+static const TInt KMaxDataTypeLength = 126;
+
+CPuLoader* CPuLoader::NewL()
+ {
+ CPuLoader* self = new (ELeave) CPuLoader;
+ return self;
+ }
+
+
+CMdfProcessingUnit* CPuLoader::LoadProcessingUnitL(const MMdfProcessingUnitObserver& aProcessingUnitObserver,
+ TUid aImplementationUid)
+ {
+ CMdfProcessingUnit* pu = NULL;
+ pu = CMdfProcessingUnit::NewL(aImplementationUid);
+ CleanupStack::PushL(pu);
+ User::LeaveIfError(pu->Create(aProcessingUnitObserver));
+ CleanupStack::Pop(pu);
+ return pu;
+ }
+
+CMdfProcessingUnit* CPuLoader::LoadProcessingUnitL( const MMdfProcessingUnitObserver& aProcessingUnitObserver,
+ const TDesC8& aSrcDataType, const TDesC8& aDestDataType, const TUid& aImplementationType)
+ {
+ CCodecApiResolverData* customMatchData = CCodecApiResolverData::NewLC();
+ customMatchData->SetMatchType(EMatchInputAndOutputDataFormat);
+ customMatchData->SetImplementationType(aImplementationType);
+ // string value of the input source data
+ customMatchData->SetInputDataL(aSrcDataType);
+ customMatchData->SetOutputDataL(aDestDataType);
+
+ HBufC8* package = customMatchData->NewPackLC();
+
+ TEComResolverParams resolverParams; // Parameters on which to match
+ resolverParams.SetDataType(package->Des());
+
+ RImplInfoPtrArray ecomArray;
+ CleanupResetAndDestroyPushL(ecomArray);
+
+ REComSession::ListImplementationsL(TUid::Uid(KUidMdfProcessingUnit), resolverParams, TUid::Uid(KUidCodecApiResolverImplementation), ecomArray);
+
+ // check if there are any
+ TInt noOfProcessingUnits = ecomArray.Count();
+
+ if(noOfProcessingUnits == 0)
+ {
+ User::Leave(KErrNotFound);
+ }
+
+ CMdfProcessingUnit *processingUnit = NULL;
+ TInt index = 0;
+ TInt error = KErrNone;
+ do
+ {
+ // Iterate through the array until a plugin can be created without errors
+ const CImplementationInformation& puInfo = *(ecomArray[index++]);
+
+ TRAP(error, processingUnit = CMdfProcessingUnit::NewL(puInfo.ImplementationUid()));
+ }
+ while(index < noOfProcessingUnits && error != KErrNone);
+
+ if(error)
+ {
+ ASSERT(!processingUnit && index <= noOfProcessingUnits);
+ User::Leave(error);
+ }
+
+ CleanupStack::PopAndDestroy(3, customMatchData); // customMatchData, package, ecomArray
+
+
+ TInt err = processingUnit->Create(aProcessingUnitObserver);
+ if (err != KErrNone)
+ {
+ // delete processing unit before leaving
+ delete processingUnit;
+ User::Leave(err);
+ }
+ return processingUnit;
+ }
+
+CMdfProcessingUnit* CPuLoader::LoadProcessingUnitL( const MMdfProcessingUnitObserver& aProcessingUnitObserver,
+ TFourCC aSrcDataType, TFourCC aDestDataType)
+ {
+ HBufC8* packageSrcDataType = HBufC8::NewLC(KMaxDataTypeLength);
+ TPtr8 sourceDataType = packageSrcDataType->Des();
+ aSrcDataType.FourCC(&sourceDataType);
+
+ HBufC8* packageDestDataType = HBufC8::NewLC(KMaxDataTypeLength);
+ TPtr8 destinationDataType = packageDestDataType->Des();
+ aDestDataType.FourCC(&destinationDataType);
+
+ CMdfProcessingUnit* processingUnit = LoadProcessingUnitL(aProcessingUnitObserver, sourceDataType, destinationDataType, TUid::Uid(KUidAudioCodec));
+ CleanupStack::PopAndDestroy(2, packageSrcDataType);
+ return processingUnit;
+ }
+
+
+TInt CPuLoader::TunnelSetup(MMdfOutputPort& aOutputPort, MMdfInputPort& aInputPort)
+ {
+ TTunnelFlags tunnelFlags = EBufferReadOnly;
+ TSupplierType supplierType = EBufferSupplyUnspecified;
+ TUint error = KErrNone;
+
+ if ((error = aOutputPort.MopTunnelRequest(aInputPort, tunnelFlags, supplierType)) != KErrNone)
+ {
+ return error;
+ }
+ return aInputPort.MipTunnelRequest(aOutputPort,tunnelFlags,supplierType);
+ }
+
+
+void CPuLoader::UnloadProcessingUnit(CMdfProcessingUnit*& aPu)
+ {
+ delete aPu;
+ aPu = NULL;
+ }
+
+CPuLoader::CPuLoader()
+ {
+ }
+
+CPuLoader::~CPuLoader()
+ {
+ }