devsound/a3fdevsound/src/devsoundadaptor/cdevaudiocontrol.cpp
branchRCL_3
changeset 12 b74061f7f3d2
parent 8 bc06d8566074
equal deleted inserted replaced
11:d5f04de580b7 12:b74061f7f3d2
   177 	// Remove pUnits only allowed when stream is uninitialized
   177 	// Remove pUnits only allowed when stream is uninitialized
   178 	TInt err = iDevAudio->iAudioStream->Uninitialize();
   178 	TInt err = iDevAudio->iAudioStream->Uninitialize();
   179 
   179 
   180 	if (err == KErrNone)
   180 	if (err == KErrNone)
   181 		{
   181 		{
       
   182 		err = iDevAudio->CommitAudioContext();
       
   183 		}
       
   184 	if (err == KErrNone)
       
   185 		{
   182 		iDevAudio->iActiveState = EDevSoundAdaptorUninitialising;
   186 		iDevAudio->iActiveState = EDevSoundAdaptorUninitialising;
   183 		err = iDevAudio->iAudioContext->Commit();
       
   184 		}
   187 		}
   185 
   188 
   186 	DP0_RET(err,"%d");
   189 	DP0_RET(err,"%d");
   187 	}
   190 	}
   188 
   191 
   196 	DP_IN();
   199 	DP_IN();
   197 
   200 
   198 	TInt err = iDevAudio->iAudioStream->Unload();
   201 	TInt err = iDevAudio->iAudioStream->Unload();
   199 	if (err == KErrNone)
   202 	if (err == KErrNone)
   200 		{
   203 		{
   201 		err = iDevAudio->iAudioContext->Commit();
   204 		err = iDevAudio->CommitAudioContext();
   202 		}
   205 		}
   203 	if (err == KErrNone)
   206 	if (err == KErrNone)
   204 		{
   207 		{
   205 		iDevAudio->iActiveState = EDevSoundAdaptorUnloading;
   208 		iDevAudio->iActiveState = EDevSoundAdaptorUnloading;
   206 		}
   209 		}
   330 		err = iAudioCodecIf->SetMode(mode);
   333 		err = iAudioCodecIf->SetMode(mode);
   331 		}
   334 		}
   332 	
   335 	
   333 	if(err == KErrNone)
   336 	if(err == KErrNone)
   334 		{
   337 		{
   335 		err = iDevAudio->iAudioContext->Commit();
   338 		err = iDevAudio->CommitAudioContext();
   336 		if (err == KErrNone)
   339 		if (err == KErrNone)
   337 			{
   340 			{
   338 			iDesiredMode = mode;
   341 			iDesiredMode = mode;
   339 			}
   342 			}
   340 		}
   343 		}
   487 		// This call will result on commit only when we are already active
   490 		// This call will result on commit only when we are already active
   488 		// otherwise the changes will be commited by the DevAudioControl 
   491 		// otherwise the changes will be commited by the DevAudioControl 
   489 		// It means we're here due to RequestGainAndBalance call
   492 		// It means we're here due to RequestGainAndBalance call
   490 		if(err == KErrNone && !aBecomingActive)
   493 		if(err == KErrNone && !aBecomingActive)
   491 			{
   494 			{
   492 			err = iDevAudio->iAudioContext->Commit();
   495 			err = iDevAudio->CommitAudioContext();
   493 			}		
   496 			}		
   494 		}
   497 		}
   495 	DP0_RET(err,"%d");
   498 	DP0_RET(err,"%d");
   496 	}
   499 	}
   497 
   500 
   544 		case EDevSoundAdaptorPaused_Primed:
   547 		case EDevSoundAdaptorPaused_Primed:
   545 			{
   548 			{
   546 			err = iDevAudio->iAudioStream->Stop();
   549 			err = iDevAudio->iAudioStream->Stop();
   547 			if(err == KErrNone)
   550 			if(err == KErrNone)
   548 				{
   551 				{
   549 				err = iDevAudio->iAudioContext->Commit();
   552 				err = iDevAudio->CommitAudioContext();
   550 				}
   553 				}
   551 			if (err == KErrNone)
   554 			if (err == KErrNone)
   552 				{
   555 				{
   553 				iDevAudio->iActiveState = EDevSoundAdaptorStopping;
   556 				iDevAudio->iActiveState = EDevSoundAdaptorStopping;
   554 				}
   557 				}
   557 		case EDevSoundAdaptorInitialised_Idle:
   560 		case EDevSoundAdaptorInitialised_Idle:
   558 			{
   561 			{
   559 			err = iDevAudio->iAudioStream->Unload();
   562 			err = iDevAudio->iAudioStream->Unload();
   560 			if(err == KErrNone)
   563 			if(err == KErrNone)
   561 				{
   564 				{
   562 				err = iDevAudio->iAudioContext->Commit();	
   565 				err = iDevAudio->CommitAudioContext();
   563 				}
   566 				}
   564 			if (err == KErrNone)
   567 			if (err == KErrNone)
   565 				{
   568 				{
   566 				iDevAudio->iActiveState = EDevSoundAdaptorUnloading;
   569 				iDevAudio->iActiveState = EDevSoundAdaptorUnloading;
   567 				}
   570 				}
   570 		case EDevSoundAdaptorInitialised_Initialised:
   573 		case EDevSoundAdaptorInitialised_Initialised:
   571 			{
   574 			{
   572 			err = iDevAudio->iAudioStream->Uninitialize();
   575 			err = iDevAudio->iAudioStream->Uninitialize();
   573 			if(err == KErrNone)
   576 			if(err == KErrNone)
   574 				{
   577 				{
   575 				err = iDevAudio->iAudioContext->Commit();
   578 				err = iDevAudio->CommitAudioContext();
   576 				}
   579 				}
   577 			if (err == KErrNone)
   580 			if (err == KErrNone)
   578 				{
   581 				{
   579 				iDevAudio->iActiveState = EDevSoundAdaptorUninitialising;
   582 				iDevAudio->iActiveState = EDevSoundAdaptorUninitialising;
   580 				}
   583 				}
   581 			}
   584 			}
   582 			break;
   585 			break;
   583 		case EDevSoundAdaptorCreated_Uninitialised:
   586 		case EDevSoundAdaptorCreated_Uninitialised:
   584 			readyToDestroy = ETrue;
   587 			readyToDestroy = ETrue;
       
   588 			break;
       
   589 		case EDevSoundAdaptorUnitialised_Uninitialised:
       
   590 			//If following condition is true, then we are here because of a
       
   591 			//pre-emption clash in last Commit cycle started from
       
   592 			//CDevCommonControl::ContextEventUpdateWithStateEventNoError.
       
   593 			if(iDevAudio->iPreviousState == EDevSoundAdaptorRemovingProcessingUnits)
       
   594 				{
       
   595 				err = RemoveProcessingUnits();
       
   596 				break;
       
   597 				}
   585 		default:
   598 		default:
   586 			break;
   599 			break;
   587 		}
   600 		}
   588 	
   601 	
   589 	// Destroy sequence fail!
   602 	// Destroy sequence fail!
   619 		err = iDevAudio->iAudioStream->RemoveProcessingUnit(iDevAudio->iAudioCodec);
   632 		err = iDevAudio->iAudioStream->RemoveProcessingUnit(iDevAudio->iAudioCodec);
   620 		}
   633 		}
   621 
   634 
   622 	if (err == KErrNone)
   635 	if (err == KErrNone)
   623 		{
   636 		{
   624 		err = iDevAudio->iAudioContext->Commit();
   637 		err = iDevAudio->CommitAudioContext();
   625 		}
   638 		}
   626 		
   639 		
   627 	if(err == KErrNone)
   640 	if(err == KErrNone)
   628 		{
   641 		{
   629 		iDevAudio->iActiveState = EDevSoundAdaptorRemovingProcessingUnits;		
   642 		iDevAudio->iActiveState = EDevSoundAdaptorRemovingProcessingUnits;		
   845 		//Review if we call SetConfig or is only the first time that we load the codec
   858 		//Review if we call SetConfig or is only the first time that we load the codec
   846 		if (iDesiredSampleRate > 0)
   859 		if (iDesiredSampleRate > 0)
   847 			{
   860 			{
   848 			iCurrentSampleRate = iDesiredSampleRate;
   861 			iCurrentSampleRate = iDesiredSampleRate;
   849 			}
   862 			}
   850 		iDesiredSampleRate = 0;
   863 		}
   851 		}
   864 	else
       
   865 	    {
       
   866         iAdaptationObserver->NotifyError(aError);
       
   867 	    }
       
   868     iDesiredSampleRate = 0;
   852 	}
   869 	}
   853 
   870 
   854 // -----------------------------------------------------------------------------
   871 // -----------------------------------------------------------------------------
   855 // From class MAudioCodecObserver
   872 // From class MAudioCodecObserver
   856 // CDevAudioControl::ModeSet
   873 // CDevAudioControl::ModeSet
   862 		//Review if we call SetConfig or is only the first time that we load the codec
   879 		//Review if we call SetConfig or is only the first time that we load the codec
   863 		if (iDesiredMode != KNullUid)
   880 		if (iDesiredMode != KNullUid)
   864 			{
   881 			{
   865 			iCurrentMode = iDesiredMode;
   882 			iCurrentMode = iDesiredMode;
   866 			}
   883 			}
   867 		iDesiredMode = KNullUid;
   884 		}
   868 		}
   885     else
       
   886         {
       
   887         iAdaptationObserver->NotifyError(aError);
       
   888         }
       
   889     iDesiredMode = KNullUid;
   869 	}
   890 	}
   870 
   891 
   871 // -----------------------------------------------------------------------------
   892 // -----------------------------------------------------------------------------
   872 // From class MAudioCodecObserver
   893 // From class MAudioCodecObserver
   873 // CDevAudioControl::GetSupportedSampleRatesComplete
   894 // CDevAudioControl::GetSupportedSampleRatesComplete
   933 void CDevAudioControl::ContextEvent(TUid aEvent, TInt aError)
   954 void CDevAudioControl::ContextEvent(TUid aEvent, TInt aError)
   934 	{
   955 	{
   935 	DP_CONTEXT(CDevAudioControl::ContextEvent *CD1*, CtxDevSound, DPLOCAL);
   956 	DP_CONTEXT(CDevAudioControl::ContextEvent *CD1*, CtxDevSound, DPLOCAL);
   936 	DP_IN();
   957 	DP_IN();
   937 
   958 
       
   959     if(!(iAdaptationObserver->AdaptorControlsContext()))
       
   960         {
       
   961         iIgnoreAsyncOpComplete = ETrue;
       
   962         }
       
   963     
   938 	if (aEvent == KUidA3FContextUpdateComplete)
   964 	if (aEvent == KUidA3FContextUpdateComplete)
   939 		{
   965 		{
   940 	    if(iIgnoreAsyncOpComplete)
   966 	    if(iIgnoreAsyncOpComplete)
   941 			{
   967 			{
   942             iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
   968             iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
   945         else
   971         else
   946             {
   972             {
   947             iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
   973             iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
   948            	}
   974            	}
   949 		}
   975 		}
   950 	else if(aEvent == KUidA3FContextPreEmption || aEvent == KUidA3FContextPreEmptedCommit)
   976 	else if(aEvent == KUidA3FContextPreEmption)
   951 		{
   977 		{
   952 		
   978 		//If we are in a normal pre-emption cycle, we should not be in a mid-state.
   953 		//Preemption during the below states should complete invoke AsynOperationComplete
   979 		__ASSERT_DEBUG(!iDevAudio->IsMidState(iDevAudio->iActiveState), Panic(EInvalidStateDuringPreemptionCycle));
   954 		if(iDevAudio->iActiveState!=EDevSoundAdaptorActivating && iDevAudio->iActiveState!=EDevSoundAdaptorLoading && 
   980 		iIgnoreAsyncOpComplete = ETrue;
   955 			iDevAudio->iActiveState!=EDevSoundAdaptorStopping && iDevAudio->iActiveState!=EDevSoundAdaptorUnloading
   981 		iAdaptationObserver->PreemptionStartedCallbackReceived();
   956 			 && iDevAudio->iActiveState!=EDevSoundAdaptorPausing)
   982 		}
   957 			{
   983 	//In a clashing pre-emption cycle we must be in a commit cycle, so do nothing here - CDevCommonControl deals
   958 			iIgnoreAsyncOpComplete = ETrue;
   984 	//with this case.
   959 			iAdaptationObserver->PreemptionStartedCallbackReceived();
       
   960 			}
       
   961 		}
       
   962 	DP_OUT();
   985 	DP_OUT();
   963 	}
   986 	}
   964 
   987 
   965 
   988 
   966 // -----------------------------------------------------------------------------
   989 // -----------------------------------------------------------------------------