devsound/a3fdevsound/src/devsoundadaptor/cdevtonecontrol.cpp
changeset 0 b8ed18f6c07b
equal deleted inserted replaced
-1:000000000000 0:b8ed18f6c07b
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 
       
    17 
       
    18 #include "cdevtonecontrol.h"
       
    19 
       
    20 #include <a3f/maudiocontext.h>
       
    21 #include <a3f/mbuffersource.h>
       
    22 #include <a3f/maudiocodec.h>
       
    23 #include <a3f/maudiogaincontrol.h>
       
    24 #include <a3f/audioprocessingunittypeuids.h>
       
    25 
       
    26 
       
    27 // ---------------------------------------------------------------------------
       
    28 // Default constructor
       
    29 // ---------------------------------------------------------------------------
       
    30 //
       
    31 CDevToneControl::CDevToneControl()
       
    32 	{
       
    33 	TRACE_CREATE();
       
    34 	DP_CONTEXT(CDevToneControl::CDevToneControl *CD1*, CtxDevSound, DPLOCAL);
       
    35 	DP_IN();
       
    36 	DP_OUT();
       
    37 	}
       
    38 
       
    39 // -----------------------------------------------------------------------------
       
    40 // Symbian 2nd phase constructor
       
    41 // -----------------------------------------------------------------------------
       
    42 //
       
    43 void CDevToneControl::ConstructL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
       
    44 	{
       
    45 	DP_CONTEXT(CDevToneControl::ConstructL *CD1*, CtxDevSound, DPLOCAL);
       
    46 	DP_IN();
       
    47 	CDevAudioControl::ConstructL(aDevAudio, aDevSoundObserver);
       
    48 	DP_OUT();
       
    49 	}
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // Symbian constructor
       
    53 // -----------------------------------------------------------------------------
       
    54 //
       
    55 CDevToneControl* CDevToneControl::NewL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
       
    56 	{
       
    57 	DP_STATIC_CONTEXT(CDevToneControl::NewL *CD0*, CtxDevSound, DPLOCAL);
       
    58 	DP_IN();
       
    59 	CDevToneControl* self = new (ELeave) CDevToneControl();
       
    60 	CleanupStack::PushL(self);
       
    61 	self->ConstructL(aDevAudio, aDevSoundObserver);
       
    62 	CleanupStack::Pop(self);
       
    63 	DP0_RET(self, "0x%x");
       
    64 	}
       
    65 
       
    66 // ---------------------------------------------------------------------------
       
    67 // Destructor
       
    68 // ---------------------------------------------------------------------------
       
    69 //
       
    70 CDevToneControl::~CDevToneControl()
       
    71 	{
       
    72 	DP_CONTEXT(CDevToneControl::~CDevToneControl *CD1*, CtxDevSound, DPLOCAL);
       
    73 	DP_IN();
       
    74 	DP_OUT();
       
    75 	}
       
    76 
       
    77 // -----------------------------------------------------------------------------
       
    78 // CDevToneControl::Initialize
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 TInt CDevToneControl::Initialize(TUid aFormat)
       
    82 	{
       
    83 	DP_CONTEXT(CDevToneControl::Initialize *CD1*, CtxDevSound, DPLOCAL);
       
    84 	DP_IN();
       
    85 	ASSERT(iDevAudio->iAudioSource && iDevAudio->iAudioCodec && iGainControl);
       
    86 	TInt err(KErrNone);
       
    87 	
       
    88 	// Adding pUnits
       
    89 	err = iDevAudio->iAudioStream->AddSource(iDevAudio->iAudioSource);
       
    90 	if (err == KErrNone)
       
    91 		{
       
    92 		err = iDevAudio->iAudioStream->AddSink(iDevAudio->iAudioSink);
       
    93 		if (err == KErrNone)
       
    94 			{
       
    95 			err = iDevAudio->iAudioStream->AddAudioCodec(iDevAudio->iAudioCodec);
       
    96 			}
       
    97 		}
       
    98 
       
    99 	// KErrAlreadyExist shouldn't occurr 
       
   100 	// It's mandatory unregister any observer when no more events are required
       
   101 	// Otherwise the notifications will be sent to all previously registered observer
       
   102 	// when reinitialising for different mode
       
   103 	err = iDevAudio->iAudioStream->RegisterAudioStreamObserver(*this);
       
   104 	if (err != KErrNone)
       
   105 		{
       
   106 		DP0_RET(err, "Stream observer registeration failed, err = %d");
       
   107 		}
       
   108 	iGainControl->RegisterAudioGainControlObserver(*this);
       
   109 	if (err != KErrNone)
       
   110 		{
       
   111 		DP0_RET(err, "Gaincontrol observer registeration failed, err = %d");
       
   112 		}
       
   113 
       
   114 	err = CacheAudioCodecIf();
       
   115 	if (err != KErrNone)
       
   116 		{
       
   117 		DP0_RET(err, "CacheAudioCodecIf() failed, err = %d");
       
   118 		}
       
   119 
       
   120 	err = iAudioCodecIf->RegisterAudioCodecObserver(*this);
       
   121 	if(err != KErrNone)
       
   122 		{
       
   123 		DP0_RET(err, "Registration failed, err = %d");
       
   124 		}
       
   125 
       
   126 	__ASSERT_ALWAYS (iAudioCodecIf, CDevAudioControl::Panic(EAudioCodecIsNull));
       
   127 	err = iAudioCodecIf->SetFormat(aFormat);
       
   128 	if (err!=KErrNone)
       
   129 		{
       
   130 		DP0_RET(err, "SetFormat() failed, err = %d");
       
   131 		}
       
   132 			
       
   133 	// Needed to get ProcessingUnitError notification 
       
   134 	err = iDevAudio->iAudioCodec->RegisterProcessingUnitObserver(*this);
       
   135 	if ((err != KErrAlreadyExists) && (err != KErrNone))
       
   136 		{
       
   137 		DP0_RET(err, "Audiocodec observer registeration failed, err = %d");
       
   138 		}
       
   139 
       
   140 	// get correct BufferSource interface of DevAudio::iAudioSource
       
   141 	TAny* interface = iDevAudio->iAudioSource->Interface(KUidMmfBufferSource);
       
   142 	if (interface == NULL)
       
   143 		{
       
   144 		DP0_RET(KErrNotSupported, "Incorrect source type! %d");
       
   145 		}
       
   146 	else
       
   147 		{
       
   148 		iBufferSource = static_cast<MMMFBufferSource*>(interface);
       
   149 		err = iBufferSource->SetDataSupplier(*this);
       
   150 		if (err != KErrNone )
       
   151 			{
       
   152 			DP0_RET(err, "Data suplier setting failed, err = %d");
       
   153 			}
       
   154 		}
       
   155 
       
   156 	err = iDevAudio->iAudioStream->Initialize();
       
   157 	if (err == KErrNone)
       
   158 		{
       
   159 		err = iDevAudio->CommitAudioContext();
       
   160 		}
       
   161 	if (err == KErrNone)
       
   162 		{
       
   163 		iDevAudio->iActiveState = EDevSoundAdaptorInitialising;
       
   164 		}
       
   165 
       
   166 	DP0_RET(err,"%d");
       
   167 	}
       
   168 
       
   169 
       
   170 // -----------------------------------------------------------------------------
       
   171 // CDevToneControl::ProcessInit
       
   172 // -----------------------------------------------------------------------------
       
   173 //
       
   174 TInt CDevToneControl::ProcessInit()
       
   175 	{
       
   176 	DP_CONTEXT(CDevToneControl::ProcessInit *CD1*, CtxDevSound, DPLOCAL);
       
   177 	DP_IN();
       
   178 	PRF(PRF_ID, PRF_START, PRF_TIME, AA_DS_PlayTone, "");
       
   179 	TInt err(KErrNone);
       
   180 
       
   181 	DP1(DLINFO,"iActiveState = %d", iDevAudio->iActiveState);
       
   182 	switch (iDevAudio->iActiveState)
       
   183 		{
       
   184 		case EDevSoundAdaptorInitialised_Initialised:
       
   185 			{
       
   186 			if (iDevAudio->IsPrioritySet())
       
   187 				{
       
   188 				TAudioTypeSettings priority;
       
   189 				iDevAudio->GetPrioritySettings(priority);
       
   190 				err = iDevAudio->iAudioStream->SetAudioType(priority);
       
   191 				}
       
   192 			if ( err == KErrNone)
       
   193 				{
       
   194 				err = iDevAudio->iAudioStream->Load();
       
   195 				}
       
   196 			if ( err == KErrNone)
       
   197 				{
       
   198 				err = iDevAudio->CommitAudioContext();
       
   199 				}
       
   200 			if(err == KErrNone)
       
   201 				{
       
   202 				iDevAudio->iActiveState = EDevSoundAdaptorLoading;
       
   203 				}
       
   204 			}
       
   205 			break;
       
   206 
       
   207 		case EDevSoundAdaptorGoingActive:
       
   208 			{
       
   209 			//If following condition is false, then we are here because of a
       
   210 			//pre-emption clash in last Commit cycle started from
       
   211 			//CDevCommonControl::ContextEventUpdateWithStateEventNoError.
       
   212 			if(iDevAudio->iPreviousState != EDevSoundAdaptorActivating)
       
   213 				{
       
   214 				break;
       
   215 				}
       
   216 			//Fall through as required
       
   217 			}
       
   218 		case EDevSoundAdaptorPaused_Primed:
       
   219 		case EDevSoundAdaptorInitialised_Idle:
       
   220 			{
       
   221 			//If following condition is true, then we are here because of a
       
   222 			//pre-emption clash in last Commit cycle started from
       
   223 			//CDevCommonControl::ContextEventUpdateWithStateEventAndError.
       
   224 			if(iDevAudio->iPreviousState == EDevSoundAdaptorUnloading)
       
   225 				{
       
   226 				err = Unload();
       
   227 				break;
       
   228 				}
       
   229 			DP0(DLINFO, "Already in loaded state");
       
   230 			err = iDevAudio->RequestGainAndBalance(this);
       
   231 			if (err==KErrNone)
       
   232 				{
       
   233 				err = iDevAudio->iAudioStream->Activate();
       
   234 				}
       
   235 			if (err == KErrNone)
       
   236 				{
       
   237 				err = iDevAudio->CommitAudioContext();
       
   238 				}
       
   239 			if (err == KErrNone)
       
   240 				{
       
   241 				iDevAudio->iActiveState = EDevSoundAdaptorActivating;
       
   242 				}
       
   243 			break;
       
   244 			}
       
   245 		case EDevSoundAdaptorActive_Active:
       
   246 		default:
       
   247 			err = KErrNotReady;
       
   248 			break;
       
   249 		}
       
   250 	DP0_RET(err,"%d");
       
   251 	}
       
   252 
       
   253 // -----------------------------------------------------------------------------
       
   254 // CDevToneControl::ProcessData
       
   255 // -----------------------------------------------------------------------------
       
   256 //
       
   257 void CDevToneControl::ProcessData()
       
   258 	{
       
   259 	DP_CONTEXT(CDevToneControl::ProcessData *CD1*, CtxDevSound, DPLOCAL);
       
   260 	DP_IN();
       
   261 	DP_OUT();
       
   262 	}
       
   263 
       
   264 // -----------------------------------------------------------------------------
       
   265 // From class MAudioDataSupplier
       
   266 // CDevToneControl::BufferToBeFilled
       
   267 // -----------------------------------------------------------------------------
       
   268 //
       
   269 void CDevToneControl::BufferToBeFilled(MMMFBufferSource* aSource, CMMFBuffer* aBuffer)
       
   270 	{
       
   271 	DP_CONTEXT(CDevToneControl::BufferToBeFilled *CD1*, CtxDevSound, DPLOCAL);
       
   272 	DP_IN();
       
   273 	__ASSERT_ALWAYS(iBufferSource==aSource, CDevAudioControl::Panic(EBufferMismatch));
       
   274 	TInt err = KErrNone;
       
   275 	
       
   276 	CMMFDataBuffer* myBuffer = static_cast<CMMFDataBuffer*> (aBuffer);
       
   277 	Mem::Copy((TAny*)(myBuffer->Data().Ptr()), (TAny*)(&iToneData), sizeof(TToneData) );
       
   278 	
       
   279 	myBuffer->SetLastBuffer(ETrue);
       
   280 	
       
   281 	err = iBufferSource->BufferFilled(myBuffer); 
       
   282 	if ( err != KErrNone)
       
   283 		{
       
   284 		iErrorCondition = err;
       
   285 		Stop();
       
   286 		}
       
   287 
       
   288 	DP_OUT();
       
   289 	}
       
   290 
       
   291 // -----------------------------------------------------------------------------
       
   292 // From class MAudioDataSupplier
       
   293 // CDevToneControl::DiscardBuffers
       
   294 // -----------------------------------------------------------------------------
       
   295 //
       
   296 void CDevToneControl::DiscardBuffers(MMMFBufferSource* /*aSource*/)
       
   297 	{
       
   298 	DP_CONTEXT(CDevToneControl::DiscardBuffers *CD1*, CtxDevSound, DPLOCAL);
       
   299 	DP_IN();
       
   300 	DP_OUT();
       
   301 	}
       
   302 
       
   303 // -----------------------------------------------------------------------------
       
   304 // CDevToneControl::ProcessingFinished
       
   305 // -----------------------------------------------------------------------------
       
   306 //
       
   307 void CDevToneControl::ProcessingFinished(MAudioStream& /*aStream*/)
       
   308 	{
       
   309 	DP_CONTEXT(CDevToneControl::ProcessingFinished *CD1*, CtxDevSound, DPLOCAL);
       
   310 	DP_IN();
       
   311 	PRF(PRF_ID, PRF_STOP, PRF_TIME, AA_DS_PlayTone, "");
       
   312 	
       
   313 	if(iCallbackFromAdaptor == KCallbackNone)
       
   314 		{
       
   315 		iCallbackFromAdaptor = KCallbackProcessingFinished;
       
   316 		iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackProcessingFinished, KErrNone);
       
   317 		}
       
   318 	else
       
   319 		{
       
   320 		// Multiple callbacks from adaptor
       
   321 		DP0(DLERR, "Multiple callbacks from adaptor");
       
   322 		}
       
   323 	DP_OUT();
       
   324 	}
       
   325 
       
   326 // -----------------------------------------------------------------------------
       
   327 // CDevToneControl::SetToneData
       
   328 // -----------------------------------------------------------------------------
       
   329 //
       
   330 TInt CDevToneControl::SetToneData(TToneData& aToneData)
       
   331 	{
       
   332 	DP_CONTEXT(CDevToneControl::SetToneData *CD1*, CtxDevSound, DPLOCAL);
       
   333 	DP_IN();
       
   334 
       
   335 	iToneData = aToneData;
       
   336 
       
   337 	DP0_RET(KErrNone, "%d");
       
   338 	}
       
   339 
       
   340 
       
   341 // -----------------------------------------------------------------------------
       
   342 // CDevToneControl::FinishWithError
       
   343 // -----------------------------------------------------------------------------
       
   344 //
       
   345 void CDevToneControl::FinishWithError(TInt aError) // from CDevCommonControl
       
   346     {
       
   347     iAdaptationObserver->ToneFinished(aError);
       
   348     }
       
   349 
       
   350 
       
   351 // -----------------------------------------------------------------------------
       
   352 // CDevPlayControl::ProcessingFinishedReceived
       
   353 // -----------------------------------------------------------------------------
       
   354 //
       
   355 TInt CDevToneControl::ProcessingFinishedReceived(TBool& asyncOperation)
       
   356 	{
       
   357 	DP_CONTEXT(CDevToneControl::ProcessingFinishedReceived *CD1*, CtxDevSound, DPLOCAL);
       
   358 	DP_IN();
       
   359 	asyncOperation = EFalse;
       
   360 	TInt err = iDevAudio->iAudioStream->Stop();
       
   361 	if ( err == KErrNone)
       
   362 		{
       
   363 		err = iDevAudio->CommitAudioContext();
       
   364 		if(err == KErrNone)
       
   365 			{
       
   366 			iDevAudio->iActiveState = EDevSoundAdaptorStopping;
       
   367 			asyncOperation = ETrue;
       
   368 			}
       
   369 		}
       
   370 	// Something was wrong, clear the flag.
       
   371 	if (err != KErrNone)
       
   372 		{
       
   373 		iCallbackFromAdaptor = KCallbackNone;
       
   374 		}
       
   375 	DP0_RET(err,"%d");
       
   376 	}
       
   377 
       
   378 // ---------------------------------------------------------------------------
       
   379 // CDevToneControl::ProcessingError
       
   380 // ---------------------------------------------------------------------------
       
   381 TInt CDevToneControl::ProcessingError(TBool& aAyncOperation)
       
   382     {
       
   383     TInt err = ProcessingFinishedReceived(aAyncOperation);
       
   384     return err;
       
   385     }
       
   386 // End of file