| 1 |
/* This file is part of the KDE project. |
| 2 |
|
| 3 |
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
| 4 |
|
| 5 |
This library is free software: you can redistribute it and/or modify |
| 6 |
it under the terms of the GNU Lesser General Public License as published by |
| 7 |
the Free Software Foundation, either version 2.1 or 3 of the License. |
| 8 |
|
| 9 |
This library is distributed in the hope that it will be useful, |
| 10 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 |
GNU Lesser General Public License for more details. |
| 13 |
|
| 14 |
You should have received a copy of the GNU Lesser General Public License |
| 15 |
along with this library. If not, see <http://www.gnu.org/licenses/>. |
| 16 |
|
| 17 |
*/ |
| 18 |
|
| 19 |
#include <EnvironmentalReverbBase.h> |
| 20 |
#include "environmentalreverb.h" |
| 21 |
|
| 22 |
QT_BEGIN_NAMESPACE |
| 23 |
|
| 24 |
using namespace Phonon; |
| 25 |
using namespace Phonon::MMF; |
| 26 |
|
| 27 |
/*! \class MMF::EnvironmentalReverb |
| 28 |
\internal |
| 29 |
*/ |
| 30 |
|
| 31 |
// Define functions which depend on concrete native effect class name |
| 32 |
PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(EnvironmentalReverb) |
| 33 |
|
| 34 |
enum Parameters |
| 35 |
{ |
| 36 |
DecayHFRatio = AbstractAudioEffect::ParameterBase, |
| 37 |
DecayTime, |
| 38 |
Density, |
| 39 |
Diffusion, |
| 40 |
ReflectionsDelay, |
| 41 |
ReflectionsLevel, |
| 42 |
ReverbDelay, |
| 43 |
ReverbLevel, |
| 44 |
RoomHFLevel, |
| 45 |
RoomLevel |
| 46 |
}; |
| 47 |
|
| 48 |
EnvironmentalReverb::EnvironmentalReverb(QObject *parent, const QList<EffectParameter>& parameters) |
| 49 |
: AbstractAudioEffect::AbstractAudioEffect(parent, parameters) |
| 50 |
{ |
| 51 |
|
| 52 |
} |
| 53 |
|
| 54 |
int EnvironmentalReverb::effectParameterChanged(const EffectParameter ¶m, |
| 55 |
const QVariant &value) |
| 56 |
{ |
| 57 |
const qreal externalLevel = value.toReal(); |
| 58 |
const int internalLevel = param.toInternalValue(externalLevel); |
| 59 |
|
| 60 |
TInt err = 0; |
| 61 |
|
| 62 |
switch(param.id()) { |
| 63 |
case DecayHFRatio: |
| 64 |
TRAP(err, concreteEffect()->SetDecayHFRatioL(internalLevel)); |
| 65 |
break; |
| 66 |
case DecayTime: |
| 67 |
TRAP(err, concreteEffect()->SetDecayTimeL(internalLevel)); |
| 68 |
break; |
| 69 |
case Density: |
| 70 |
TRAP(err, concreteEffect()->SetDensityL(internalLevel)); |
| 71 |
break; |
| 72 |
case Diffusion: |
| 73 |
TRAP(err, concreteEffect()->SetDiffusionL(internalLevel)); |
| 74 |
break; |
| 75 |
case ReflectionsDelay: |
| 76 |
TRAP(err, concreteEffect()->SetReflectionsDelayL(internalLevel)); |
| 77 |
break; |
| 78 |
case ReflectionsLevel: |
| 79 |
TRAP(err, concreteEffect()->SetReflectionsLevelL(internalLevel)); |
| 80 |
break; |
| 81 |
case ReverbDelay: |
| 82 |
TRAP(err, concreteEffect()->SetReverbDelayL(internalLevel)); |
| 83 |
break; |
| 84 |
case ReverbLevel: |
| 85 |
TRAP(err, concreteEffect()->SetReverbLevelL(internalLevel)); |
| 86 |
break; |
| 87 |
case RoomHFLevel: |
| 88 |
TRAP(err, concreteEffect()->SetRoomHFLevelL(internalLevel)); |
| 89 |
break; |
| 90 |
case RoomLevel: |
| 91 |
TRAP(err, concreteEffect()->SetRoomLevelL(internalLevel)); |
| 92 |
break; |
| 93 |
default: |
| 94 |
Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown parameter"); |
| 95 |
} |
| 96 |
|
| 97 |
return err; |
| 98 |
} |
| 99 |
|
| 100 |
|
| 101 |
//----------------------------------------------------------------------------- |
| 102 |
// Static functions |
| 103 |
//----------------------------------------------------------------------------- |
| 104 |
|
| 105 |
const char* EnvironmentalReverb::description() |
| 106 |
{ |
| 107 |
return "Reverb"; |
| 108 |
} |
| 109 |
|
| 110 |
// Internal helper function |
| 111 |
Phonon::MMF::EffectParameter createParameter(int id, const QString &name, |
| 112 |
int defaultValue, int minValue, int maxValue, |
| 113 |
Phonon::EffectParameter::Hint hint = Phonon::EffectParameter::IntegerHint) |
| 114 |
{ |
| 115 |
const qreal externalDefaultValue = |
| 116 |
Phonon::MMF::EffectParameter::toExternalValue |
| 117 |
(defaultValue, minValue, maxValue); |
| 118 |
|
| 119 |
Phonon::MMF::EffectParameter param(id, name, hint, |
| 120 |
/* defaultValue */ QVariant(externalDefaultValue), |
| 121 |
/* minimumValue */ QVariant(qreal(-1.0)), |
| 122 |
/* maximumValue */ QVariant(qreal(+1.0))); |
| 123 |
|
| 124 |
param.setInternalRange(minValue, maxValue); |
| 125 |
return param; |
| 126 |
} |
| 127 |
|
| 128 |
bool EnvironmentalReverb::getParameters(CMdaAudioOutputStream *stream, |
| 129 |
QList<EffectParameter>& parameters) |
| 130 |
{ |
| 131 |
bool supported = false; |
| 132 |
|
| 133 |
QScopedPointer<CEnvironmentalReverb> effect; |
| 134 |
TRAPD(err, effect.reset(CEnvironmentalReverb::NewL(*stream))); |
| 135 |
|
| 136 |
if (KErrNone == err) { |
| 137 |
supported = true; |
| 138 |
|
| 139 |
TInt32 min, max; |
| 140 |
TUint32 umin, umax; |
| 141 |
|
| 142 |
effect->DecayHFRatioRange(umin, umax); |
| 143 |
//: DecayHFRatio: Ratio of high-frequency decay time to the value specified by |
| 144 |
//: DecayTime. |
| 145 |
parameters.append(createParameter( |
| 146 |
DecayHFRatio, tr("Decay HF ratio (%)"), effect->DecayHFRatio(), |
| 147 |
umin, umax)); |
| 148 |
|
| 149 |
effect->DecayTimeRange(umin, umax); |
| 150 |
//: DecayTime: Time over which reverberation is diminished. |
| 151 |
parameters.append(createParameter( |
| 152 |
DecayTime, tr("Decay time (ms)"), effect->DecayTime(), |
| 153 |
umin, umax)); |
| 154 |
|
| 155 |
//: Density Delay between first and subsequent reflections. |
| 156 |
//: Note that the S60 platform documentation does not make clear |
| 157 |
//: the distinction between this value and the Diffusion value. |
| 158 |
parameters.append(createParameter( |
| 159 |
Density, tr("Density (%)"), effect->Density(), 0, 100)); |
| 160 |
|
| 161 |
//: Diffusion: Delay between first and subsequent reflections. |
| 162 |
//: Note that the S60 platform documentation does not make clear |
| 163 |
//: the distinction between this value and the Density value. |
| 164 |
parameters.append(createParameter( |
| 165 |
Diffusion, tr("Diffusion (%)"), effect->Diffusion(), 0, 100)); |
| 166 |
|
| 167 |
//: ReflectionsDelay: Amount of delay between the arrival of the direct |
| 168 |
//: path from the source and the arrival of the first reflection. |
| 169 |
parameters.append(createParameter( |
| 170 |
ReflectionsDelay, tr("Reflections delay (ms)"), |
| 171 |
effect->ReflectionsDelay(), 0, effect->ReflectionsDelayMax())); |
| 172 |
|
| 173 |
effect->ReflectionLevelRange(min, max); |
| 174 |
//: ReflectionsLevel: Amplitude of reflections. This value is |
| 175 |
//: corrected by the RoomLevel to give the final reflection amplitude. |
| 176 |
parameters.append(createParameter( |
| 177 |
ReflectionsLevel, tr("Reflections level (mB)"), |
| 178 |
effect->ReflectionsLevel(), |
| 179 |
min, max, EffectParameter::LogarithmicHint)); |
| 180 |
|
| 181 |
//: ReverbDelay: Amount of time between arrival of the first |
| 182 |
//: reflection and start of the late reverberation. |
| 183 |
parameters.append(createParameter( |
| 184 |
ReverbDelay, tr("Reverb delay (ms)"), effect->ReverbDelay(), |
| 185 |
0, effect->ReverbDelayMax())); |
| 186 |
|
| 187 |
effect->ReverbLevelRange(min, max); |
| 188 |
//: ReverbLevel: Amplitude of reverberations. This value is |
| 189 |
//: corrected by the RoomLevel to give the final reverberation |
| 190 |
//: amplitude. |
| 191 |
parameters.append(createParameter( |
| 192 |
ReverbLevel, tr("Reverb level (mB)"), effect->ReverbLevel(), |
| 193 |
min, max, EffectParameter::LogarithmicHint)); |
| 194 |
|
| 195 |
effect->RoomHFLevelRange(min, max); |
| 196 |
//: RoomHFLevel: Amplitude of low-pass filter used to attenuate the |
| 197 |
//: high frequency component of reflected sound. |
| 198 |
parameters.append(createParameter( |
| 199 |
RoomHFLevel, tr("Room HF level"), effect->RoomHFLevel(), |
| 200 |
min, max)); |
| 201 |
|
| 202 |
effect->RoomLevelRange(min, max); |
| 203 |
//: RoomLevel: Master volume control for all reflected sound. |
| 204 |
parameters.append(createParameter( |
| 205 |
RoomLevel, tr("Room level (mB)"), effect->RoomLevel(), |
| 206 |
min, max, EffectParameter::LogarithmicHint)); |
| 207 |
} |
| 208 |
|
| 209 |
return supported; |
| 210 |
} |
| 211 |
|
| 212 |
QT_END_NAMESPACE |