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 "cdevaudio.h" sl@0: #include "cdevaudiocontrol.h" sl@0: #include "cdevplaycontrol.h" sl@0: #include "cdevrecordcontrol.h" sl@0: #include "cdevtonecontrol.h" sl@0: #include "cdevgencontrol.h" sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include "mglobalproperties.h" sl@0: sl@0: const TInt KMidWayBalance = 50; // 50% sl@0: const TInt KMaxBalance = 100; // 100% sl@0: const TInt KLeftChannel = 0; sl@0: const TInt KRightChannel = 1; sl@0: sl@0: sl@0: // ======== LOCAL FUNCTIONS ======== sl@0: sl@0: // ======== MEMBER FUNCTIONS ======== sl@0: sl@0: // --------------------------------------------------------------------------- sl@0: // Default constructor sl@0: // --------------------------------------------------------------------------- sl@0: // sl@0: CDevAudio::CDevAudio(MDevSoundAdaptationObserver& aAdaptationObserver) sl@0: : iAdaptationObserver(aAdaptationObserver), iMode(EMMFStateIdle), sl@0: iActiveState(EDevSoundAdaptorCreated_Uninitialised), sl@0: iActiveStreamState(EUninitialized) sl@0: { sl@0: TRACE_CREATE(); sl@0: DP_CONTEXT(CDevAudio::CDevAudio *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: iDevSoundPlayBalance[KLeftChannel] = iDevSoundPlayBalance[KRightChannel] = KMidWayBalance; sl@0: iDevSoundRecordBalance[KLeftChannel] = iDevSoundRecordBalance[KRightChannel] = KMidWayBalance; sl@0: sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // --------------------------------------------------------------------------- sl@0: // Destructor sl@0: // --------------------------------------------------------------------------- sl@0: // sl@0: CDevAudio::~CDevAudio() sl@0: { sl@0: DP_CONTEXT(CDevAudio::~CDevAudio *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: delete iAdaptationInfo; sl@0: sl@0: iSupportedInputFormats.Close(); sl@0: iSupportedOutputFormats.Close(); sl@0: sl@0: // This part is fine at the destructor sl@0: // All this is syncronous sl@0: if ( iAudioContext ) sl@0: { sl@0: if ( iGainControl ) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iGainControl); sl@0: } sl@0: if ( iAudioSink ) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioSink); sl@0: } sl@0: if ( iAudioCodec ) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioCodec); sl@0: } sl@0: if ( iAudioSource ) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioSource); sl@0: } sl@0: if ( iAudioStream ) sl@0: { sl@0: iAudioContext->DeleteAudioStream(iAudioStream); sl@0: } sl@0: } sl@0: sl@0: iAudioContextFactory->DeleteAudioContext(iAudioContext); sl@0: sl@0: if ( iAudioContextFactory ) sl@0: { sl@0: delete iAudioContextFactory; sl@0: } sl@0: sl@0: if ( iDevPlayControl ) sl@0: { sl@0: delete iDevPlayControl; sl@0: } sl@0: if ( iDevRecordControl ) sl@0: { sl@0: delete iDevRecordControl; sl@0: } sl@0: if ( iDevToneControl ) sl@0: { sl@0: delete iDevToneControl; sl@0: } sl@0: if ( iDevGenControl ) sl@0: { sl@0: delete iDevGenControl; sl@0: } sl@0: sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::NewL sl@0: // Two-phased constructor. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CDevAudio* CDevAudio::NewL(MDevSoundAdaptationObserver& aAdaptationObserver, sl@0: MGlobalProperties& aGlobalProperties) sl@0: { sl@0: DP_STATIC_CONTEXT(CDevAudio::NewL *CD0*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: CDevAudio* self = new (ELeave) CDevAudio(aAdaptationObserver); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aGlobalProperties); sl@0: CleanupStack::Pop(self); sl@0: DP0_RET(self, "0x%x"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::ConstructL sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::ConstructL(MGlobalProperties& aGlobalProperties) sl@0: { sl@0: DP_CONTEXT(CDevAudio::ConstructL *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: iGlobalProperties = &aGlobalProperties; sl@0: sl@0: iAudioContextFactory = CAudioContextFactory::NewL(); sl@0: sl@0: User::LeaveIfError(iAudioContextFactory->CreateAudioContext(iAudioContext)); sl@0: sl@0: User::LeaveIfError(iAudioContext->CreateAudioStream(iAudioStream)); sl@0: sl@0: User::LeaveIfError(iAudioContext->CreateAudioProcessingUnit(KUidAudioGainControl, iGainControl)); sl@0: User::LeaveIfError(iAudioStream->AddGainControl(iGainControl)); sl@0: sl@0: iDevPlayControl = CDevPlayControl::NewL(this, iAdaptationObserver); sl@0: iDevRecordControl = CDevRecordControl::NewL(this, iAdaptationObserver); sl@0: iDevToneControl = CDevToneControl::NewL(this, iAdaptationObserver); sl@0: iDevGenControl = CDevGenControl::NewL(this, iAdaptationObserver); sl@0: sl@0: iAdaptationInfo = CA3FDevSoundAdaptationInfo::NewL(*this, const_cast(iGlobalProperties->GetFourCCConvertor())); sl@0: sl@0: // The generic audio control is the only one receiving the callbacks at this moment sl@0: iCurrentAudioControl = static_cast(iDevGenControl); sl@0: TInt err = iAudioContext->RegisterAudioContextObserver(*iCurrentAudioControl); sl@0: if ((err != KErrNone) && (err != KErrAlreadyExists)) sl@0: { sl@0: User::Leave(err); sl@0: } sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::PostOpen sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::PostOpen() sl@0: { sl@0: DP_CONTEXT(CDevAudio::PostOpen *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: ASSERT(iPreOpenState==EPreOpenStateIdle); sl@0: TInt err = KErrNone; sl@0: sl@0: if(iPreOpenState == EPreOpenStateIdle) sl@0: { sl@0: err = iAdaptationInfo->RequestMaxGain(KUidAudioDecoder); sl@0: if (err == KErrNone) sl@0: { sl@0: iPreOpenState = EPreOpenStateRequestingMaxVolume; sl@0: } sl@0: } sl@0: sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: sl@0: TBool CDevAudio::IsResumeSupported() sl@0: { sl@0: DP_CONTEXT(CDevAudio::IsResumeSupported *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: TUid codecType(KNullUid); sl@0: if(iMode == EMMFStatePlaying || iMode == EMMFStateTonePlaying) sl@0: { sl@0: codecType = KUidAudioDecoder; sl@0: } sl@0: else if (iMode == EMMFStateRecording) sl@0: { sl@0: codecType = KUidAudioEncoder; sl@0: } sl@0: TBool supported = iAdaptationInfo->IsResumeSupported(codecType, iFormat); sl@0: sl@0: DP0_RET(supported, "%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::RequestMaxGainComplete sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::RequestMaxGainComplete (TUid __DEBUG_ONLY(aCodecType), TInt aError, TInt aResult) sl@0: { sl@0: DP_CONTEXT(CDevAudio::RequestMaxGainComplete *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: ASSERT(iPreOpenState==EPreOpenStateRequestingMaxVolume && aCodecType==KUidAudioDecoder|| sl@0: iPreOpenState==EPreOpenStateRequestingMaxGain && aCodecType==KUidAudioEncoder); sl@0: sl@0: TInt err = aError; sl@0: TBool asyncComplete = EFalse; sl@0: sl@0: if (err == KErrNone) sl@0: { sl@0: if (iPreOpenState==EPreOpenStateRequestingMaxVolume) sl@0: { sl@0: iDevSoundMaxVolume = aResult; sl@0: sl@0: err = SetDevSoundVolume((iDevSoundMaxVolume+1)/2, asyncComplete); sl@0: sl@0: __ASSERT_DEBUG(asyncComplete==EFalse, User::Invariant()); sl@0: sl@0: if(err == KErrNone) sl@0: { sl@0: // first request - so request max gain sl@0: err = iAdaptationInfo->RequestMaxGain(KUidAudioEncoder); sl@0: if (err == KErrNone) sl@0: { sl@0: iPreOpenState = EPreOpenStateRequestingMaxGain; sl@0: } sl@0: } sl@0: } sl@0: else if(iPreOpenState==EPreOpenStateRequestingMaxGain) sl@0: { sl@0: iDevSoundMaxGain = aResult; sl@0: sl@0: err = SetDevSoundGain((iDevSoundMaxGain+1)/2, asyncComplete); sl@0: sl@0: __ASSERT_DEBUG(asyncComplete==EFalse, User::Invariant()); sl@0: sl@0: if(err == KErrNone) sl@0: { sl@0: // second request - complete whatever - Ready for Formats sl@0: err = iAdaptationInfo->RequestSupportedFormats(KUidAudioDecoder, iSupportedInputFormats); sl@0: if (err == KErrNone) sl@0: { sl@0: iPreOpenState = EPreOpenStateRequestingInputFormats; sl@0: } sl@0: } sl@0: } sl@0: } sl@0: sl@0: if (err!=KErrNone) sl@0: { sl@0: iPreOpenState = EPreOpenStateIdle; sl@0: iAdaptationObserver.AsynchronousOperationComplete(err, ETrue); sl@0: } sl@0: sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::RequestSupportedFormatsComplete sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::RequestSupportedFormatsComplete(TUid __DEBUG_ONLY(aCodecType), TInt aError) sl@0: { sl@0: DP_CONTEXT(CDevAudio::RequestSupportedFormatsComplete *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: ASSERT(iPreOpenState==EPreOpenStateRequestingInputFormats && aCodecType==KUidAudioDecoder|| sl@0: iPreOpenState==EPreOpenStateRequestingOutputFormats && aCodecType==KUidAudioEncoder); sl@0: sl@0: TInt err = aError; sl@0: sl@0: if (err == KErrNone) sl@0: { sl@0: if (iPreOpenState==EPreOpenStateRequestingInputFormats) sl@0: { sl@0: // first request - so request output formats sl@0: err = iAdaptationInfo->RequestSupportedFormats(KUidAudioEncoder, iSupportedOutputFormats); sl@0: if (err == KErrNone) sl@0: { sl@0: iPreOpenState = EPreOpenStateRequestingOutputFormats; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: ASSERT(iPreOpenState==EPreOpenStateRequestingOutputFormats); sl@0: // second request - complete whatever sl@0: iPreOpenState = EPreOpenStateIdle; sl@0: iAdaptationObserver.AsynchronousOperationComplete(aError, ETrue); sl@0: } sl@0: } sl@0: sl@0: if (err!=KErrNone) sl@0: { sl@0: iPreOpenState = EPreOpenStateIdle; sl@0: iAdaptationObserver.AsynchronousOperationComplete(err, ETrue); sl@0: } sl@0: DP_OUT(); sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::Initialize sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::Initialize(TUid aFormat, TMMFState aMode) sl@0: { sl@0: DP_CONTEXT(CDevAudio::Initialize*CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: TInt err(KErrNone); sl@0: sl@0: if(iActiveState != EDevSoundAdaptorCreated_Uninitialised && sl@0: iActiveState != EDevSoundAdaptorInitialised_Initialised && sl@0: iActiveState != EDevSoundAdaptorInitialised_Idle && sl@0: iActiveState != EDevSoundAdaptorUnitialised_Uninitialised ) sl@0: { sl@0: DP0_RET(KErrNotReady, "%d"); sl@0: } sl@0: sl@0: // Reinitialization sl@0: if (iActiveState == EDevSoundAdaptorInitialised_Initialised || sl@0: iActiveState == EDevSoundAdaptorInitialised_Idle) sl@0: { sl@0: iReinitializing = ETrue; sl@0: iTargetFormat = aFormat; sl@0: iTargetMode = aMode; sl@0: if(iActiveState == EDevSoundAdaptorInitialised_Idle) sl@0: { sl@0: err = iAudioStream->Unload(); sl@0: if(err == KErrNone) sl@0: { sl@0: err = CommitAudioContext(); sl@0: } sl@0: if(err == KErrNone) sl@0: { sl@0: iActiveState = EDevSoundAdaptorUnloading; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: err = iCurrentAudioControl->Uninitialize(); sl@0: } sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: // Redo partial initialization after pre-emption clash event in sl@0: // EDevSoundAdaptorRemovingProcessingUnits state sl@0: if (iActiveState == EDevSoundAdaptorUnitialised_Uninitialised && sl@0: iPreviousState == EDevSoundAdaptorRemovingProcessingUnits) sl@0: { sl@0: err = iCurrentAudioControl->RemoveProcessingUnits(); sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: // Delete pUnits if already created sl@0: if (iAudioSource) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioSource); sl@0: iAudioSource = NULL; sl@0: } sl@0: sl@0: if (iAudioSink) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioSink); sl@0: iAudioSink = NULL; sl@0: } sl@0: sl@0: if (iAudioCodec) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioCodec); sl@0: iAudioCodec = NULL; sl@0: } sl@0: sl@0: // Create pUnits and select proper DevSound Adaptor Helper sl@0: if (aMode == EMMFStatePlaying) sl@0: { sl@0: // create correct type sink&source&codec sl@0: err = CreateAudioProcessingUnits(KUidMmfBufferSource, KUidAudioDeviceSink, KUidAudioDecoder); sl@0: if (err == KErrNone) sl@0: { sl@0: // Now just the playcontrol should receive the only one receiving events from sl@0: // AudioContext sl@0: iAudioContext->UnregisterAudioContextObserver(*iCurrentAudioControl); sl@0: iCurrentAudioControl = static_cast(iDevPlayControl); sl@0: err = iAudioContext->RegisterAudioContextObserver(*iCurrentAudioControl); sl@0: } sl@0: if ((err != KErrNone) && (err != KErrAlreadyExists)) sl@0: { sl@0: DeleteAudioProcessingUnits(); sl@0: } sl@0: } sl@0: sl@0: else if (aMode == EMMFStateRecording) sl@0: { sl@0: // create correct type sink&source&codec sl@0: err = CreateAudioProcessingUnits(KUidAudioDeviceSource, KUidMmfBufferSink, KUidAudioEncoder); sl@0: if (err == KErrNone) sl@0: { sl@0: iAudioContext->UnregisterAudioContextObserver(*iCurrentAudioControl); sl@0: iCurrentAudioControl = static_cast(iDevRecordControl); sl@0: err = iAudioContext->RegisterAudioContextObserver(*iCurrentAudioControl); sl@0: } sl@0: if ((err != KErrNone) && (err != KErrAlreadyExists)) sl@0: { sl@0: DeleteAudioProcessingUnits(); sl@0: } sl@0: } sl@0: else if (aMode == EMMFStateTonePlaying) sl@0: { sl@0: // create correct type sink&source&codec sl@0: err = CreateAudioProcessingUnits(KUidMmfBufferSource, KUidAudioDeviceSink, KUidAudioDecoder); sl@0: if (err == KErrNone) sl@0: { sl@0: iAudioContext->UnregisterAudioContextObserver(*iCurrentAudioControl); sl@0: iCurrentAudioControl = static_cast(iDevToneControl); sl@0: err = iAudioContext->RegisterAudioContextObserver(*iCurrentAudioControl); sl@0: } sl@0: if ((err != KErrNone) && (err != KErrAlreadyExists)) sl@0: { sl@0: DeleteAudioProcessingUnits(); sl@0: } sl@0: } sl@0: else if (aMode == EMMFStateIdle) sl@0: { sl@0: // Unsure about this sl@0: iAudioContext->UnregisterAudioContextObserver(*iCurrentAudioControl); sl@0: iCurrentAudioControl = static_cast(iDevGenControl); sl@0: err = iAudioContext->RegisterAudioContextObserver(*iCurrentAudioControl); sl@0: } sl@0: else sl@0: { sl@0: iCurrentAudioControl = static_cast(iDevGenControl); sl@0: err = KErrNotSupported; sl@0: } sl@0: sl@0: if (err == KErrNone) sl@0: { sl@0: err = iCurrentAudioControl->Initialize(aFormat); sl@0: } sl@0: sl@0: if(err == KErrNone) sl@0: { sl@0: iMode = aMode; sl@0: iFormat = aFormat; sl@0: } sl@0: sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::CancelInitialize sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::CancelInitialize() sl@0: { sl@0: DP_CONTEXT(CDevAudio::CancelInitialize *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: TInt err(KErrNone); sl@0: sl@0: // Redo partial cancelling of initialization after pre-emption clash event in sl@0: // EDevSoundAdaptorRemovingProcessingUnits state. sl@0: if (iActiveState == EDevSoundAdaptorUnitialised_Uninitialised && sl@0: iPreviousState == EDevSoundAdaptorRemovingProcessingUnits) sl@0: { sl@0: err = iCurrentAudioControl->RemoveProcessingUnits(); sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: else if(iActiveState != EDevSoundAdaptorInitialised_Initialised) sl@0: { sl@0: DP0_RET(KErrNotReady, "%d"); sl@0: } sl@0: sl@0: err = iCurrentAudioControl->Uninitialize(); sl@0: sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::GetAudioControl sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: CDevAudioControl* CDevAudio::GetAudioControl() sl@0: { sl@0: DP_CONTEXT(CDevAudio::GetAudioControl *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP_OUT(); sl@0: return iCurrentAudioControl; sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetPrioritySettings sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetPrioritySettings(const TMMFPrioritySettings& aPrioritySettings) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetPrioritySettings *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: iPrioritySettings.iPriority = aPrioritySettings.iPriority; sl@0: iPrioritySettings.iPref = aPrioritySettings.iPref; sl@0: iPriorityFlag = ETrue; sl@0: DP2(DLINFO, "Priority = 0x%x Preference = 0x%x", iPrioritySettings.iPriority,iPrioritySettings.iPref); sl@0: DP0_RET(0, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::GetPrioritySettings sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::GetPrioritySettings(TAudioTypeSettings& aPrioritySettings) sl@0: { sl@0: aPrioritySettings = iPrioritySettings; sl@0: } sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::IsPrioritySet sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TBool CDevAudio::IsPrioritySet() sl@0: { sl@0: return iPriorityFlag; sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetClientConfig sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetClientConfig(const TProcessId& aProcessId) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetClientConfig *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: // TODO: Check if the TClientContextSettings atributte go back since sl@0: // if not there is no way to send the vendor id sl@0: TClientContextSettings context; sl@0: context.iProcessId = aProcessId; sl@0: TInt err = iAudioContext->SetClientSettings(context); sl@0: if (err != KErrNone) sl@0: { sl@0: DP1(DLERR, "Error %d setting client context!",err); sl@0: } sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: TInt CDevAudio::SetClientConfig(const TProcessId& aActualProcessId, const TProcessId& aProcessId) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetClientConfig *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: MContextSetEffectiveClient* setEffectiveClient sl@0: = static_cast(iAudioContext->Interface(KSetClientInfoUid)); sl@0: sl@0: TInt err; sl@0: sl@0: if (!setEffectiveClient) sl@0: { sl@0: DP0(DLINFO, "MContextSetEffectiveClient not supported, revert to old behaviour of just passing actual client info"); sl@0: err = SetClientConfig(aActualProcessId); sl@0: } sl@0: else sl@0: { sl@0: TClientContextSettings context; sl@0: context.iProcessId = aProcessId; sl@0: err = iAudioContext->SetClientSettings(context); sl@0: if (err != KErrNone) sl@0: { sl@0: DP1(DLERR, "Error %d setting client context!",err); sl@0: } sl@0: if (!err) sl@0: { sl@0: err = setEffectiveClient->SetEffectiveClientInfo(aActualProcessId); sl@0: if (err != KErrNone) sl@0: { sl@0: DP1(DLERR, "Error %d setting effective client context!",err); sl@0: } sl@0: } sl@0: } sl@0: sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: sl@0: void CDevAudio::ContextEvent(TUid /*aEvent*/, TInt /*aError*/) sl@0: { sl@0: DP_CONTEXT(CDevAudio::ContextEvent *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::ActiveState sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TDevSoundAdaptorState CDevAudio::ActiveState() const sl@0: { sl@0: DP_CONTEXT(CDevAudio::ActiveState *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP0_RET(iActiveState, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::ActiveState sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TDevSoundAdaptorState CDevAudio::PreviousState() const sl@0: { sl@0: DP_CONTEXT(CDevAudio::PreviousState *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: DP0_RET(iPreviousState, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetActiveState sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::SetActiveState(TDevSoundAdaptorState aAdaptorState) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetActiveState *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: iActiveState = aAdaptorState; sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetPreviousState sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::SetPreviousState(TDevSoundAdaptorState aAdaptorState) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetPreviousState *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: iPreviousState = aAdaptorState; sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetDevSoundVolume sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetDevSoundVolume(TInt aVolume, TBool& aAsyncComplete) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetDevSoundVolume *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: // Values are clipped between 0 and MaxGain. sl@0: // because MAudioGainControl expects this to be done sl@0: TInt volume = aVolume; sl@0: if (volume < 0) sl@0: { sl@0: volume = 0; sl@0: } sl@0: else if (volume > iDevSoundMaxVolume) sl@0: { sl@0: volume = iDevSoundMaxVolume; sl@0: } sl@0: iDevSoundVolume = volume; sl@0: sl@0: TInt error = SetGainAndBalance(EFalse, aAsyncComplete); sl@0: sl@0: DP0_RET(error, "%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetDevSoundGain sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetDevSoundGain(TInt aGain, TBool& aAsyncComplete) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetDevSoundGain *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: // Values are clipped between 0 and MaxGain. sl@0: // because MAudioGainControl expects this to be done sl@0: TInt gain = aGain; sl@0: if (gain < 0) sl@0: { sl@0: gain = 0; sl@0: } sl@0: else if (gain > iDevSoundMaxGain) sl@0: { sl@0: gain = iDevSoundMaxGain; sl@0: } sl@0: iDevSoundGain = gain; sl@0: sl@0: TInt error = SetGainAndBalance(EFalse, aAsyncComplete); sl@0: sl@0: DP0_RET(error, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetDevSoundPlayBalance sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetDevSoundPlayBalance(TInt aLeftBalance, TInt aRightBalance, TBool& aAsyncComplete) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetDevSoundPlayBalance *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: // Clipping values sl@0: TInt left = aLeftBalance; sl@0: if (left < 0) sl@0: { sl@0: left = 0; sl@0: } sl@0: else if (left > KMaxBalance) sl@0: { sl@0: left = KMaxBalance; sl@0: } sl@0: TInt right = aRightBalance; sl@0: if (right < 0) sl@0: { sl@0: right = 0; sl@0: } sl@0: else if (right > KMaxBalance) sl@0: { sl@0: right = KMaxBalance; sl@0: } sl@0: iDevSoundPlayBalance[KLeftChannel] = left; sl@0: iDevSoundPlayBalance[KRightChannel] = right; sl@0: sl@0: TInt error = SetGainAndBalance(EFalse, aAsyncComplete); sl@0: sl@0: DP0_RET(error, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetDevSoundRecordBalance sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetDevSoundRecordBalance(TInt aLeftBalance, TInt aRightBalance, TBool& aAsyncComplete) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetDevSoundRecordBalance *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: // Clipping values sl@0: TInt left = aLeftBalance; sl@0: if (left < 0) sl@0: { sl@0: left = 0; sl@0: } sl@0: else if (left > KMaxBalance) sl@0: { sl@0: left = KMaxBalance; sl@0: } sl@0: TInt right = aRightBalance; sl@0: if (right < 0) sl@0: { sl@0: right = 0; sl@0: } sl@0: else if (right > KMaxBalance) sl@0: { sl@0: right = KMaxBalance; sl@0: } sl@0: iDevSoundRecordBalance[KLeftChannel] = left; sl@0: iDevSoundRecordBalance[KRightChannel] = right; sl@0: sl@0: TInt error = SetGainAndBalance(EFalse, aAsyncComplete); sl@0: sl@0: DP0_RET(error, "%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetVolumeRamp sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetVolumeRamp(const TTimeIntervalMicroSeconds& aRampDuration) sl@0: { sl@0: DP_CONTEXT(CDevAudioControl::SetVolumeRamp *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: iRampDuration = aRampDuration; sl@0: sl@0: DP0_RET(KErrNone,"%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::RequestGainAndBalance sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::RequestGainAndBalance(CDevAudioControl* aCallingControl) sl@0: { sl@0: DP_CONTEXT(CDevAudio::RequestGainAndBalance *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: TInt error = KErrNone; sl@0: if (aCallingControl != iCurrentAudioControl) sl@0: { sl@0: error = KErrNotReady; sl@0: } sl@0: else sl@0: { sl@0: TBool dummy; sl@0: error = SetGainAndBalance(ETrue, dummy); sl@0: } sl@0: DP0_RET(error, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::SetGainAndBalance sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::SetGainAndBalance(TBool aBecomingActive, TBool& aAsyncComplete) sl@0: { sl@0: DP_CONTEXT(CDevAudio::SetGainAndBalance *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: TInt error = KErrNone; sl@0: aAsyncComplete = EFalse; // let's assume this - makes logic easier below sl@0: // Apply cached settings. sl@0: // If aBecomingActive is true it indicates this call is doing before the MAudioStream::Activate() transition, sl@0: // so if required will apply volume ramp and won't itself generate a Commit() call. sl@0: // Otherwise, when Active, the calls made here will generate a Commit() sl@0: // and aAsyncComplete is returned true unless the SetGain() call fails sl@0: if (aBecomingActive || iActiveState == EDevSoundAdaptorActive_Active) sl@0: { sl@0: if (iCurrentAudioControl==iDevRecordControl) sl@0: { sl@0: // TODO assumes we are not mid Commit cycle sl@0: // we are recing, need to change current volume at A3F layer sl@0: error = iCurrentAudioControl->SetGains(iDevSoundGain, iDevSoundMaxGain, iDevSoundRecordBalance, 0, aBecomingActive); sl@0: if (error==KErrNone) sl@0: { sl@0: aAsyncComplete = ETrue; sl@0: } sl@0: } sl@0: else if (iCurrentAudioControl==iDevPlayControl || iCurrentAudioControl==iDevToneControl) sl@0: { sl@0: // TODO assumes we are not mid Commit cycle sl@0: // we are playing, need to change current volume at A3F layer sl@0: error = iCurrentAudioControl->SetGains(iDevSoundVolume, iDevSoundMaxVolume, iDevSoundPlayBalance, iRampDuration, aBecomingActive); sl@0: if (error==KErrNone) sl@0: { sl@0: aAsyncComplete = ETrue; sl@0: } sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: DP0_RET(error, "%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::GetDevSoundPlayBalance sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::GetDevSoundPlayBalance(TInt& aLeftBalance, TInt& aRightBalance) sl@0: { sl@0: DP_CONTEXT(CDevAudio::GetDevSoundPlayBalance *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: aLeftBalance = iDevSoundPlayBalance[KLeftChannel]; sl@0: aRightBalance = iDevSoundPlayBalance[KRightChannel]; sl@0: DP_OUT(); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::GetDevSoundRecordBalance sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::GetDevSoundRecordBalance(TInt& aLeftBalance, TInt& aRightBalance) sl@0: { sl@0: DP_CONTEXT(CDevAudio::GetDevSoundRecordBalance *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: aLeftBalance = iDevSoundRecordBalance[KLeftChannel]; sl@0: aRightBalance = iDevSoundRecordBalance[KRightChannel]; sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::DevSoundSupportedDataTypesL sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::DevSoundSupportedDataTypesL(RArray& aSupportedDataTypes, TUint aDataType) sl@0: { sl@0: DP_CONTEXT(CDevAudio::DevSoundSupportedDataTypesL *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: //Clear any existing data sl@0: aSupportedDataTypes.Reset(); sl@0: sl@0: if(aDataType == KDataForPlay) sl@0: { sl@0: ConvertToFourCcL(aSupportedDataTypes, iSupportedInputFormats); sl@0: } sl@0: else if(aDataType == KDataForRecord) sl@0: { sl@0: ConvertToFourCcL(aSupportedDataTypes, iSupportedOutputFormats); sl@0: } sl@0: sl@0: DP_OUT(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::ConvertToFourCcL sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::ConvertToFourCcL(RArray& aSupportedDataTypes, RArray& aSupportedFormats) sl@0: { sl@0: DP_CONTEXT(CDevAudio::ConvertToFourCcL *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: if(aSupportedFormats.Count() > 0) sl@0: { sl@0: TFourCC fourCC; sl@0: sl@0: for(TInt element=0; element(iGlobalProperties->GetFourCCConvertor()).FormatToFourCC(aSupportedFormats[element],fourCC)); sl@0: aSupportedDataTypes.AppendL(fourCC); sl@0: } sl@0: } sl@0: DP_OUT(); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::CreateAudioProcessingUnits sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::CreateAudioProcessingUnits(TUid aSource, TUid aSink, TUid aCodec) sl@0: { sl@0: DP_CONTEXT(CDevAudio::CreateAudioProcessingUnits *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: TInt err = iAudioContext->CreateAudioProcessingUnit(aSource, iAudioSource); sl@0: if(err != KErrNone) sl@0: { sl@0: DP0_RET(err,"Audio source creation failed!"); sl@0: } sl@0: err = iAudioContext->CreateAudioProcessingUnit(aSink, iAudioSink); sl@0: if(err != KErrNone) sl@0: { sl@0: DP0_RET(err,"Audio sink creation failed!"); sl@0: } sl@0: err = iAudioContext->CreateAudioProcessingUnit(aCodec, iAudioCodec); sl@0: if(err != KErrNone) sl@0: { sl@0: DP0_RET(err,"Audio codec creation failed!"); sl@0: } sl@0: sl@0: DP0_RET(err,""); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::DeleteAudioProcessingUnits sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::DeleteAudioProcessingUnits() sl@0: { sl@0: DP_CONTEXT(CDevAudio::DeleteAudioProcessingUnits *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: if (iAudioSource) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioSource); sl@0: iAudioSource = NULL; sl@0: } sl@0: if (iAudioSink) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioSink); sl@0: iAudioSink = NULL; sl@0: } sl@0: if (iAudioCodec) sl@0: { sl@0: iAudioContext->DeleteAudioProcessingUnit(iAudioCodec); sl@0: iAudioCodec = NULL; sl@0: } sl@0: DP_OUT(); sl@0: } sl@0: sl@0: TInt CDevAudio::CommitAudioContext() sl@0: { sl@0: DP_CONTEXT(CDevAudio::CommitAudioContext *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: sl@0: //If we are in mid state then Panic as DevSound server-side session (CMMFDevSoundSession) is not blocking properly sl@0: __ASSERT_DEBUG(!IsMidState(iActiveState), Panic(EValidStateBeforeCommit)); sl@0: sl@0: TInt err = KErrNone; sl@0: iPreviousState = iActiveState; sl@0: err = iAudioContext->Commit(); sl@0: sl@0: DP0_RET(err,"%d"); sl@0: } sl@0: sl@0: TBool CDevAudio::IsMidState(TDevSoundAdaptorState aAdaptorState) sl@0: { sl@0: DP_CONTEXT(CDevAudio::IsMidState *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: if (aAdaptorState == EDevSoundAdaptorRemovingProcessingUnits || aAdaptorState == EDevSoundAdaptorUninitialising || sl@0: aAdaptorState == EDevSoundAdaptorInitialising || aAdaptorState == EDevSoundAdaptorLoading || sl@0: aAdaptorState == EDevSoundAdaptorUnloading || aAdaptorState == EDevSoundAdaptorStopping || sl@0: aAdaptorState == EDevSoundAdaptorActivating || aAdaptorState == EDevSoundAdaptorPausing) sl@0: { sl@0: DP0_RET(ETrue,"%d"); sl@0: } sl@0: DP0_RET(EFalse,"%d"); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // From MA3FDevSoundAutoPauseResume sl@0: // CDevAudio::RegisterAsClient sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::RegisterAsClient(TUid aEventType, const TDesC8& aNotificationRegistrationData) sl@0: { sl@0: DP_CONTEXT(CDevAudio::RegisterAsClient *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: TInt err = KErrNotSupported; sl@0: MA3FDevSoundAutoPauseResume* iAPR = static_cast(iAudioContext->Interface(KUIdAudioResourceNotification)); sl@0: if(iAPR) sl@0: { sl@0: err = iAPR->RegisterAsClient(aEventType, aNotificationRegistrationData, this); sl@0: } sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::CancelRegisterAsClient sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::CancelRegisterAsClient(TUid aEventType) sl@0: { sl@0: DP_CONTEXT(CDevAudio::CancelRegisterAsClient *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: TInt err = KErrNotSupported; sl@0: MA3FDevSoundAutoPauseResume* iAPR = static_cast(iAudioContext->Interface(KUIdAudioResourceNotification)); sl@0: if(iAPR) sl@0: { sl@0: err = iAPR->CancelRegisterAsClient(aEventType); sl@0: } sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::WillResumePlay sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt CDevAudio::WillResumePlay() sl@0: { sl@0: DP_CONTEXT(CDevAudio::WillResumePlay *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: TInt err = KErrNotSupported; sl@0: MA3FDevSoundAutoPauseResume* iAPR = static_cast(iAudioContext->Interface(KUIdAudioResourceNotification)); sl@0: if(iAPR) sl@0: { sl@0: err = iAPR->WillResumePlay(); sl@0: } sl@0: DP0_RET(err, "%d"); sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CDevAudio::NotifyResume sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CDevAudio::NotifyResume() sl@0: { sl@0: DP_CONTEXT(CDevAudio::NotifyResume *CD1*, CtxDevSound, DPLOCAL); sl@0: DP_IN(); sl@0: iAdaptationObserver.CallbackFromAdaptorReceived(KCallbackAutoPauseResume, KErrNone); sl@0: DP_OUT(); sl@0: } sl@0: sl@0: void CDevAudio::Panic(TMMFDevAudioPanicCodes aCode) sl@0: { sl@0: User::Panic(KMMFDevAudioPanicCategory, aCode); sl@0: } sl@0: sl@0: // End of file