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
EnvironmentalReverb(QObject * parent,const QList<EffectParameter> & parameters)48 EnvironmentalReverb::EnvironmentalReverb(QObject *parent, const QList<EffectParameter>& parameters)
49 : AbstractAudioEffect::AbstractAudioEffect(parent, parameters)
50 {
51
52 }
53
effectParameterChanged(const EffectParameter & param,const QVariant & value)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
description()105 const char* EnvironmentalReverb::description()
106 {
107 return "Reverb";
108 }
109
110 // Internal helper function
createParameter(int id,const QString & name,int defaultValue,int minValue,int maxValue,Phonon::EffectParameter::Hint hint=Phonon::EffectParameter::IntegerHint)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
getParameters(CMdaAudioOutputStream * stream,QList<EffectParameter> & parameters)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
213