sl@0: // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: sl@0: sl@0: #include "cdevtonecontrol.h" sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: sl@0: // --------------------------------------------------------------------------- sl@0: // Default constructor sl@0: // --------------------------------------------------------------------------- sl@0: // sl@0: CDevToneControl::CDevToneControl() sl@0: { sl@0: TRACE_CREATE(); sl@0: DP_CONTEXT(CDevToneControl::CDevToneControl *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // Symbian 2nd phase constructor sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevToneControl::ConstructL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver) sl@0: { sl@0: DP_CONTEXT(CDevToneControl::ConstructL *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: CDevAudioControl::ConstructL(aDevAudio, aDevSoundObserver); sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // Symbian constructor sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CDevToneControl* CDevToneControl::NewL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver) sl@0: { sl@0: DP_STATIC_CONTEXT(CDevToneControl::NewL *CD0*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: CDevToneControl* self = new (ELeave) CDevToneControl(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aDevAudio, aDevSoundObserver); sl@0: CleanupStack::Pop(self); sl@0: DP0_RET(self, "0x%x"); sl@0: } sl@0: sl@0: // --------------------------------------------------------------------------- sl@0: // Destructor sl@0: // --------------------------------------------------------------------------- sl@0: // sl@0: CDevToneControl::~CDevToneControl() sl@0: { sl@0: DP_CONTEXT(CDevToneControl::~CDevToneControl *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevToneControl::Initialize sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevToneControl::Initialize(TUid aFormat) sl@0: { sl@0: DP_CONTEXT(CDevToneControl::Initialize *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: ASSERT(iDevAudio->iAudioSource && iDevAudio->iAudioCodec && iGainControl); sl@0: TInt err(KErrNone); sl@0: sl@0: // Adding pUnits sl@0: err = iDevAudio->iAudioStream->AddSource(iDevAudio->iAudioSource); sl@0: if (err == KErrNone) sl@0: { sl@0: err = iDevAudio->iAudioStream->AddSink(iDevAudio->iAudioSink); sl@0: if (err == KErrNone) sl@0: { sl@0: err = iDevAudio->iAudioStream->AddAudioCodec(iDevAudio->iAudioCodec); sl@0: } sl@0: } sl@0: sl@0: // KErrAlreadyExist shouldn't occurr sl@0: // It's mandatory unregister any observer when no more events are required sl@0: // Otherwise the notifications will be sent to all previously registered observer sl@0: // when reinitialising for different mode sl@0: err = iDevAudio->iAudioStream->RegisterAudioStreamObserver(*this); sl@0: if (err != KErrNone) sl@0: { sl@0: DP0_RET(err, "Stream observer registeration failed, err = %d"); sl@0: } sl@0: iGainControl->RegisterAudioGainControlObserver(*this); sl@0: if (err != KErrNone) sl@0: { sl@0: DP0_RET(err, "Gaincontrol observer registeration failed, err = %d"); sl@0: } sl@0: sl@0: err = CacheAudioCodecIf(); sl@0: if (err != KErrNone) sl@0: { sl@0: DP0_RET(err, "CacheAudioCodecIf() failed, err = %d"); sl@0: } sl@0: sl@0: err = iAudioCodecIf->RegisterAudioCodecObserver(*this); sl@0: if(err != KErrNone) sl@0: { sl@0: DP0_RET(err, "Registration failed, err = %d"); sl@0: } sl@0: sl@0: __ASSERT_ALWAYS (iAudioCodecIf, CDevAudioControl::Panic(EAudioCodecIsNull)); sl@0: err = iAudioCodecIf->SetFormat(aFormat); sl@0: if (err!=KErrNone) sl@0: { sl@0: DP0_RET(err, "SetFormat() failed, err = %d"); sl@0: } sl@0: sl@0: // Needed to get ProcessingUnitError notification sl@0: err = iDevAudio->iAudioCodec->RegisterProcessingUnitObserver(*this); sl@0: if ((err != KErrAlreadyExists) && (err != KErrNone)) sl@0: { sl@0: DP0_RET(err, "Audiocodec observer registeration failed, err = %d"); sl@0: } sl@0: sl@0: // get correct BufferSource interface of DevAudio::iAudioSource sl@0: TAny* interface = iDevAudio->iAudioSource->Interface(KUidMmfBufferSource); sl@0: if (interface == NULL) sl@0: { sl@0: DP0_RET(KErrNotSupported, "Incorrect source type! %d"); sl@0: } sl@0: else sl@0: { sl@0: iBufferSource = static_cast(interface); sl@0: err = iBufferSource->SetDataSupplier(*this); sl@0: if (err != KErrNone ) sl@0: { sl@0: DP0_RET(err, "Data suplier setting failed, err = %d"); sl@0: } sl@0: } sl@0: sl@0: err = iDevAudio->iAudioStream->Initialize(); sl@0: if (err == KErrNone) sl@0: { sl@0: err = iDevAudio->CommitAudioContext(); sl@0: } sl@0: if (err == KErrNone) sl@0: { sl@0: iDevAudio->iActiveState = EDevSoundAdaptorInitialising; sl@0: } sl@0: sl@0: DP0_RET(err,"%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevToneControl::ProcessInit sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevToneControl::ProcessInit() sl@0: { sl@0: DP_CONTEXT(CDevToneControl::ProcessInit *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: PRF(PRF_ID, PRF_START, PRF_TIME, AA_DS_PlayTone, ""); sl@0: TInt err(KErrNone); sl@0: sl@0: DP1(DLINFO,"iActiveState = %d", iDevAudio->iActiveState); sl@0: switch (iDevAudio->iActiveState) sl@0: { sl@0: case EDevSoundAdaptorInitialised_Initialised: sl@0: { sl@0: if (iDevAudio->IsPrioritySet()) sl@0: { sl@0: TAudioTypeSettings priority; sl@0: iDevAudio->GetPrioritySettings(priority); sl@0: err = iDevAudio->iAudioStream->SetAudioType(priority); sl@0: } sl@0: if ( err == KErrNone) sl@0: { sl@0: err = iDevAudio->iAudioStream->Load(); sl@0: } sl@0: if ( err == KErrNone) sl@0: { sl@0: err = iDevAudio->CommitAudioContext(); sl@0: } sl@0: if(err == KErrNone) sl@0: { sl@0: iDevAudio->iActiveState = EDevSoundAdaptorLoading; sl@0: } sl@0: } sl@0: break; sl@0: sl@0: case EDevSoundAdaptorGoingActive: sl@0: { sl@0: //If following condition is false, then we are here because of a sl@0: //pre-emption clash in last Commit cycle started from sl@0: //CDevCommonControl::ContextEventUpdateWithStateEventNoError. sl@0: if(iDevAudio->iPreviousState != EDevSoundAdaptorActivating) sl@0: { sl@0: break; sl@0: } sl@0: //Fall through as required sl@0: } sl@0: case EDevSoundAdaptorPaused_Primed: sl@0: case EDevSoundAdaptorInitialised_Idle: sl@0: { sl@0: //If following condition is true, then we are here because of a sl@0: //pre-emption clash in last Commit cycle started from sl@0: //CDevCommonControl::ContextEventUpdateWithStateEventAndError. sl@0: if(iDevAudio->iPreviousState == EDevSoundAdaptorUnloading) sl@0: { sl@0: err = Unload(); sl@0: break; sl@0: } sl@0: DP0(DLINFO, "Already in loaded state"); sl@0: err = iDevAudio->RequestGainAndBalance(this); sl@0: if (err==KErrNone) sl@0: { sl@0: err = iDevAudio->iAudioStream->Activate(); sl@0: } sl@0: if (err == KErrNone) sl@0: { sl@0: err = iDevAudio->CommitAudioContext(); sl@0: } sl@0: if (err == KErrNone) sl@0: { sl@0: iDevAudio->iActiveState = EDevSoundAdaptorActivating; sl@0: } sl@0: break; sl@0: } sl@0: case EDevSoundAdaptorActive_Active: sl@0: default: sl@0: err = KErrNotReady; sl@0: break; sl@0: } sl@0: DP0_RET(err,"%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevToneControl::ProcessData sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevToneControl::ProcessData() sl@0: { sl@0: DP_CONTEXT(CDevToneControl::ProcessData *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // From class MAudioDataSupplier sl@0: // CDevToneControl::BufferToBeFilled sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevToneControl::BufferToBeFilled(MMMFBufferSource* aSource, CMMFBuffer* aBuffer) sl@0: { sl@0: DP_CONTEXT(CDevToneControl::BufferToBeFilled *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: __ASSERT_ALWAYS(iBufferSource==aSource, CDevAudioControl::Panic(EBufferMismatch)); sl@0: TInt err = KErrNone; sl@0: sl@0: CMMFDataBuffer* myBuffer = static_cast (aBuffer); sl@0: Mem::Copy((TAny*)(myBuffer->Data().Ptr()), (TAny*)(&iToneData), sizeof(TToneData) ); sl@0: sl@0: myBuffer->SetLastBuffer(ETrue); sl@0: sl@0: err = iBufferSource->BufferFilled(myBuffer); sl@0: if ( err != KErrNone) sl@0: { sl@0: iErrorCondition = err; sl@0: Stop(); sl@0: } sl@0: sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // From class MAudioDataSupplier sl@0: // CDevToneControl::DiscardBuffers sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevToneControl::DiscardBuffers(MMMFBufferSource* /*aSource*/) sl@0: { sl@0: DP_CONTEXT(CDevToneControl::DiscardBuffers *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevToneControl::ProcessingFinished sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevToneControl::ProcessingFinished(MAudioStream& /*aStream*/) sl@0: { sl@0: DP_CONTEXT(CDevToneControl::ProcessingFinished *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: PRF(PRF_ID, PRF_STOP, PRF_TIME, AA_DS_PlayTone, ""); sl@0: sl@0: if(iCallbackFromAdaptor == KCallbackNone) sl@0: { sl@0: iCallbackFromAdaptor = KCallbackProcessingFinished; sl@0: iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackProcessingFinished, KErrNone); sl@0: } sl@0: else sl@0: { sl@0: // Multiple callbacks from adaptor sl@0: DP0(DLERR, "Multiple callbacks from adaptor"); sl@0: } sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevToneControl::SetToneData sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevToneControl::SetToneData(TToneData& aToneData) sl@0: { sl@0: DP_CONTEXT(CDevToneControl::SetToneData *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: iToneData = aToneData; sl@0: sl@0: DP0_RET(KErrNone, "%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevToneControl::FinishWithError sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevToneControl::FinishWithError(TInt aError) // from CDevCommonControl sl@0: { sl@0: iAdaptationObserver->ToneFinished(aError); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevPlayControl::ProcessingFinishedReceived sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevToneControl::ProcessingFinishedReceived(TBool& asyncOperation) sl@0: { sl@0: DP_CONTEXT(CDevToneControl::ProcessingFinishedReceived *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: asyncOperation = EFalse; sl@0: TInt err = iDevAudio->iAudioStream->Stop(); sl@0: if ( err == KErrNone) sl@0: { sl@0: err = iDevAudio->CommitAudioContext(); sl@0: if(err == KErrNone) sl@0: { sl@0: iDevAudio->iActiveState = EDevSoundAdaptorStopping; sl@0: asyncOperation = ETrue; sl@0: } sl@0: } sl@0: // Something was wrong, clear the flag. sl@0: if (err != KErrNone) sl@0: { sl@0: iCallbackFromAdaptor = KCallbackNone; sl@0: } sl@0: DP0_RET(err,"%d"); sl@0: } sl@0: sl@0: // --------------------------------------------------------------------------- sl@0: // CDevToneControl::ProcessingError sl@0: // --------------------------------------------------------------------------- sl@0: TInt CDevToneControl::ProcessingError(TBool& aAyncOperation) sl@0: { sl@0: TInt err = ProcessingFinishedReceived(aAyncOperation); sl@0: return err; sl@0: } sl@0: // End of file