diff -r 000000000000 -r 71ca22bcf22a mmfenh/enhancedaudioplayerutility/AudioStreaming/AudioClientStreamSource/src/S60AudioClientStreamSource.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmfenh/enhancedaudioplayerutility/AudioStreaming/AudioClientStreamSource/src/S60AudioClientStreamSource.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,282 @@ +/* +* Copyright (c) 2005 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: S60 Audio Stream Source implementation +* +*/ + + +#include "S60AudioClientStreamSource.h" +#include "S60SourceEventDispatcher.h" +#include "WriteRequest.h" + +// CONSTANTS +const TInt KMinBufferSize = 5120; +_LIT8(KAMRMimetype,"audio/amr"); +_LIT8(KAMRWBMimetype,"audio/amr-wb"); + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::~CS60AudioStreamSource +// ----------------------------------------------------------------------------- +// +CS60AudioStreamSource::~CS60AudioStreamSource() + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::~CS60AudioStreamSource [%x]"),iDispatcher); +#endif + + delete iDispatcher; + iDispatcher = NULL; + delete iMimeType; + iMimeType = NULL; + iControllers.Close(); + iWriteRequests.ResetAndDestroy(); + + } + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::CS60AudioStreamSource +// ----------------------------------------------------------------------------- +// +CS60AudioStreamSource::CS60AudioStreamSource() + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::CS60AudioStreamSource")); +#endif + } + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::NewL +// ----------------------------------------------------------------------------- +// +EXPORT_C CS60AudioStreamSource* CS60AudioStreamSource::NewL( + MS60AudioStreamSourceObserver& aObserver, + const TDesC8& aMimeType ) + { + +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::NewL")); +#endif + + CS60AudioStreamSource* self = new(ELeave) CS60AudioStreamSource(); + CleanupStack::PushL(self); + self->ConstructL(aObserver, aMimeType); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::ConstructL +// ----------------------------------------------------------------------------- +// +void CS60AudioStreamSource::ConstructL( + MS60AudioStreamSourceObserver& aObserver, + const TDesC8& aMimeType ) + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::ConstructL ")); +#endif + TInt err = KErrNone; + + iDispatcher = CS60SourceEventDispatcher::NewL(aObserver); + + + if(!aMimeType.Compare(KAMRMimetype) || !aMimeType.Compare(KAMRWBMimetype)) + iMimeType = aMimeType.Alloc(); + else + User::Leave(KErrNotSupported); + //TRAP(err, FindControllersL()); + User::LeaveIfError(err); + } + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::FindControllersL +// ----------------------------------------------------------------------------- +// +void CS60AudioStreamSource::FindControllersL() + { +#if _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::FindControllersL")); +#endif + // Retrieve a list of possible controllers from ECOM + // If we don't have a match, leave with unsupported + + iControllers.ResetAndDestroy(); + + CMMFControllerPluginSelectionParameters* cSelect = CMMFControllerPluginSelectionParameters::NewLC(); + CMMFFormatSelectionParameters* fSelect = CMMFFormatSelectionParameters::NewLC(); + + RArray mediaIds; + CleanupClosePushL(mediaIds); + + + User::LeaveIfError(mediaIds.Append(KUidMediaTypeAudio)); + + cSelect->SetMediaIdsL(mediaIds, CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds); + + + if (*iMimeType != KNullDesC8) + { + fSelect->SetMatchToMimeTypeL(*iMimeType);//We match to mime type + } + else + { + User::Leave(KErrNotSupported); + } + + cSelect->SetRequiredPlayFormatSupportL(*fSelect); + + __UHEAP_MARK; + RMMFControllerImplInfoArray siControllers; + CleanupClosePushL(siControllers); + + cSelect->ListImplementationsL(siControllers); + + if ( siControllers.Count() == 0 ) + { + User::Leave(KErrNotSupported); + } + siControllers.ResetAndDestroy(); + CleanupStack::PopAndDestroy(); + __UHEAP_MARKEND; + + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(fSelect); + CleanupStack::PopAndDestroy(cSelect); + } + + +EXPORT_C TInt CS60AudioStreamSource::WriteAudioData( + CClientAudioBuffer& aBuffer ) + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::WriteAudioData")); +#endif + + TInt index; + + if ( GetFreeRequestSlot(index) ) + { + iWriteRequests[index]->WriteAudioData(aBuffer); + } + else + { + CWriteRequest* request = CWriteRequest::NewL(iSourceHandle, iController, *iDispatcher); + iWriteRequests.Append(request); + request->WriteAudioData(aBuffer); + } + + return KErrNone; + } +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::NextAudioBuffer +// ----------------------------------------------------------------------------- +// +TBool CS60AudioStreamSource::GetFreeRequestSlot(TInt& index) + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::NextAudioBuffer")); +#endif + + for ( TInt i=0; i < iWriteRequests.Count(); i++) + { + if ( iWriteRequests[i]->IsFree() ) + { + index = i; + return ETrue; + } + } + + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::SetSize +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioStreamSource::SetSize( + TUint aSize) + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::SetSize")); +#endif + iSize = aSize; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::MinimumBufferSize +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CS60AudioStreamSource::GetMinimumBufferSize() + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::MinimumBufferSize")); +#endif + return KMinBufferSize; + } + +// ----------------------------------------------------------------------------- +// CS60AudioStreamSource::GetMimeTypeL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CS60AudioStreamSource::GetMimeType(TDes8& aMimeType) + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::GetMimeType")); +#endif + aMimeType.Copy(*iMimeType); + } + +EXPORT_C TUint CS60AudioStreamSource::GetSize() + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::GetSize")); +#endif + return iSize; + } + +EXPORT_C TInt64 CS60AudioStreamSource::GetPosition() + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::GetPosition")); +#endif + return iPosition; + } + +EXPORT_C TInt CS60AudioStreamSource::SetPosition( + TInt64 aPosition) + { +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::SetPosition")); +#endif + iPosition = aPosition; + return KErrNone; + } + +TBool CS60AudioStreamSource::IsSeekingSupported() +{ +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::IsSeekingSupported")); +#endif + return EFalse; +} + +TBool CS60AudioStreamSource::IsRandomSeekingSupported() +{ +#ifdef _DEBUG + RDebug::Print(_L("CS60AudioStreamSource::IsRandomSeekingSupported")); +#endif + return EFalse; +}