diff -r 000000000000 -r 40261b775718 mmhais/a3facl/src/audiocontext/audiocontext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmhais/a3facl/src/audiocontext/audiocontext.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,559 @@ +//audiocontext.cpp + +// Copyright (c) 2006-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: +// + + + +#include +#include +#include +#include + +#include "audiocontext.h" +#include "audioprocessingunit.h" +#include "logicalaudiostream.h" +#include "audiostreammanager.h" + + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +// +CAudioContext::CAudioContext() + { + TRACE_CREATE(); + DP_CONTEXT(CAudioContext::CAudioContext *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + iInCommit = EFalse; + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor +// --------------------------------------------------------------------------- +void CAudioContext::ConstructL() + { + DP_CONTEXT(CAudioContext::ConstructL *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + + // Setup Multimedia Resource Control + User::LeaveIfError(iMMRC.Open(*this)); + User::LeaveIfError(iCriticalSection.CreateLocal()); + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// Symbian constructor +// --------------------------------------------------------------------------- +EXPORT_C CAudioContext* CAudioContext::NewL() + { + DP_STATIC_CONTEXT(CAudioContext::NewL *CD0*, CtxDevSound, DPLOCAL); + DP_IN(); + CAudioContext* self = new(ELeave)CAudioContext(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + DP0_RET(self, "0x%x"); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +EXPORT_C CAudioContext::~CAudioContext() + { + DP_CONTEXT(CAudioContext::~CAudioContext *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + iMMRC.Close(); + iAudioContextObservers.Close(); + iAudioProcessingUnits.Close(); + if (iActualChain) + { + iActualChain->Release(); + }; + iCriticalSection.Close(); + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::SetClientSettings +// --------------------------------------------------------------------------- +// +TInt CAudioContext::SetClientSettings(const TClientContextSettings& aSettings) + { + DP_CONTEXT(CAudioContext::SetClientSettings *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err(KErrNone); + iClientSettings = aSettings; + if( iContextId.Id() == 0 ) + { + TUint64 id = iMMRC.LogOn(iClientSettings.iProcessId); + TAudioContextId temp(id); + iContextId = temp; + } + else + { + err = KErrAlreadyExists; + } + DP0_RET(err, "%d"); + } + + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::GetContextId +// --------------------------------------------------------------------------- +// +TAudioContextId CAudioContext::ContextId() const + { + DP_CONTEXT(CAudioContext::ContextId *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + DP_OUT(); + return iContextId; + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::Commit +// --------------------------------------------------------------------------- +// +TInt CAudioContext::Commit() + { + DP_CONTEXT(CAudioContext::Commit *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err(KErrNone); + iInCommit = ETrue; + + if (iClientSettings.iProcessId.Id() == 0) + { + DP0_RET(KErrNotReady, "%d"); + } + + err = iMMRC.SendResourceRequest(iActualChain, iDesiredChain, this); + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::CreateAudioStream +// --------------------------------------------------------------------------- +// +TInt CAudioContext::CreateAudioStream(MAudioStream *&aStream) + { + DP_CONTEXT(CAudioContext::CreateAudioStream *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err(KErrNone); + + CAudioStreamManager* manager(NULL); + + // Create desired logical chain + TRAP(err, manager = CAudioStreamManager::NewL(KUidAudioStream)); + if(err == KErrNone) + { + aStream = static_cast(manager); + + // Use this as desired chain (this is the one that the client modify) + CLogicalAudioStream* logicalAudioStream = static_cast(aStream); + iDesiredChain = static_cast(logicalAudioStream); + logicalAudioStream->SetParentContext(*this); + if (iActualChain) + { + iActualChain->Release(); + iActualChain=NULL; + } + TRAP(err, iActualChain = iDesiredChain->CloneL()); + } + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::DeleteAudioStream +// --------------------------------------------------------------------------- +// +void CAudioContext::DeleteAudioStream(MAudioStream *&aStream) + { + DP_CONTEXT(CAudioContext::DeleteAudioStream *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + CAudioStreamManager* manager = static_cast(aStream); + delete manager; + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::CreateAudioProcessingUnit +// --------------------------------------------------------------------------- +// +TInt CAudioContext::CreateAudioProcessingUnit(TUid aTypeId, MAudioProcessingUnit *&aProcessingUnit) + { + DP_CONTEXT(CAudioContext::CreateAudioProcessingUnit *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err(KErrNone); + TAudioComponentId unitInstance = GetAndSetInstanceID(); + + CAudioProcessingUnit* pUnit=NULL; + TComponentParameters cParameters; + cParameters.iTypeUid = aTypeId; + cParameters.iInstanceId = unitInstance; + cParameters.iContextId = iContextId; + cParameters.iSettingsObserver = this; + + TRAP(err, pUnit = CAudioProcessingUnit::NewL(cParameters)); + if (err==KErrNone) + { + aProcessingUnit = static_cast(pUnit); + err = iAudioProcessingUnits.Append(aProcessingUnit); + if(err!=KErrNone) + { + delete pUnit; + aProcessingUnit = NULL; + } + } + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::DeleteAudioProcessingUnit +// --------------------------------------------------------------------------- +// +void CAudioContext::DeleteAudioProcessingUnit( + MAudioProcessingUnit *&aProcessingUnit) + { + DP_CONTEXT(CAudioContext::DeleteAudioProcessingUnit *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + DP_OUT(); + CAudioProcessingUnit* cUnit = static_cast(aProcessingUnit); + TAudioComponentId param = aProcessingUnit->InstanceId(); + TUint count= iAudioProcessingUnits.Count(); + + for ( TUint i(0); i < count; i++ ) + { + // find and delete component + if( iAudioProcessingUnits[i]->InstanceId() == param) + { + iAudioProcessingUnits.Remove(i); + delete cUnit; + break; + } + } + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::RegisterAudioContextObserver +// --------------------------------------------------------------------------- +// +TInt CAudioContext::RegisterAudioContextObserver( + MAudioContextObserver& aObserver) + { + DP_CONTEXT(CAudioContext::RegisterAudioContextObserver *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err = iAudioContextObservers.Find(&aObserver); + if( err != KErrNotFound ) + { + err = KErrAlreadyExists; + } + else + { + err = iAudioContextObservers.Append(&aObserver); + } + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::UnregisterAudioContextObserver +// --------------------------------------------------------------------------- +// +void CAudioContext::UnregisterAudioContextObserver( + MAudioContextObserver& aObserver) + { + DP_CONTEXT(CAudioContext::UnregisterAudioContextObserver *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + + TInt idxOrErr = iAudioContextObservers.Find(&aObserver); + if( idxOrErr != KErrNotFound ) + { + iAudioContextObservers.Remove(idxOrErr); + } + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::Interface +// --------------------------------------------------------------------------- +// +TAny* CAudioContext::Interface(TUid aType) + { + DP_CONTEXT(CAudioContext::Interface *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TAny* interface = NULL; + if(aType == KUIdAudioResourceNotification) + { + #ifndef SYMBIAN_DISABLE_ARN + interface = static_cast(this); + #else + interface = NULL; + #endif + } + else + { + interface = NULL; + } + DP_OUT(); + return interface; + } + + +// --------------------------------------------------------------------------- +// From class MAudioContext +// CAudioContext::Reset +// --------------------------------------------------------------------------- +// +TInt CAudioContext::Reset() + { + DP_CONTEXT(CAudioContext::Reset *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err = KErrNone; + if (iInCommit) + { + err = KErrNotReady; + } + iDesiredChain->ResetMessage(); + iDesiredChain->CopySettings(*iActualChain); + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// From class MMultimediaResourceControlObserver +// CAudioContext::ReceiveResourceResponse +// --------------------------------------------------------------------------- +// +void CAudioContext::ReceiveResourceResponse(MLogicalChain* aAppliedChain, TInt aError) + { + DP_CONTEXT(CAudioContext::ReceiveResourceResponse *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + + iCriticalSection.Wait(); + iMsgVersion++; + iMMRC.ResetMessages(); + iCriticalSection.Signal(); + + if ( aError == KErrNone || iPreempted ) + { + if ( iPreempted ) + { + iPreempted = EFalse; + } + // Desired chain was commited succesfully + TInt err; + MLogicalChain* lc = NULL; + TRAP(err, lc = aAppliedChain->CloneL()); + DP1(DLERR,"ECloneLeftWhenReceivingResourceResponse %d", err); + __ASSERT_DEBUG(err == KErrNone, Panic(ECloneLeftWhenReceivingResourceResponse)); + if ( iActualChain ) + { + iActualChain->Release(); + } + iActualChain = lc; + } + else + { + iDesiredChain->CopySettings(*iActualChain); + } + iDesiredChain->ResetMessage(); + ContextEventSignal(KUidA3FContextUpdateComplete, aError); + iInCommit = EFalse; + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// From class MMultimediaResourceControlObserver +// CAudioContext::ReceiveResourceUpdate +// --------------------------------------------------------------------------- +// +void CAudioContext::ReceiveResourceUpdate(MLogicalChain* /*aMessage*/, TInt aError) + { + DP_CONTEXT(CAudioContext::ReceiveResourceUpdate *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + ContextEventSignal(KUidA3FContextCommitUpdate, aError); + DP_OUT(); + } + + +// --------------------------------------------------------------------------- +// From class MMultimediaResourceControlObserver +// CAudioContext::ReceivePreemptionUpdate +// --------------------------------------------------------------------------- +// +void CAudioContext::ReceivePreemptionUpdate(MLogicalChain* /*aMessage*/, TInt aError) + { + DP_CONTEXT(CAudioContext::ReceivePreemptionUpdate *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + iPreempted = ETrue; + if(iInCommit) + { + // Send only one callback + ContextEventSignal(KUidA3FContextPreEmptedCommit, aError); + } + else + { + // Send two callbacks + ContextEventSignal(KUidA3FContextPreEmption, aError); + ContextEventSignal(KUidA3FContextPreEmptionUpdate, aError); + } + DP_OUT(); + } + + +// --------------------------------------------------------------------------- +// From class MLogicalSettingObserver +// CAudioContext::ReceiveComponentSettingsChange +// --------------------------------------------------------------------------- +void CAudioContext::ReceiveComponentSettingsChange(TUid /*aId*/, TMMRCMessageType aMessageType) + { + iDesiredChain->SetMessageType(aMessageType); + } + +// --------------------------------------------------------------------------- +// Internals +// CAudioContext::GetAndSetInstanceID +// --------------------------------------------------------------------------- +TAudioComponentId CAudioContext::GetAndSetInstanceID() + { + DP_CONTEXT(CAudioContext::GetAndSetInstanceID *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TUint id(1); // start ID count from 1 + TAudioComponentId idComponent(1); + TUint count = iAudioProcessingUnits.Count(); + if ( count < KMaxTUint ) + { + id = ++count; + } + idComponent = id; + DP_OUT(); + return idComponent; + } + +// --------------------------------------------------------------------------- +// Internals +// CAudioContext::ContextEventSignal +// --------------------------------------------------------------------------- +void CAudioContext::ContextEventSignal(TUid aEvent, TInt aError) + { + DP_CONTEXT(CAudioContext::ContextEventSignal *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TUint count = iAudioContextObservers.Count(); + for ( TUint idx(0); idx < count; idx++ ) + { + iAudioContextObservers[idx]->ContextEvent(aEvent, aError); + } + DP_OUT(); + } + +// --------------------------------------------------------------------------- +// CAudioContext::GetLogicalChain +// --------------------------------------------------------------------------- +EXPORT_C MLogicalChain* CAudioContext::GetLogicalChain(TInt aIndex) + { + DP_CONTEXT(CAudioContext::GetLogicalChain *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + MLogicalChain* logChain = NULL; + if (aIndex == 0) + { + logChain = iDesiredChain; + } + else + { + logChain = iActualChain; + } + DP_OUT(); + return logChain; + } + + +// --------------------------------------------------------------------------- +// CAudioContext::RegisterAsClient +// --------------------------------------------------------------------------- +TInt CAudioContext::RegisterAsClient(TUid aEventType, const TDesC8& aNotificationRegistrationData, MA3FDevSoundAutoPauseResumeObserver* aObserverPtr) + { + DP_CONTEXT(CAudioContext::RegisterAsClient *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err(KErrNone); + iObserverPtr = aObserverPtr; + err = iMMRC.RegisterAsClient(aEventType, aNotificationRegistrationData); + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// CAudioContext::CancelRegisterAsClient +// --------------------------------------------------------------------------- +TInt CAudioContext::CancelRegisterAsClient(TUid aEventType) + { + DP_CONTEXT(CAudioContext::CancelRegisterAsClient *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err(KErrNone); + err = iMMRC.CancelRegisterAsClient(aEventType); + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// CAudioContext::WillResumePlay +// --------------------------------------------------------------------------- +TInt CAudioContext::WillResumePlay() + { + DP_CONTEXT(CAudioContext::WillResumePlay *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + TInt err(KErrNone); + err = iMMRC.WillResumePlay(); + DP0_RET(err, "%d"); + } + +// --------------------------------------------------------------------------- +// From class MMultimediaResourceControlObserver +// CAudioContext::CanResume +// --------------------------------------------------------------------------- +// +void CAudioContext::CanResume() + { + DP_CONTEXT(CAudioContext::CanResume *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + if(iObserverPtr) + { + iObserverPtr->NotifyResume(); + } + DP_OUT(); + } + +void CAudioContext::Panic(TAudioContextPanicCodes aCode) + { + User::Panic(KAudioContextPanicCategory, aCode); + } + +EXPORT_C TInt CAudioContext::MsgVersion() + { + return iMsgVersion; + } + +EXPORT_C RCriticalSection& CAudioContext::CriticalSection() + { + return iCriticalSection; + } +// End of file