devsound/devsoundrefplugin/src/sounddevice/DevSoundUtility.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) 2001-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
// Class that provides API to list ECOM plugin implementation IDs
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 <e32std.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
#include <barsc.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
#include <barsread.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
#include <mmfbase.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
#include <mmfplugininterfaceuids.hrh>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
#include <fixedsequence.rsg>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
#include "DevSoundUtility.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
#include <mmf/common/mmfcontroller.h> //needed for CleanupResetAndDestroyPushL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
#include <mm/mmpluginutils.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
#ifdef SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
#include <mdf/codecapiresolverutils.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
#include <mdf/codecapiresolverdata.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
#include <mdf/codecapiuids.hrh>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
#include <mdf/codecapiresolver.hrh>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
#endif // SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
_LIT(KFixedSequenceResourceFile, "Z:\\Resource\\DevSound\\FixedSequence.rsc"); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
const TInt KFourCCStringLength = 9;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
inline TMMFRawPackage::TMMFRawPackage(TInt aDerivedSize)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
#pragma warning( disable : 4355 )	// 'this' : used in base member initializer list
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
: iThis((TUint8*)this,aDerivedSize,aDerivedSize) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
#pragma warning( default : 4355 )
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
inline TPtr8& TMMFRawPackage::Package()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
	{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
	((TMMFRawPackage*)this)->iThis.Set((TUint8*)this,iThis.Length(),iThis.MaxLength()); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
	return iThis; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
inline const TPtr8& TMMFRawPackage::Package() const
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
	{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
	((TMMFRawPackage*)this)->iThis.Set((TUint8*)this,iThis.Length(),iThis.MaxLength()); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
	return iThis; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
inline void TMMFRawPackage::SetSize(TInt aDerivedSize)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
	{ 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
	iThis.Set((TUint8*)this,aDerivedSize,aDerivedSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
inline TMMFToneFixedSequenceNames::TMMFToneFixedSequenceNames() :
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
TMMFRawPackage(sizeof(TMMFToneFixedSequenceNames)) {}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
#ifdef _UNICODE
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
class TNameBuf : public TBufCBase16
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
#else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
class TNameBuf : public TBufCBase8
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
#endif
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
	friend class HMMFToneFixedSequenceNames;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
	};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
HMMFToneFixedSequenceNames::HMMFToneFixedSequenceNames()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
	iCount = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
HMMFToneFixedSequenceNames* HMMFToneFixedSequenceNames::AddNameL(const TDesC& aName)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
// Append a copy of the supplied descriptor to the end of the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
// current heap cell. This will involve a realloc that will normally
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
// result in the object moving
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
	TInt size = Package().Length();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
	TInt desSize = aName.Size() + sizeof(TInt);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
	if (desSize&3) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
		desSize = ((desSize+4)&(~3)); // Must round up to word boundary to keep aligned
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
	HMMFToneFixedSequenceNames* self = REINTERPRET_CAST(HMMFToneFixedSequenceNames*,User::ReAllocL(STATIC_CAST(TAny*,this),size + desSize));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
	TUint8* newDesPtr = REINTERPRET_CAST(TUint8*,self) + size;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
	Mem::FillZ(newDesPtr,desSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
	TNameBuf* newDes = REINTERPRET_CAST(TNameBuf*,newDesPtr);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
	newDes->Copy(aName,aName.Length());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
	self->SetSize(size+desSize);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
	self->iCount++;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
	return self;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
/******************************************************************
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
 *				CMMFDevSoundUtility
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
 ******************************************************************/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
CMMFDevSoundUtility::CMMFDevSoundUtility()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
	// No default implementation
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
CMMFDevSoundUtility::~CMMFDevSoundUtility()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
	delete iInfo;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
	delete iFixedSequenceNames;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
CMMFDevSoundUtility* CMMFDevSoundUtility::NewL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
	CMMFDevSoundUtility* self = NewLC();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
	CleanupStack::Pop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
	return self;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   120
CMMFDevSoundUtility* CMMFDevSoundUtility::NewLC()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   121
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   122
	CMMFDevSoundUtility* self = new(ELeave) CMMFDevSoundUtility();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   123
	CleanupStack::PushL(self);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   124
	self->ConstructL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   125
	// Leave it on Cleanupstack
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   126
	return self;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   127
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   128
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   129
void CMMFDevSoundUtility::ConstructL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   130
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   131
	iFixedSequenceNames = new (ELeave) HMMFToneFixedSequenceNames;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   132
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   133
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   134
void CMMFDevSoundUtility::SeekUsingFourCCL(TUid aInterfaceUid, RImplInfoPtrArray& aPlugInArray, const TFourCC& aSrcDataType, const TFourCC& aDstDataType, const TDesC& aPreferredSupplier)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   135
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   136
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   137
	// Create a match string using the two FourCC codes.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   138
	_LIT8(KEmptyFourCCString, "    ,    ");
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   139
	TBufC8<KFourCCStringLength> fourCCString(KEmptyFourCCString);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   140
	TPtr8 fourCCPtr = fourCCString.Des();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   141
	TPtr8 fourCCPtr1(&fourCCPtr[0], 4);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   142
	TPtr8 fourCCPtr2(&fourCCPtr[5], 4 );
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   143
	aSrcDataType.FourCC(&fourCCPtr1);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   144
	aDstDataType.FourCC(&fourCCPtr2);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   145
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   146
	MmPluginUtils::FindImplementationsL(aInterfaceUid, aPlugInArray, fourCCPtr);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   147
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   148
	// If more than one match.  Narrow the search by preferred supplier
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   149
	if((aPlugInArray.Count() > 1) && aPreferredSupplier.Length())
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   150
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   151
		SelectByPreference( aPlugInArray, aPreferredSupplier );
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   152
		}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   153
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   154
	// If there are no plugins, return failure
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   155
	if(aPlugInArray.Count() == 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   156
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   157
		User::Leave( KErrNotFound );
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   158
		}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   159
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   160
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   161
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   162
#ifdef SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   163
void CMMFDevSoundUtility::FindHwDeviceAdapterL(TUid aInterfaceUid, RImplInfoPtrArray& aPlugInArray)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   164
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   165
	// Create a match string using the two FourCC codes.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   166
	_LIT8(KAdapterMatch, "*");
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   167
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   168
	MmPluginUtils::FindImplementationsL(aInterfaceUid, aPlugInArray, KAdapterMatch);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   169
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   170
	// If there are no plugins, return failure
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   171
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   172
	if(aPlugInArray.Count() == 0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   173
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   174
		User::Leave( KErrNotFound );
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   175
		}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   176
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   177
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   178
void CMMFDevSoundUtility::SeekCodecPluginsL(RArray<TFourCC>& aSupportedDataTypes, TMMFState aState, TBool aAppend)	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   179
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   180
	_LIT8(KPCM16FourCCString, " P16");
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   181
	//check argument precondition for aState
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   182
	if ((aState != EMMFStatePlaying) && (aState != EMMFStateRecording))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   183
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   184
		User::Leave(KErrArgument);		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   185
		}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   186
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   187
	if (!aAppend)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   188
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   189
		aSupportedDataTypes.Reset(); //clear any existing data in aSupportedDataTypes array if not appending
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   190
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   191
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   192
	CCodecApiResolverData* customMatchData = CCodecApiResolverData::NewLC();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   193
	if (aState == EMMFStatePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   194
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   195
		customMatchData->SetMatchType(EMatchOutputDataFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   196
		customMatchData->SetOutputDataL(KPCM16FourCCString);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   197
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   198
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   199
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   200
		customMatchData->SetMatchType(EMatchInputDataFormat);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   201
		customMatchData->SetInputDataL(KPCM16FourCCString);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   202
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   203
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   204
	customMatchData->SetImplementationType(TUid::Uid(KUidAudioCodec));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   205
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   206
	HBufC8* package = customMatchData->NewPackLC();	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   207
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   208
	RImplInfoPtrArray ecomArray;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   209
	CleanupResetAndDestroyPushL(ecomArray);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   210
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   211
	TInt err = KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   212
	MmPluginUtils::FindImplementationsL(TUid::Uid(KUidMdfProcessingUnit), ecomArray, *package, TUid::Uid(KUidCodecApiResolverImplementation));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   213
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   214
	for (TInt i=0 ; i < ecomArray.Count() ; i++)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   215
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   216
		CCodecApiOpaqueData* data = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   217
		TRAP(err, data =  CCodecApiOpaqueData::NewL(ecomArray[i]->OpaqueData()));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   218
		// simply ignore plugins that we can't parse the opaque data. They should not cause other plugins
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   219
		// to fall over
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   220
		if (err == KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   221
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   222
			const TDesC8* dataType;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   223
			if (aState == EMMFStatePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   224
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   225
				dataType = &data->InputDataType();	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   226
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   227
			else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   228
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   229
				dataType = &data->OutputDataType();	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   230
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   231
			TFourCC fourCC(*dataType);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   232
			delete data;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   233
			aSupportedDataTypes.AppendL(fourCC);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   234
			}		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   235
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   236
	CleanupStack::PopAndDestroy(3, customMatchData);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   237
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   238
#endif // SYMBIAN_MULTIMEDIA_CODEC_API
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   239
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   240
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   241
 * local function to disable items which do not match the preferred supplier.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   242
 * Note that at least one enabled item is returned (if there was an enabled item to begin with) which
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   243
 * may not match the preferred supplier.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   244
 * 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   245
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   246
void CMMFDevSoundUtility::SelectByPreference( RImplInfoPtrArray& aPlugInArray, const TDesC& aPreferredSupplier ) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   247
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   248
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   249
	// Use the Disabled flag to eliminated all currently enabled matches that
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   250
	// do not match the preferred supplier.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   251
	TInt firstEnabled = -1 ; // to ensure that we return something valid
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   252
	TInt matchCount = 0 ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   253
	for ( TInt ii = 0 ; ii < aPlugInArray.Count() ; ii++ )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   254
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   255
		if ( !( aPlugInArray[ii]->Disabled() ) )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   256
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   257
			if ( firstEnabled == -1 )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   258
				firstEnabled = ii ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   259
			if ( aPlugInArray[ii]->DisplayName().FindF( aPreferredSupplier ) == KErrNotFound )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   260
				aPlugInArray[ii]->SetDisabled( ETrue ) ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   261
			else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   262
				matchCount++ ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   263
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   264
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   265
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   266
	// If there are no matches then re-enable the first enabled
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   267
	if ( matchCount == 0 )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   268
		aPlugInArray[firstEnabled]->SetDisabled( EFalse ) ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   269
	else if ( matchCount > 1 )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   270
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   271
		// find the latest version from more than one match
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   272
		TInt highestVersionIndex = -1 ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   273
		for ( TInt ii = 0 ; ii < aPlugInArray.Count() ; ii++ )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   274
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   275
			if ( !( aPlugInArray[ii]->Disabled() ) )  // only interested in enabled elements
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   276
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   277
				if ( highestVersionIndex == -1 )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   278
					{ // first match.  Store this.  Keep it enabled
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   279
					highestVersionIndex = ii ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   280
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   281
				else if ( aPlugInArray[ii]->Version() > aPlugInArray[highestVersionIndex]->Version() )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   282
					{ // a new leader.  Disable the previous leader.  Keep this one.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   283
					aPlugInArray[highestVersionIndex]->SetDisabled( ETrue ) ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   284
					highestVersionIndex = ii ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   285
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   286
				else  // we already have a higher version.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   287
					aPlugInArray[ii]->SetDisabled( ETrue ) ;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   288
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   289
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   290
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   291
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   292
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   293
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   294
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   295
 *  SeekHwDevicePluginsL
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   296
 *  This method looks for hwDevicePlugins that support the state given in aState which
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   297
 *  must be either EMMFStatePlaying or EMMFStateRecording
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   298
 *  For each HwDevice plugin found the datatype as indicated by its fourCC code
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   299
 *  from the default_data field in the resource file is added to the array of aSupportedDataTypes
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   300
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   301
 *  @internalComponent
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   302
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   303
 *	@param	"RArray<TFourCC>& aSupportedDataTypes"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   304
 *  an array of fourCC codes that has a fourCC code added to for each hardware device found
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   305
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   306
 *	@param  "TMMFState aState"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   307
 *  must be set to EMMFStatePlaying if seeking HwDevice plugins that support play and
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   308
 *  EMMFStateRecording if seeking HwDevice plugins that support record
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   309
 *	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   310
 *  @leave KErrArgument if aState is not EMMFStatePlaying or EMMFStateRecording else leaves
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   311
 *  with standard symbian OS error code
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   312
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   313
void CMMFDevSoundUtility::SeekHwDevicePluginsL(RArray<TFourCC>& aSupportedDataTypes, TMMFState aState)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   314
	{	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   315
	//check argument precondition for aState
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   316
	if ((aState != EMMFStatePlaying) && (aState != EMMFStateRecording))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   317
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   318
		User::Leave(KErrArgument);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   319
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   320
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   321
	aSupportedDataTypes.Reset(); //clear any existing data in aSupportedDataTypes array
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   322
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   323
	RImplInfoPtrArray plugInArray ; // Array to return hw device plugin resource info
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   324
	CleanupResetAndDestroyPushL(plugInArray);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   325
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   326
	TUid KUidMmfHWPluginInterfaceCodec = {KMmfUidPluginInterfaceHwDevice};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   327
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   328
	MmPluginUtils::FindImplementationsL(KUidMmfHWPluginInterfaceCodec, plugInArray);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   329
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   330
	TUint numberOfHwDevicePlugins = plugInArray.Count();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   331
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   332
	//if have hwdevice plugin resource entries then scan entries
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   333
	//matching on a datatype of pcm16 as the destination datatype for play and the 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   334
	//source datatype for record
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   335
	//if a match is found and isn't already in list of supported data types
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   336
	//then add it to the list
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   337
	if (numberOfHwDevicePlugins)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   338
		{					
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   339
		CImplementationInformation* hwDeviceResourceEntry = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   340
		_LIT8(KPCM16FourCCString, " P16");
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   341
		TBufC8<KFourCCLength> fourCCStringPCM16(KPCM16FourCCString);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   342
		TPtr8 fourCCPtrPCM16 = fourCCStringPCM16.Des();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   343
		TUint entryNumber = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   344
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   345
		//check each resource entry for dst 4CC = P16 for play and src 4CC = P16 for record
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   346
		for (TUint hwDeviceEntry = 0; hwDeviceEntry < numberOfHwDevicePlugins; hwDeviceEntry++)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   347
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   348
			hwDeviceResourceEntry = plugInArray[hwDeviceEntry];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   349
			if (IsDataTypeMatch(hwDeviceResourceEntry, fourCCPtrPCM16, aState))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   350
				{//resource entry data field has dest/src datatype ' P16' ie pcm16 for play/record
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   351
				TPtrC8 fourCCPtr(0,0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   352
				if (aState == EMMFStatePlaying)//then datatype supported 4CC is left 4 chars
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   353
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   354
					fourCCPtr.Set(hwDeviceResourceEntry->DataType().Left(KFourCCLength));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   355
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   356
				else if (aState == EMMFStateRecording) //then datatype supported 4CC is right 4 chars
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   357
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   358
					fourCCPtr.Set(hwDeviceResourceEntry->DataType().Right(KFourCCLength));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   359
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   360
				TFourCC fourCCEntry(fourCCPtr);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   361
				//need to check if entry already exists to prevent duplicate entries
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   362
				entryNumber = aSupportedDataTypes.Count();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   363
				TBool alreadyExists = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   364
				for (TUint fourCCEntryNumber = 0; fourCCEntryNumber < entryNumber; fourCCEntryNumber++)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   365
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   366
					if (aSupportedDataTypes[fourCCEntryNumber]==fourCCEntry)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   367
						{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   368
						alreadyExists = ETrue;//we already have this 4CC in the supported data types
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   369
						break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   370
						}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   371
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   372
				if (!alreadyExists)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   373
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   374
					TInt err = aSupportedDataTypes.Append(fourCCEntry);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   375
					if (err)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   376
						{//note we don't destroy array because we don't own it
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   377
						//but we do reset it as it is incomplete
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   378
						aSupportedDataTypes.Reset();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   379
						User::Leave(err);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   380
						}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   381
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   382
				}//if (IsDataTypeMatch(hwDeviceResourceEntry, fourCCPtrPCM16, aState))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   383
			}//for (TUint hwDeviceEntry = 0; hwDeviceEntry < numberOfHwDevicePlugins; hwDeviceEntry++)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   384
		}//if (numberOfHwDevicePlugins)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   385
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   386
	CleanupStack::PopAndDestroy(&plugInArray);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   387
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   388
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   389
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   390
/*
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   391
 *	IsDataTypeMatch
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   392
 *  This method takes a given resource entry from a hardware device and determines 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   393
 *  whether the hwdevice plugin is a data type match for playing or recording
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   394
 *  depending on the setting of aState
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   395
 *  The method matchs the default_data field from the hw device resource entry matching
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   396
 *  it with the aHwMatchFourCC code.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   397
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   398
 *  @internalComponent
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   399
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   400
 *	@param	"CImplementationInformation aHwDeviceResourceEntry"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   401
 *  the hw device resource entry that is to be checked 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   402
 *  whether it can be used to play or record
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   403
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   404
 *	@param  "TDesC8& aHwMatchFourCC
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   405
 *	the data type fourCC code to match to that the hardware device that must convert to for
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   406
 *	playing and convert from for recording - for the reference DevSound this is always ' P16' ie pcm16
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   407
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   408
 *  @param "TMMFState aState"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   409
 *  this determines whether the match is for playing or recording and should take 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   410
 *  either the values EMMFStatePlaying or EMMFStateRecording
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   411
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   412
 *  @return ETrue if a match for play or record else EFalse
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   413
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   414
TBool CMMFDevSoundUtility::IsDataTypeMatch(CImplementationInformation* aHwDeviceResourceEntry,const TDesC8& aHwMatchFourCC, TMMFState aState)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   415
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   416
	TBool match = EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   417
	// extra length safety check to remove adapter plugins and incorrect ones
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   418
	if (aHwDeviceResourceEntry->DataType().Length()>=KFourCCStringLength)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   419
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   420
		if (aState == EMMFStatePlaying)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   421
			{//play need to match with the right four characters
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   422
			match =  (!(aHwMatchFourCC.Match(aHwDeviceResourceEntry->DataType().Right(KFourCCLength))==KErrNotFound));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   423
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   424
		else if (aState == EMMFStateRecording)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   425
			{//record need to match with the left four characters
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   426
			match = (!(aHwMatchFourCC.Match(aHwDeviceResourceEntry->DataType().Left(KFourCCLength))==KErrNotFound));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   427
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   428
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   429
	return match;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   430
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   431
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   432
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   433
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   434
 *	Populate fixed sequences
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   435
 *
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   436
 */
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   437
void CMMFDevSoundUtility::InitializeFixedSequenceL(CPtrC8Array** aFixedSequences)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   438
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   439
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   440
	RFs fsSession;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   441
	User::LeaveIfError(fsSession.Connect());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   442
	CleanupClosePushL(fsSession);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   443
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   444
	// Open the resource file
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   445
	RResourceFile resourceFile;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   446
	resourceFile.OpenL(fsSession, KFixedSequenceResourceFile);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   447
	CleanupClosePushL(resourceFile);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   448
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   449
	// Allocate buffer to hold resource data in binary format
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   450
	iInfo = resourceFile.AllocReadL(FIXED_TONE_SEQUENCE);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   451
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   452
	TResourceReader reader;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   453
	reader.SetBuffer(iInfo);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   454
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   455
	// Create array to hold fixed sequences data
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   456
	CPtrC8Array* tempSequences = new(ELeave) CPtrC8Array(8); //  granularity
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   457
	CleanupStack::PushL(tempSequences);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   458
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   459
	// First word gives number of entries
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   460
	TInt numberOfEntries = reader.ReadUint16(); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   461
	ASSERT(!(numberOfEntries&1)); // Should have atleast one entry
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   462
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   463
	// There must be an even number entries as each sequence structure
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   464
	// is made of a name string and a data string (SEQUENCE_NAME and SEQUENCE_DATA)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   465
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   466
	HMMFToneFixedSequenceNames* names = new (ELeave) HMMFToneFixedSequenceNames;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   467
	CleanupStack::PushL(names);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   468
	for (TInt i=0;i<numberOfEntries;i+=2)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   469
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   470
		// Copy name from resource array to returnable array
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   471
		HMMFToneFixedSequenceNames* newNames = names->AddNameL(reader.ReadTPtrC());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   472
		if (names != newNames)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   473
			{ // May have moved so fixup cleanupstack reference
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   474
			CleanupStack::Pop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   475
			names = newNames;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   476
			CleanupStack::PushL(names);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   477
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   478
		TInt len = reader.ReadUint16();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   479
		TPtrC8 tempTPtrC8(REINTERPRET_CAST(const TUint8*,reader.Ptr()),len<<1);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   480
		tempSequences->AppendL(tempTPtrC8);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   481
		reader.Advance(len<<1);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   482
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   483
	CleanupStack::Pop(); // names
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   484
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   485
	// Delete the old fixed sequence names
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   486
	delete iFixedSequenceNames;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   487
	iFixedSequenceNames = NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   488
	iFixedSequenceNames = names;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   489
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   490
	*aFixedSequences = tempSequences;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   491
	CleanupStack::Pop(tempSequences);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   492
	CleanupStack::PopAndDestroy(2);	// resourceFile, fsSession
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   493
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   494
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   495
TBool CMMFDevSoundUtility::RecognizeSequence(const TDesC8& aData)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   496
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   497
	// Reference plug-in only supports its own sequence format
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   498
	_LIT8(KSequenceSignature,"SQNC");
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   499
	if (aData.Length() > 4)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   500
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   501
		if (aData.Left(4) == KSequenceSignature)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   502
			return ETrue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   503
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   504
	// Didn't recognise
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   505
	return EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   506
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   507
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   508
const TDesC& CMMFDevSoundUtility::FixedSequenceName(TInt aSequenceNumber)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   509
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   510
	ASSERT(iFixedSequenceNames); // Defect if this not true when previous was true
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   511
	ASSERT((aSequenceNumber>=0)&&(aSequenceNumber<iFixedSequenceNames->iCount));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   512
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   513
	// Ptr to first descriptor
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   514
	TUint8* ptr = REINTERPRET_CAST(TUint8*,&(iFixedSequenceNames->iCount))+sizeof(TInt);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   515
	TDesC* desPtr = REINTERPRET_CAST(TDesC*,ptr); // First des
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   516
	while (aSequenceNumber--)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   517
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   518
		TInt size = desPtr->Size();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   519
		if (size&3)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   520
			size = ((size+4)&(~3));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   521
		ptr += sizeof(TInt) + size;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   522
		desPtr = REINTERPRET_CAST(TDesC*,ptr); // Next des
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   523
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   524
	return *desPtr;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   525
	}