1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/mm/devsound/a3fdevsound/src/devsoundadaptor/cdevtonecontrol.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,386 @@
1.4 +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +
1.20 +
1.21 +#include "cdevtonecontrol.h"
1.22 +
1.23 +#include <a3f/maudiocontext.h>
1.24 +#include <a3f/mbuffersource.h>
1.25 +#include <a3f/maudiocodec.h>
1.26 +#include <a3f/maudiogaincontrol.h>
1.27 +#include <a3f/audioprocessingunittypeuids.h>
1.28 +
1.29 +
1.30 +// ---------------------------------------------------------------------------
1.31 +// Default constructor
1.32 +// ---------------------------------------------------------------------------
1.33 +//
1.34 +CDevToneControl::CDevToneControl()
1.35 + {
1.36 + TRACE_CREATE();
1.37 + DP_CONTEXT(CDevToneControl::CDevToneControl *CD1*, CtxDevSound, DPLOCAL);
1.38 + DP_IN();
1.39 + DP_OUT();
1.40 + }
1.41 +
1.42 +// -----------------------------------------------------------------------------
1.43 +// Symbian 2nd phase constructor
1.44 +// -----------------------------------------------------------------------------
1.45 +//
1.46 +void CDevToneControl::ConstructL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
1.47 + {
1.48 + DP_CONTEXT(CDevToneControl::ConstructL *CD1*, CtxDevSound, DPLOCAL);
1.49 + DP_IN();
1.50 + CDevAudioControl::ConstructL(aDevAudio, aDevSoundObserver);
1.51 + DP_OUT();
1.52 + }
1.53 +
1.54 +// -----------------------------------------------------------------------------
1.55 +// Symbian constructor
1.56 +// -----------------------------------------------------------------------------
1.57 +//
1.58 +CDevToneControl* CDevToneControl::NewL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
1.59 + {
1.60 + DP_STATIC_CONTEXT(CDevToneControl::NewL *CD0*, CtxDevSound, DPLOCAL);
1.61 + DP_IN();
1.62 + CDevToneControl* self = new (ELeave) CDevToneControl();
1.63 + CleanupStack::PushL(self);
1.64 + self->ConstructL(aDevAudio, aDevSoundObserver);
1.65 + CleanupStack::Pop(self);
1.66 + DP0_RET(self, "0x%x");
1.67 + }
1.68 +
1.69 +// ---------------------------------------------------------------------------
1.70 +// Destructor
1.71 +// ---------------------------------------------------------------------------
1.72 +//
1.73 +CDevToneControl::~CDevToneControl()
1.74 + {
1.75 + DP_CONTEXT(CDevToneControl::~CDevToneControl *CD1*, CtxDevSound, DPLOCAL);
1.76 + DP_IN();
1.77 + DP_OUT();
1.78 + }
1.79 +
1.80 +// -----------------------------------------------------------------------------
1.81 +// CDevToneControl::Initialize
1.82 +// -----------------------------------------------------------------------------
1.83 +//
1.84 +TInt CDevToneControl::Initialize(TUid aFormat)
1.85 + {
1.86 + DP_CONTEXT(CDevToneControl::Initialize *CD1*, CtxDevSound, DPLOCAL);
1.87 + DP_IN();
1.88 + ASSERT(iDevAudio->iAudioSource && iDevAudio->iAudioCodec && iGainControl);
1.89 + TInt err(KErrNone);
1.90 +
1.91 + // Adding pUnits
1.92 + err = iDevAudio->iAudioStream->AddSource(iDevAudio->iAudioSource);
1.93 + if (err == KErrNone)
1.94 + {
1.95 + err = iDevAudio->iAudioStream->AddSink(iDevAudio->iAudioSink);
1.96 + if (err == KErrNone)
1.97 + {
1.98 + err = iDevAudio->iAudioStream->AddAudioCodec(iDevAudio->iAudioCodec);
1.99 + }
1.100 + }
1.101 +
1.102 + // KErrAlreadyExist shouldn't occurr
1.103 + // It's mandatory unregister any observer when no more events are required
1.104 + // Otherwise the notifications will be sent to all previously registered observer
1.105 + // when reinitialising for different mode
1.106 + err = iDevAudio->iAudioStream->RegisterAudioStreamObserver(*this);
1.107 + if (err != KErrNone)
1.108 + {
1.109 + DP0_RET(err, "Stream observer registeration failed, err = %d");
1.110 + }
1.111 + iGainControl->RegisterAudioGainControlObserver(*this);
1.112 + if (err != KErrNone)
1.113 + {
1.114 + DP0_RET(err, "Gaincontrol observer registeration failed, err = %d");
1.115 + }
1.116 +
1.117 + err = CacheAudioCodecIf();
1.118 + if (err != KErrNone)
1.119 + {
1.120 + DP0_RET(err, "CacheAudioCodecIf() failed, err = %d");
1.121 + }
1.122 +
1.123 + err = iAudioCodecIf->RegisterAudioCodecObserver(*this);
1.124 + if(err != KErrNone)
1.125 + {
1.126 + DP0_RET(err, "Registration failed, err = %d");
1.127 + }
1.128 +
1.129 + __ASSERT_ALWAYS (iAudioCodecIf, CDevAudioControl::Panic(EAudioCodecIsNull));
1.130 + err = iAudioCodecIf->SetFormat(aFormat);
1.131 + if (err!=KErrNone)
1.132 + {
1.133 + DP0_RET(err, "SetFormat() failed, err = %d");
1.134 + }
1.135 +
1.136 + // Needed to get ProcessingUnitError notification
1.137 + err = iDevAudio->iAudioCodec->RegisterProcessingUnitObserver(*this);
1.138 + if ((err != KErrAlreadyExists) && (err != KErrNone))
1.139 + {
1.140 + DP0_RET(err, "Audiocodec observer registeration failed, err = %d");
1.141 + }
1.142 +
1.143 + // get correct BufferSource interface of DevAudio::iAudioSource
1.144 + TAny* interface = iDevAudio->iAudioSource->Interface(KUidMmfBufferSource);
1.145 + if (interface == NULL)
1.146 + {
1.147 + DP0_RET(KErrNotSupported, "Incorrect source type! %d");
1.148 + }
1.149 + else
1.150 + {
1.151 + iBufferSource = static_cast<MMMFBufferSource*>(interface);
1.152 + err = iBufferSource->SetDataSupplier(*this);
1.153 + if (err != KErrNone )
1.154 + {
1.155 + DP0_RET(err, "Data suplier setting failed, err = %d");
1.156 + }
1.157 + }
1.158 +
1.159 + err = iDevAudio->iAudioStream->Initialize();
1.160 + if (err == KErrNone)
1.161 + {
1.162 + err = iDevAudio->CommitAudioContext();
1.163 + }
1.164 + if (err == KErrNone)
1.165 + {
1.166 + iDevAudio->iActiveState = EDevSoundAdaptorInitialising;
1.167 + }
1.168 +
1.169 + DP0_RET(err,"%d");
1.170 + }
1.171 +
1.172 +
1.173 +// -----------------------------------------------------------------------------
1.174 +// CDevToneControl::ProcessInit
1.175 +// -----------------------------------------------------------------------------
1.176 +//
1.177 +TInt CDevToneControl::ProcessInit()
1.178 + {
1.179 + DP_CONTEXT(CDevToneControl::ProcessInit *CD1*, CtxDevSound, DPLOCAL);
1.180 + DP_IN();
1.181 + PRF(PRF_ID, PRF_START, PRF_TIME, AA_DS_PlayTone, "");
1.182 + TInt err(KErrNone);
1.183 +
1.184 + DP1(DLINFO,"iActiveState = %d", iDevAudio->iActiveState);
1.185 + switch (iDevAudio->iActiveState)
1.186 + {
1.187 + case EDevSoundAdaptorInitialised_Initialised:
1.188 + {
1.189 + if (iDevAudio->IsPrioritySet())
1.190 + {
1.191 + TAudioTypeSettings priority;
1.192 + iDevAudio->GetPrioritySettings(priority);
1.193 + err = iDevAudio->iAudioStream->SetAudioType(priority);
1.194 + }
1.195 + if ( err == KErrNone)
1.196 + {
1.197 + err = iDevAudio->iAudioStream->Load();
1.198 + }
1.199 + if ( err == KErrNone)
1.200 + {
1.201 + err = iDevAudio->CommitAudioContext();
1.202 + }
1.203 + if(err == KErrNone)
1.204 + {
1.205 + iDevAudio->iActiveState = EDevSoundAdaptorLoading;
1.206 + }
1.207 + }
1.208 + break;
1.209 +
1.210 + case EDevSoundAdaptorGoingActive:
1.211 + {
1.212 + //If following condition is false, then we are here because of a
1.213 + //pre-emption clash in last Commit cycle started from
1.214 + //CDevCommonControl::ContextEventUpdateWithStateEventNoError.
1.215 + if(iDevAudio->iPreviousState != EDevSoundAdaptorActivating)
1.216 + {
1.217 + break;
1.218 + }
1.219 + //Fall through as required
1.220 + }
1.221 + case EDevSoundAdaptorPaused_Primed:
1.222 + case EDevSoundAdaptorInitialised_Idle:
1.223 + {
1.224 + //If following condition is true, then we are here because of a
1.225 + //pre-emption clash in last Commit cycle started from
1.226 + //CDevCommonControl::ContextEventUpdateWithStateEventAndError.
1.227 + if(iDevAudio->iPreviousState == EDevSoundAdaptorUnloading)
1.228 + {
1.229 + err = Unload();
1.230 + break;
1.231 + }
1.232 + DP0(DLINFO, "Already in loaded state");
1.233 + err = iDevAudio->RequestGainAndBalance(this);
1.234 + if (err==KErrNone)
1.235 + {
1.236 + err = iDevAudio->iAudioStream->Activate();
1.237 + }
1.238 + if (err == KErrNone)
1.239 + {
1.240 + err = iDevAudio->CommitAudioContext();
1.241 + }
1.242 + if (err == KErrNone)
1.243 + {
1.244 + iDevAudio->iActiveState = EDevSoundAdaptorActivating;
1.245 + }
1.246 + break;
1.247 + }
1.248 + case EDevSoundAdaptorActive_Active:
1.249 + default:
1.250 + err = KErrNotReady;
1.251 + break;
1.252 + }
1.253 + DP0_RET(err,"%d");
1.254 + }
1.255 +
1.256 +// -----------------------------------------------------------------------------
1.257 +// CDevToneControl::ProcessData
1.258 +// -----------------------------------------------------------------------------
1.259 +//
1.260 +void CDevToneControl::ProcessData()
1.261 + {
1.262 + DP_CONTEXT(CDevToneControl::ProcessData *CD1*, CtxDevSound, DPLOCAL);
1.263 + DP_IN();
1.264 + DP_OUT();
1.265 + }
1.266 +
1.267 +// -----------------------------------------------------------------------------
1.268 +// From class MAudioDataSupplier
1.269 +// CDevToneControl::BufferToBeFilled
1.270 +// -----------------------------------------------------------------------------
1.271 +//
1.272 +void CDevToneControl::BufferToBeFilled(MMMFBufferSource* aSource, CMMFBuffer* aBuffer)
1.273 + {
1.274 + DP_CONTEXT(CDevToneControl::BufferToBeFilled *CD1*, CtxDevSound, DPLOCAL);
1.275 + DP_IN();
1.276 + __ASSERT_ALWAYS(iBufferSource==aSource, CDevAudioControl::Panic(EBufferMismatch));
1.277 + TInt err = KErrNone;
1.278 +
1.279 + CMMFDataBuffer* myBuffer = static_cast<CMMFDataBuffer*> (aBuffer);
1.280 + Mem::Copy((TAny*)(myBuffer->Data().Ptr()), (TAny*)(&iToneData), sizeof(TToneData) );
1.281 +
1.282 + myBuffer->SetLastBuffer(ETrue);
1.283 +
1.284 + err = iBufferSource->BufferFilled(myBuffer);
1.285 + if ( err != KErrNone)
1.286 + {
1.287 + iErrorCondition = err;
1.288 + Stop();
1.289 + }
1.290 +
1.291 + DP_OUT();
1.292 + }
1.293 +
1.294 +// -----------------------------------------------------------------------------
1.295 +// From class MAudioDataSupplier
1.296 +// CDevToneControl::DiscardBuffers
1.297 +// -----------------------------------------------------------------------------
1.298 +//
1.299 +void CDevToneControl::DiscardBuffers(MMMFBufferSource* /*aSource*/)
1.300 + {
1.301 + DP_CONTEXT(CDevToneControl::DiscardBuffers *CD1*, CtxDevSound, DPLOCAL);
1.302 + DP_IN();
1.303 + DP_OUT();
1.304 + }
1.305 +
1.306 +// -----------------------------------------------------------------------------
1.307 +// CDevToneControl::ProcessingFinished
1.308 +// -----------------------------------------------------------------------------
1.309 +//
1.310 +void CDevToneControl::ProcessingFinished(MAudioStream& /*aStream*/)
1.311 + {
1.312 + DP_CONTEXT(CDevToneControl::ProcessingFinished *CD1*, CtxDevSound, DPLOCAL);
1.313 + DP_IN();
1.314 + PRF(PRF_ID, PRF_STOP, PRF_TIME, AA_DS_PlayTone, "");
1.315 +
1.316 + if(iCallbackFromAdaptor == KCallbackNone)
1.317 + {
1.318 + iCallbackFromAdaptor = KCallbackProcessingFinished;
1.319 + iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackProcessingFinished, KErrNone);
1.320 + }
1.321 + else
1.322 + {
1.323 + // Multiple callbacks from adaptor
1.324 + DP0(DLERR, "Multiple callbacks from adaptor");
1.325 + }
1.326 + DP_OUT();
1.327 + }
1.328 +
1.329 +// -----------------------------------------------------------------------------
1.330 +// CDevToneControl::SetToneData
1.331 +// -----------------------------------------------------------------------------
1.332 +//
1.333 +TInt CDevToneControl::SetToneData(TToneData& aToneData)
1.334 + {
1.335 + DP_CONTEXT(CDevToneControl::SetToneData *CD1*, CtxDevSound, DPLOCAL);
1.336 + DP_IN();
1.337 +
1.338 + iToneData = aToneData;
1.339 +
1.340 + DP0_RET(KErrNone, "%d");
1.341 + }
1.342 +
1.343 +
1.344 +// -----------------------------------------------------------------------------
1.345 +// CDevToneControl::FinishWithError
1.346 +// -----------------------------------------------------------------------------
1.347 +//
1.348 +void CDevToneControl::FinishWithError(TInt aError) // from CDevCommonControl
1.349 + {
1.350 + iAdaptationObserver->ToneFinished(aError);
1.351 + }
1.352 +
1.353 +
1.354 +// -----------------------------------------------------------------------------
1.355 +// CDevPlayControl::ProcessingFinishedReceived
1.356 +// -----------------------------------------------------------------------------
1.357 +//
1.358 +TInt CDevToneControl::ProcessingFinishedReceived(TBool& asyncOperation)
1.359 + {
1.360 + DP_CONTEXT(CDevToneControl::ProcessingFinishedReceived *CD1*, CtxDevSound, DPLOCAL);
1.361 + DP_IN();
1.362 + asyncOperation = EFalse;
1.363 + TInt err = iDevAudio->iAudioStream->Stop();
1.364 + if ( err == KErrNone)
1.365 + {
1.366 + err = iDevAudio->CommitAudioContext();
1.367 + if(err == KErrNone)
1.368 + {
1.369 + iDevAudio->iActiveState = EDevSoundAdaptorStopping;
1.370 + asyncOperation = ETrue;
1.371 + }
1.372 + }
1.373 + // Something was wrong, clear the flag.
1.374 + if (err != KErrNone)
1.375 + {
1.376 + iCallbackFromAdaptor = KCallbackNone;
1.377 + }
1.378 + DP0_RET(err,"%d");
1.379 + }
1.380 +
1.381 +// ---------------------------------------------------------------------------
1.382 +// CDevToneControl::ProcessingError
1.383 +// ---------------------------------------------------------------------------
1.384 +TInt CDevToneControl::ProcessingError(TBool& aAyncOperation)
1.385 + {
1.386 + TInt err = ProcessingFinishedReceived(aAyncOperation);
1.387 + return err;
1.388 + }
1.389 +// End of file