devsound/a3fdevsound/src/devsoundadaptor/cdevaudiocontrol.cpp
changeset 15 c1e808730d6c
parent 13 efebd1779a59
--- 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();
 	}