diff -r efebd1779a59 -r c1e808730d6c devsound/a3fdevsound/src/devsoundadaptor/cdevaudiocontrol.cpp --- a/devsound/a3fdevsound/src/devsoundadaptor/cdevaudiocontrol.cpp Fri Apr 16 16:34:49 2010 +0300 +++ b/devsound/a3fdevsound/src/devsoundadaptor/cdevaudiocontrol.cpp Mon May 03 13:56:28 2010 +0300 @@ -179,8 +179,11 @@ if (err == KErrNone) { + err = iDevAudio->CommitAudioContext(); + } + if (err == KErrNone) + { iDevAudio->iActiveState = EDevSoundAdaptorUninitialising; - err = iDevAudio->iAudioContext->Commit(); } DP0_RET(err,"%d"); @@ -198,7 +201,7 @@ TInt err = iDevAudio->iAudioStream->Unload(); if (err == KErrNone) { - err = iDevAudio->iAudioContext->Commit(); + err = iDevAudio->CommitAudioContext(); } if (err == KErrNone) { @@ -332,7 +335,7 @@ if(err == KErrNone) { - err = iDevAudio->iAudioContext->Commit(); + err = iDevAudio->CommitAudioContext(); if (err == KErrNone) { iDesiredMode = mode; @@ -489,7 +492,7 @@ // It means we're here due to RequestGainAndBalance call if(err == KErrNone && !aBecomingActive) { - err = iDevAudio->iAudioContext->Commit(); + err = iDevAudio->CommitAudioContext(); } } DP0_RET(err,"%d"); @@ -546,7 +549,7 @@ err = iDevAudio->iAudioStream->Stop(); if(err == KErrNone) { - err = iDevAudio->iAudioContext->Commit(); + err = iDevAudio->CommitAudioContext(); } if (err == KErrNone) { @@ -559,7 +562,7 @@ err = iDevAudio->iAudioStream->Unload(); if(err == KErrNone) { - err = iDevAudio->iAudioContext->Commit(); + err = iDevAudio->CommitAudioContext(); } if (err == KErrNone) { @@ -572,7 +575,7 @@ err = iDevAudio->iAudioStream->Uninitialize(); if(err == KErrNone) { - err = iDevAudio->iAudioContext->Commit(); + err = iDevAudio->CommitAudioContext(); } if (err == KErrNone) { @@ -582,6 +585,16 @@ break; case EDevSoundAdaptorCreated_Uninitialised: readyToDestroy = ETrue; + break; + case EDevSoundAdaptorUnitialised_Uninitialised: + //If following condition is true, then we are here because of a + //pre-emption clash in last Commit cycle started from + //CDevCommonControl::ContextEventUpdateWithStateEventNoError. + if(iDevAudio->iPreviousState == EDevSoundAdaptorRemovingProcessingUnits) + { + err = RemoveProcessingUnits(); + break; + } default: break; } @@ -621,7 +634,7 @@ if (err == KErrNone) { - err = iDevAudio->iAudioContext->Commit(); + err = iDevAudio->CommitAudioContext(); } if(err == KErrNone) @@ -847,8 +860,12 @@ { iCurrentSampleRate = iDesiredSampleRate; } - iDesiredSampleRate = 0; } + else + { + iAdaptationObserver->NotifyError(aError); + } + iDesiredSampleRate = 0; } // ----------------------------------------------------------------------------- @@ -864,8 +881,12 @@ { iCurrentMode = iDesiredMode; } - iDesiredMode = KNullUid; } + else + { + iAdaptationObserver->NotifyError(aError); + } + iDesiredMode = KNullUid; } // ----------------------------------------------------------------------------- @@ -935,6 +956,11 @@ DP_CONTEXT(CDevAudioControl::ContextEvent *CD1*, CtxDevSound, DPLOCAL); DP_IN(); + if(!(iAdaptationObserver->AdaptorControlsContext())) + { + iIgnoreAsyncOpComplete = ETrue; + } + if (aEvent == KUidA3FContextUpdateComplete) { if(iIgnoreAsyncOpComplete) @@ -947,18 +973,15 @@ iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue); } } - else if(aEvent == KUidA3FContextPreEmption || aEvent == KUidA3FContextPreEmptedCommit) + else if(aEvent == KUidA3FContextPreEmption) { - - //Preemption during the below states should complete invoke AsynOperationComplete - if(iDevAudio->iActiveState!=EDevSoundAdaptorActivating && iDevAudio->iActiveState!=EDevSoundAdaptorLoading && - iDevAudio->iActiveState!=EDevSoundAdaptorStopping && iDevAudio->iActiveState!=EDevSoundAdaptorUnloading - && iDevAudio->iActiveState!=EDevSoundAdaptorPausing) - { - iIgnoreAsyncOpComplete = ETrue; - iAdaptationObserver->PreemptionStartedCallbackReceived(); - } + //If we are in a normal pre-emption cycle, we should not be in a mid-state. + __ASSERT_DEBUG(!iDevAudio->IsMidState(iDevAudio->iActiveState), Panic(EInvalidStateDuringPreemptionCycle)); + iIgnoreAsyncOpComplete = ETrue; + iAdaptationObserver->PreemptionStartedCallbackReceived(); } + //In a clashing pre-emption cycle we must be in a commit cycle, so do nothing here - CDevCommonControl deals + //with this case. DP_OUT(); }