javauis/amms_qt/mmacontrol/src.emc/cammsemcdistanceattenuationcontrol.cpp
branchRCL_3
changeset 25 ae942d28ec0e
parent 17 0fd27995241b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/amms_qt/mmacontrol/src.emc/cammsemcdistanceattenuationcontrol.cpp	Tue Aug 31 15:09:22 2010 +0300
@@ -0,0 +1,168 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Controls how the sound is attenuated with its distance.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <logger.h>
+#include "cammsemcdistanceattenuationcontrol.h"
+
+// CONSTANTS
+namespace
+{
+const TInt KAMMSRoomRollOffFactor = 0; // The logical default value set to 0
+// Rolloff factor 1000 in AMMS is 100 in EMC API
+const TInt KAMMSRolloffDivider = 10;
+
+#ifdef _DEBUG
+const TInt KAMMSMinDistance = 1;
+const TInt KAMMSMinRollofFactor = 0;
+#endif // _DEBUG
+}
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCDistanceAttenuationControl::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CAMMSEMCDistanceAttenuationControl* CAMMSEMCDistanceAttenuationControl::NewLC(
+    CMMAPlayer* aPlayer)
+{
+    CAMMSEMCDistanceAttenuationControl* self =
+        new(ELeave)CAMMSEMCDistanceAttenuationControl(aPlayer);
+
+    CleanupStack::PushL(self);
+
+    return self;
+}
+
+// Destructor
+CAMMSEMCDistanceAttenuationControl::~CAMMSEMCDistanceAttenuationControl()
+{
+    LOG( EJavaAMMS, EInfo, "AMMS::CAMMSEMCDistanceAttenuationControl::~CAMMSEMCDistanceAttenuationControl");
+
+    // Perform DeallocateControl, if the state change has not yet performed it.
+    DeallocateControl();
+
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCDistanceAttenuationControl::SetParametersL
+// Sets all the 3D audio distance attenuation parameters simultaneously.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCDistanceAttenuationControl::SetParametersL(
+    TInt aMinDistance,
+    TInt aMaxDistance,
+    TBool aMuteAfterMax,
+    TInt aRolloffFactor)
+{
+    // Check in debug build that parameters are within valid range.
+    __ASSERT_DEBUG(
+        (aMaxDistance > aMinDistance) &&
+        (aMinDistance >= KAMMSMinDistance) &&
+        (aMaxDistance >= KAMMSMinDistance) &&
+        (aRolloffFactor >= KAMMSMinRollofFactor),
+        User::Invariant());
+
+    // NOTE: Effect API uses hundreths (100 corresponds to 1.00),
+    // but JSR234 uses thousandths (1000 represents a rolloff factor of 1.0)
+    //
+    LOG4( EJavaMMAPI, EInfo, "AMMS::CAMMSEMCDistanceAttenuationControl::SetParametersL %d, %d, %d, %d",
+               aMinDistance, aMaxDistance, aMuteAfterMax, aRolloffFactor);
+
+    TInt convertedRolloffFactor = aRolloffFactor / KAMMSRolloffDivider;
+
+    iMDistanceAttenuationControl->SetDistanceAttenuation(aMinDistance, aMaxDistance,
+            aMuteAfterMax, convertedRolloffFactor, KAMMSRoomRollOffFactor);
+
+    // Apply updated settings to EMC API.
+    iMDistanceAttenuationControl->Apply();
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCDistanceAttenuationControl::PrepareControlL
+// Function which is called after the correct state is set in Player.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCDistanceAttenuationControl::PrepareControlL()
+{
+    // Perform the action only for the first time, skip if called afterwards
+    if (!iMDistanceAttenuationControl)
+    {
+        LOG( EJavaAMMS, EInfo, "AMMS::CAMMSEMCDistanceAttenuationControl::PrepareControlL");
+        //Create Orientation Effect Control
+        iStreamControl = (static_cast<CMMAEMCAudioPlayer*>(iMMAPlayer))->StreamControl();
+        iFactory = (static_cast<CMMAEMCAudioPlayer*>(iMMAPlayer))->MMFactory();
+
+        MEffectControl* temp(NULL);
+        User::LeaveIfError(iFactory->CreateEffectControl(KDistanceAttenuationEffectControl, temp));
+        iMDistanceAttenuationControl  = static_cast<MDistanceAttenuationControl*>(temp);
+        User::LeaveIfError(iStreamControl->AddEffect(*iMDistanceAttenuationControl));
+        iMDistanceAttenuationControl->Enable();
+
+    }
+
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCDistanceAttenuationControl::DeallocateControl
+// Function which is called after the correct state is set in Player.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCDistanceAttenuationControl::DeallocateControl()
+{
+    if (iMDistanceAttenuationControl)
+    {
+        LOG( EJavaAMMS, EInfo, "AMMS::CAMMSEMCDistanceAttenuationControl::DeallocateControl");
+
+        // Location for Audio can be disabled or enabled
+        TRAPD(err,iMDistanceAttenuationControl->Disable());
+        if (err != KErrNone)
+        {
+            //Some EMC Error
+            ELOG1( EJavaAMMS, "AMMS::CAMMSEMCDistanceAttenuationControl::DeallocateControl err = %d",err);
+        }
+        //return the control to factory
+        MEffectControl* temp = iMDistanceAttenuationControl;
+        iStreamControl->RemoveEffect(*temp);
+        // Delete the Effect
+        MEffectControl* tempCtrl = iMDistanceAttenuationControl;
+        iFactory->DeleteEffectControl(tempCtrl);
+        iMDistanceAttenuationControl = NULL;
+    }
+}
+
+const TDesC& CAMMSEMCDistanceAttenuationControl::ClassName() const
+{
+    return KAMMSEMCDistanceAttenuationControl;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCDistanceAttenuationControl::CAMMSEMCDistanceAttenuationControl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+CAMMSEMCDistanceAttenuationControl::CAMMSEMCDistanceAttenuationControl(
+    CMMAPlayer* aPlayer)
+        : CAMMSBaseDistanceAttenuationControl(aPlayer)
+{
+    iMMAPlayer = aPlayer;
+}
+
+//  End of File