diff -r efebd1779a59 -r c1e808730d6c devsound/a3fdevsound/src/devsoundadaptor/cdevaudio.cpp --- a/devsound/a3fdevsound/src/devsoundadaptor/cdevaudio.cpp Fri Apr 16 16:34:49 2010 +0300 +++ b/devsound/a3fdevsound/src/devsoundadaptor/cdevaudio.cpp Mon May 03 13:56:28 2010 +0300 @@ -349,7 +349,8 @@ if(iActiveState != EDevSoundAdaptorCreated_Uninitialised && iActiveState != EDevSoundAdaptorInitialised_Initialised && - iActiveState != EDevSoundAdaptorInitialised_Idle) + iActiveState != EDevSoundAdaptorInitialised_Idle && + iActiveState != EDevSoundAdaptorUnitialised_Uninitialised ) { DP0_RET(KErrNotReady, "%d"); } @@ -366,8 +367,11 @@ err = iAudioStream->Unload(); if(err == KErrNone) { + err = CommitAudioContext(); + } + if(err == KErrNone) + { iActiveState = EDevSoundAdaptorUnloading; - err = iAudioContext->Commit(); } } else @@ -377,6 +381,15 @@ DP0_RET(err, "%d"); } + // Redo partial initialization after pre-emption clash event in + // EDevSoundAdaptorRemovingProcessingUnits state + if (iActiveState == EDevSoundAdaptorUnitialised_Uninitialised && + iPreviousState == EDevSoundAdaptorRemovingProcessingUnits) + { + err = iCurrentAudioControl->RemoveProcessingUnits(); + DP0_RET(err, "%d"); + } + // Delete pUnits if already created if (iAudioSource) { @@ -486,6 +499,15 @@ { DP0_RET(KErrNotReady, "%d"); } + + // Redo partial cancelling of initialization after pre-emption clash event in + // EDevSoundAdaptorRemovingProcessingUnits state. + if (iActiveState == EDevSoundAdaptorUnitialised_Uninitialised && + iPreviousState == EDevSoundAdaptorRemovingProcessingUnits) + { + err = iCurrentAudioControl->RemoveProcessingUnits(); + DP0_RET(err, "%d"); + } err = iCurrentAudioControl->Uninitialize(); @@ -574,6 +596,40 @@ DP0_RET(iActiveState, "%d"); } +// ----------------------------------------------------------------------------- +// CDevAudio::ActiveState +// ----------------------------------------------------------------------------- +// +TDevSoundAdaptorState CDevAudio::PreviousState() const + { + DP_CONTEXT(CDevAudio::PreviousState *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + DP0_RET(iPreviousState, "%d"); + } + +// ----------------------------------------------------------------------------- +// CDevAudio::SetActiveState +// ----------------------------------------------------------------------------- +// +void CDevAudio::SetActiveState(TDevSoundAdaptorState aAdaptorState) + { + DP_CONTEXT(CDevAudio::SetActiveState *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + iActiveState = aAdaptorState; + DP_OUT(); + } + +// ----------------------------------------------------------------------------- +// CDevAudio::SetPreviousState +// ----------------------------------------------------------------------------- +// +void CDevAudio::SetPreviousState(TDevSoundAdaptorState aAdaptorState) + { + DP_CONTEXT(CDevAudio::SetPreviousState *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + iPreviousState = aAdaptorState; + DP_OUT(); + } // ----------------------------------------------------------------------------- // CDevAudio::SetDevSoundVolume @@ -911,6 +967,34 @@ DP_OUT(); } +TInt CDevAudio::CommitAudioContext() + { + DP_CONTEXT(CDevAudio::CommitAudioContext *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + + //If we are in mid state then Panic as DevSound server-side session (CMMFDevSoundSession) is not blocking properly + __ASSERT_DEBUG(!IsMidState(iActiveState), Panic(EValidStateBeforeCommit)); + + TInt err = KErrNone; + iPreviousState = iActiveState; + err = iAudioContext->Commit(); + + DP0_RET(err,"%d"); + } + +TBool CDevAudio::IsMidState(TDevSoundAdaptorState aAdaptorState) + { + DP_CONTEXT(CDevAudio::IsMidState *CD1*, CtxDevSound, DPLOCAL); + DP_IN(); + if (aAdaptorState == EDevSoundAdaptorRemovingProcessingUnits || aAdaptorState == EDevSoundAdaptorUninitialising || + aAdaptorState == EDevSoundAdaptorInitialising || aAdaptorState == EDevSoundAdaptorLoading || + aAdaptorState == EDevSoundAdaptorUnloading || aAdaptorState == EDevSoundAdaptorStopping || + aAdaptorState == EDevSoundAdaptorActivating || aAdaptorState == EDevSoundAdaptorPausing) + { + DP0_RET(ETrue,"%d"); + } + DP0_RET(EFalse,"%d"); + } // ----------------------------------------------------------------------------- // From MA3FDevSoundAutoPauseResume @@ -979,5 +1063,9 @@ DP_OUT(); } +void CDevAudio::Panic(TMMFDevAudioPanicCodes aCode) + { + User::Panic(KMMFDevAudioPanicCategory, aCode); + } // End of file