javauis/amms_akn/mmacontrol/src.emc/cammsemcreverbcontrol.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/amms_akn/mmacontrol/src.emc/cammsemcreverbcontrol.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,464 @@
+/*
+* 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:  Manipulates the settings of an audio effect called reverb.
+*
+*/
+
+
+// INCLUDE FILES
+#include "cammsemcreverbcontrol.h"
+#include <RoomLevelBase.h>
+#include <jdebug.h>
+#ifdef _DEBUG
+// CONSTANTS
+const TInt KAMMSMaxReverbLevel = 0;
+const TInt KAMMSMinReverbTime = 0;
+#endif // _DEBUG
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CAMMSEMCReverbControl* CAMMSEMCReverbControl::NewLC(CMMAPlayer* aPlayer)
+{
+    CAMMSEMCReverbControl* self = new(ELeave) CAMMSEMCReverbControl(aPlayer);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    return self;
+}
+
+// Destructor
+CAMMSEMCReverbControl::~CAMMSEMCReverbControl()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::~CAMMSEMCReverbControl");
+
+    // Perform DeallocateControl, if the state change has not yet performed it.
+    DeallocateControl();
+    if (iAMMSEMCReverbEnvironmentalPresetUtility)
+        delete iAMMSEMCReverbEnvironmentalPresetUtility;
+    delete iPresetNames;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::SetReverbLevelL
+// Sets the gain level of the reverberation.
+// -----------------------------------------------------------------------------
+//
+TInt CAMMSEMCReverbControl::SetReverbLevelL(TInt aLevel)
+{
+    DEBUG_INT("AMMS::CAMMSEMCReverbControl::SetReverbLevelL: %d", aLevel);
+    __ASSERT_DEBUG(aLevel <= KAMMSMaxReverbLevel, User::Invariant());
+    TInt roomLevel = 0;
+    iMReverbControl->RoomLevel(roomLevel);
+    TInt reflectionLevel =0;
+    iMReverbControl->ReflectionsLevel(reflectionLevel);
+    TInt tempChange = aLevel - reflectionLevel - roomLevel;
+
+    // Sets the reverb reflections level in mB
+    iMReverbControl->SetReflectionsLevel(aLevel - roomLevel);
+
+    // Calculate native reverb level.
+    TInt reverbLevel;
+    // iMReverbControl->ReverbLevel(reverbLevel);
+    reverbLevel = iEnvReverbLevel + tempChange;
+
+    // Ensure that the level is within the limits.
+
+    TInt minLevel = 0;
+    TInt maxLevel = 0;
+    iMReverbControl->ReverbLevelRange(minLevel, maxLevel);
+
+    DEBUG_INT("AMMS::CAMMSEMCReverbControl::SetReverbLevelL: orig %d",
+              reverbLevel);
+
+    reverbLevel = Min(reverbLevel, maxLevel);
+    reverbLevel = Max(reverbLevel, minLevel);
+
+    DEBUG_INT("AMMS::CAMMSEMCReverbControl::SetReverbLevelL: set %d",
+              reverbLevel);
+    // Sets the reverb level in mB
+    iMReverbControl->SetReverbLevel(reverbLevel);
+    // Apply can be called for Reverb, as it does not internally include EnableL
+    // unlike in case of Equalizer or StereoWidening
+    DEBUG("AMMS::CAMMSEMCReverbControl::SetReverbLevelL calling ApplyL");
+    iMReverbControl->Apply();
+
+    // Return the value that was used in setting the reverb
+    return aLevel;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::SetReverbTimeL
+// Sets the reverberation time of the reverb.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCReverbControl::SetReverbTimeL(TInt aTime)
+{
+    DEBUG_INT("AMMS::CAMMSEMCReverbControl::SetReverbTimeL: %d", aTime);
+    // Check in debug build that aTime is within valid range.
+    __ASSERT_DEBUG(aTime >= KAMMSMinReverbTime, User::Invariant());
+    iMReverbControl->SetDecayTime(aTime);
+    iMReverbControl->Apply();
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::ReverbLevel
+// Gets the gain level of the reverberation.
+// -----------------------------------------------------------------------------
+//
+TInt CAMMSEMCReverbControl::ReverbLevel()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::ReverbLevel called");
+    TInt iReverbLevel;
+    iMReverbControl->ReverbLevel(iReverbLevel);
+    return iReverbLevel;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::ReverbTime
+// Gets the reverberation time.
+// -----------------------------------------------------------------------------
+//
+TInt CAMMSEMCReverbControl::ReverbTime()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::ReverbTime called");
+
+    TUint iReverbTime;
+    iMReverbControl->DecayTime(iReverbTime);
+    return iReverbTime;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::MinReverbLevel
+// Gets the minimum level of the reverberation.
+// -----------------------------------------------------------------------------
+//
+TInt CAMMSEMCReverbControl::MinReverbLevel()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::MinReverbLevel called");
+
+    TInt minLevel;
+    TInt maxLevel;
+    iMReverbControl->ReverbLevelRange(
+        minLevel, maxLevel);
+
+    return minLevel;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::MaxReverbLevel
+// Gets the maximum level of the reverberation.
+// -----------------------------------------------------------------------------
+//
+TInt CAMMSEMCReverbControl::MaxReverbLevel()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::MaxReverbLevel called");
+    TInt minLevel;
+    TInt maxLevel;
+    iMReverbControl->ReverbLevelRange(minLevel, maxLevel);
+    return maxLevel;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::SetPresetL
+// Sets the effect according to the given preset.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCReverbControl::SetPresetL(const TDesC& aPreset)
+{
+    DEBUG_STR("AMMS::CAMMSEMCReverbControl::SetPresetL \"%S\"", aPreset);
+    CEnvironmentalReverb *iEnvironmentalReverb = NULL;
+    User::LeaveIfError(iAMMSEMCReverbEnvironmentalPresetUtility->PrepareEmptyReverbUtilitiesL());
+    iAMMSEMCReverbEnvironmentalPresetUtility->GetPresetNamesL(*iPresetNames);
+    TInt presetPosition = 0;
+    TInt findPreset = iPresetNames->Find(aPreset, presetPosition);
+    if (findPreset == 0)  // Find returns zero, if a matching element is found.
+    {
+        iEnvironmentalReverb = iAMMSEMCReverbEnvironmentalPresetUtility->GetEnvironmentalReverbAtPresetIndexL(presetPosition);
+        iCurrentPreset = presetPosition;
+    }
+    else
+    {
+        iAMMSEMCReverbEnvironmentalPresetUtility->DeleteEmptyReverbUtilities();
+        User::Leave(KErrArgument);
+    }
+
+    if (!iEnvironmentalReverb)
+    {
+        iAMMSEMCReverbEnvironmentalPresetUtility->DeleteEmptyReverbUtilities();
+        return;
+    }
+    //Get all preset data here
+
+    TInt iReverbTime = iEnvironmentalReverb-> DecayTime();
+    TInt iReverbLevel = iEnvironmentalReverb->ReflectionsLevel() + iEnvironmentalReverb->RoomLevel();
+    iEnvReverbLevel = iEnvironmentalReverb->ReverbLevel();
+    TInt roomLevel = iEnvironmentalReverb->RoomLevel();
+    TInt reflectionLevel = iEnvironmentalReverb->ReflectionsLevel();
+    TUint decayHFRatio = iEnvironmentalReverb->DecayHFRatio();
+    TUint density = iEnvironmentalReverb->Density();
+    TUint diffusion = iEnvironmentalReverb->Diffusion();
+    TUint reflectionsDelay = iEnvironmentalReverb->ReflectionsDelay();
+    TUint reverbDelay = iEnvironmentalReverb->ReverbDelay();
+    TUint roomHFLevel = iEnvironmentalReverb->RoomHFLevel();
+
+    // Set all preset data to EMC
+    TInt err = iMReverbControl->SetDecayTime(iReverbTime);
+    err = iMReverbControl->SetReverbLevel(iReverbLevel);
+    err = iMReverbControl->SetRoomLevel(roomLevel);
+    err = iMReverbControl->SetReflectionsLevel(reflectionLevel);
+    err = iMReverbControl->SetDecayHFRatio(decayHFRatio);
+    err = iMReverbControl->SetDensity(density);
+    err = iMReverbControl->SetDiffusion(diffusion);
+    err = iMReverbControl->SetReflectionsDelay(reflectionsDelay);
+    err = iMReverbControl->SetReverbDelay(reverbDelay);
+    err = iMReverbControl->SetRoomHFLevel(roomHFLevel);
+    err = iMReverbControl->Apply();
+    DEBUG_INT("AMMS::CAMMSEMCReverbControl::SetPresetL iMReverbControl setter func. err = %d",err);
+    iAMMSEMCReverbEnvironmentalPresetUtility->DeleteEmptyReverbUtilities();
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::PresetNamesL
+// Gets the available preset names.
+// -----------------------------------------------------------------------------
+//
+const CDesCArray& CAMMSEMCReverbControl::PresetNamesL()
+{
+
+    //CEnvironmentalReverb *iEnvironmentalReverb = NULL;
+    iAMMSEMCReverbEnvironmentalPresetUtility->PrepareEmptyReverbUtilitiesL();
+    iAMMSEMCReverbEnvironmentalPresetUtility->GetPresetNamesL(*iPresetNames);
+    iAMMSEMCReverbEnvironmentalPresetUtility->DeleteEmptyReverbUtilities();
+    return *iPresetNames;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::PresetL
+// Gets the current preset.
+// -----------------------------------------------------------------------------
+//
+const TDesC& CAMMSEMCReverbControl::PresetL()
+{
+    //if no preset is set, return null
+    if (iCurrentPreset < 0)
+    {
+        return KNullDesC;
+    }
+
+    else
+    {
+        // Retrieves a Preset with the given index from the utility class
+        iAMMSEMCReverbEnvironmentalPresetUtility->PrepareEmptyReverbUtilitiesL();
+        iAMMSEMCReverbEnvironmentalPresetUtility->GetPresetAtIndexL(iPresetName , iCurrentPreset);
+        iAMMSEMCReverbEnvironmentalPresetUtility->DeleteEmptyReverbUtilities();
+        return iPresetName;
+    }
+
+
+}
+
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::SetEnabledL
+// Enables/disables the effect.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCReverbControl::SetEnabledL(TBool aEnable)
+{
+    if (aEnable)
+    {
+        // Enable the effect
+        DEBUG("AMMS::CAMMSEMCReverbControl::SetEnabledL(true), calling Enable");
+        iMReverbControl->Enable();
+        iMReverbControl->Apply();
+    }
+    else
+    {
+        DEBUG("AMMS::CAMMSEMCReverbControl::SetEnabledL(false), calling Disable");
+        iMReverbControl->Disable();
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::PrepareControlL
+// Function which is called after the correct state is set in Player.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCReverbControl::PrepareControlL()
+{
+    // Perform the action only for the first time, skip if called afterwards
+    if (!iMReverbControl)
+    {
+        DEBUG("AMMS::CAMMSEMCReverbControl::PrepareControlL");
+        //Create Reverb Effect Control
+        iStreamControl = (static_cast<CMMAEMCAudioPlayer*>(iMMAPlayer))->StreamControl();
+        iFactory = (static_cast<CMMAEMCAudioPlayer*>(iMMAPlayer))->MMFactory();
+
+        MEffectControl* temp(NULL);
+        User::LeaveIfError(iFactory->CreateEffectControl(KReverbEffectControl, temp));
+        iMReverbControl  = static_cast<MReverbControl*>(temp);
+        User::LeaveIfError(iStreamControl->AddEffect(*iMReverbControl));
+        iMReverbControl->Enable();
+        SetPresetL(KAMMSEMCDefaultReverbPreset);
+
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::DeallocateControl
+// Function which is called after the correct state is set in Player.
+// -----------------------------------------------------------------------------
+//
+void CAMMSEMCReverbControl::DeallocateControl()
+{
+
+    if (iMReverbControl)
+    {
+        DEBUG("AMMS::CAMMSEMCReverbControl::DeallocateControl");
+
+        // Reverb for Audio can be disabled or enabled
+        TRAPD(err,iMReverbControl->Disable());
+        if (err != KErrNone)
+        {
+            //Some EMC Error
+            DEBUG_INT("AMMS::CAMMSEMCReverbControl::DeallocateControl err = %d",err);
+        }
+        //return the control to factory
+        MEffectControl* temp = iMReverbControl;
+        iStreamControl->RemoveEffect(*temp);
+        // Delete the Effect
+        MEffectControl* tempCtrl = iMReverbControl;
+        iFactory->DeleteEffectControl(tempCtrl);
+        iMReverbControl = NULL;
+
+        iCurrentPreset = -1;
+    }
+}
+
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::GetReverbControl
+// Returns the  reverb control. It will be used by CAMMSEMCReverbSourceControl
+// -----------------------------------------------------------------------------
+MReverbControl * CAMMSEMCReverbControl::GetReverbControlL()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::GetReverbControl");
+
+    if (! iMReverbControl)
+    {
+        PrepareControlL(); // creates the control
+    }
+
+    return iMReverbControl;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::CurrentPresetIndex
+// Returns the  Current Preset Index. It will be used by CAMMSEMCReverbSourceControl
+// -----------------------------------------------------------------------------
+TInt CAMMSEMCReverbControl::CurrentPresetIndex()
+{
+    return iCurrentPreset;
+}
+
+// -----------------------------------------------------------------------------
+// Overriding the base class CAMMSEffectControl function here
+//------------------------------------------------------------------------------
+
+void CAMMSEMCReverbControl::SetEnforcedL(TBool aEnforced)
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::SetEnforcedL");
+    // Indicate the effect is to be enforced or not. ETrue = Enforced.
+    iMReverbControl->Enforce(aEnforced);
+
+    ApplySettingsL();
+
+}
+TBool CAMMSEMCReverbControl::Enforced()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::Enforced");
+    // Returns ETrue if the effect is enforced, EFalse if not enforced.
+    TBool enforced;
+    iMReverbControl->IsEnforced(enforced);
+    return enforced;
+
+}
+void CAMMSEMCReverbControl::SetScopeL(TInt aScope)
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::SetScopeL");
+    __ASSERT_DEBUG(
+        (aScope == CAMMSEffectControlGroup::EScopeLiveOnly),
+        User::Invariant());
+    // Just to suppress warning in release build
+    (void)aScope;
+}
+TInt CAMMSEMCReverbControl::Scope()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::Scope");
+    // For now only the (LIVE_ONLY) scope is supported.
+    return CAMMSEffectControlGroup::EScopeLiveOnly;
+
+}
+void CAMMSEMCReverbControl::ApplySettingsL()
+{
+    DEBUG("AMMS::CAMMSEMCReverbControl::ApplySettingsL");
+    TBool enabled;
+    iMReverbControl->IsEnabled(enabled);
+    if (enabled)
+    {
+        DEBUG("AMMS::CAMMSEMCReverbControl:ApplySettingsL calling ApplyL");
+        iMReverbControl->Apply();
+    }
+}
+
+const TDesC& CAMMSEMCReverbControl::ClassName() const
+{
+    return KAMMSEMCReverbControl;
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+void CAMMSEMCReverbControl::ConstructL()
+{
+    // Create array for preset names
+    iPresetNames = new(ELeave) CDesCArrayFlat(1);
+
+    // Set current preset to a negative value as it is not set yet
+    iCurrentPreset = -1;
+
+    CAMMSEffectControl::ConstructL();
+    iAMMSEMCReverbEnvironmentalPresetUtility = new(ELeave) CAMMSEMCReverbEnvironmentalPresetUtility;
+    iAMMSEMCReverbEnvironmentalPresetUtility->ConstructL();
+
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSEMCReverbControl::CAMMSEMCReverbControl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+CAMMSEMCReverbControl::CAMMSEMCReverbControl(CMMAPlayer* aPlayer)
+        : CAMMSBaseReverbControl(aPlayer)
+{
+    iMMAPlayer = aPlayer;
+}
+
+//  End of File