Changeset 651 for trunk/src/3rdparty/phonon/mmf
- Timestamp:
- Mar 8, 2010, 12:52:58 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 18 edited
- 8 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.6.2 (added) merged: 650 /branches/vendor/nokia/qt/current merged: 649 /branches/vendor/nokia/qt/4.6.1 removed
- Property svn:mergeinfo changed
-
trunk/src/3rdparty/phonon/mmf/abstractaudioeffect.cpp
r561 r651 38 38 AbstractAudioEffect::AbstractAudioEffect(QObject *parent, 39 39 const QList<EffectParameter> ¶ms) 40 : MediaNode::MediaNode(parent) 40 : MediaNode(parent) 41 , m_params(params) 41 42 , m_player(0) 42 , m_params(params)43 43 { 44 44 45 } 45 46 46 QList< EffectParameter> AbstractAudioEffect::parameters() const47 QList<Phonon::EffectParameter> AbstractAudioEffect::parameters() const 47 48 { 48 return m_params; 49 // Convert from QList<MMF::EffectParameter> to QList<Phonon::EffectParameter> 50 QList<Phonon::EffectParameter> result; 51 EffectParameter param; 52 foreach (param, m_params) 53 result += param; 54 return result; 49 55 } 50 56 51 QVariant AbstractAudioEffect::parameterValue(const EffectParameter &queriedParam) const57 QVariant AbstractAudioEffect::parameterValue(const Phonon::EffectParameter &queriedParam) const 52 58 { 53 59 const QVariant &val = m_values.value(queriedParam.id()); … … 59 65 } 60 66 61 void AbstractAudioEffect::setParameterValue(const EffectParameter ¶m,67 void AbstractAudioEffect::setParameterValue(const Phonon::EffectParameter ¶m, 62 68 const QVariant &newValue) 63 69 { 64 70 m_values.insert(param.id(), newValue); 65 parameterChanged(param.id(), newValue); 66 // TODO: handle audio effect errors 67 TRAP_IGNORE(m_effect->ApplyL()); 71 72 if (m_effect.data()) { 73 const EffectParameter& internalParam = internalParameter(param.id()); 74 int err = parameterChanged(internalParam, newValue); 75 // TODO: handle audio effect errors 76 Q_UNUSED(err); 77 } 78 } 79 80 void AbstractAudioEffect::abstractPlayerChanged(AbstractPlayer *player) 81 { 82 m_player = qobject_cast<AbstractMediaPlayer *>(player); 83 m_effect.reset(); 84 } 85 86 void AbstractAudioEffect::stateChanged(Phonon::State newState, 87 Phonon::State oldState) 88 { 89 if (Phonon::LoadingState == oldState 90 && Phonon::LoadingState != newState) 91 createEffect(); 68 92 } 69 93 … … 73 97 Q_ASSERT_X(!m_effect.data(), Q_FUNC_INFO, "Effect already created"); 74 98 75 AbstractMediaPlayer *const player = 76 qobject_cast<AbstractMediaPlayer *>(mediaObject->abstractPlayer()); 99 abstractPlayerChanged(mediaObject->abstractPlayer()); 77 100 78 if (player) {79 m_player = player;101 connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), 102 SLOT(stateChanged(Phonon::State, Phonon::State))); 80 103 81 if (AudioPlayer *audioPlayer = qobject_cast<AudioPlayer *>(player)) { 82 connectAudioPlayer(audioPlayer->nativePlayer()); 83 applyParameters(); 84 // TODO: handle audio effect errors 85 TRAP_IGNORE(m_effect->EnableL()); 104 connect(mediaObject, SIGNAL(abstractPlayerChanged(AbstractPlayer *)), 105 SLOT(abstractPlayerChanged(AbstractPlayer *))); 106 107 if (mediaObject->state() != Phonon::LoadingState) 108 createEffect(); 109 } 110 111 void AbstractAudioEffect::disconnectMediaObject(MediaObject *mediaObject) 112 { 113 mediaObject->disconnect(this); 114 abstractPlayerChanged(0); 115 } 116 117 void AbstractAudioEffect::setEnabled(bool enabled) 118 { 119 TInt err = KErrNone; 120 121 if (enabled) 122 // TODO: handle audio effect errors 123 TRAP(err, m_effect->EnableL()) 124 else 125 // TODO: handle audio effect errors 126 TRAP(err, m_effect->DisableL()) 127 128 Q_UNUSED(err); 129 } 130 131 void AbstractAudioEffect::createEffect() 132 { 133 Q_ASSERT_X(m_player, Q_FUNC_INFO, "Invalid media player pointer"); 134 135 if (AudioPlayer *audioPlayer = qobject_cast<AudioPlayer *>(m_player)) { 136 createEffect(audioPlayer->nativePlayer()); 137 } 138 139 if (m_effect.data()) { 140 EffectParameter param; 141 int err = 0; 142 foreach (param, m_params) { 143 const QVariant value = parameterValue(param); 144 err = parameterChanged(param, value); 86 145 } 146 Q_UNUSED(err) 87 147 } 88 148 } 89 149 90 void AbstractAudioEffect::disconnectMediaObject(MediaObject * /*mediaObject*/) 150 const MMF::EffectParameter& AbstractAudioEffect::internalParameter(int id) const 91 151 { 92 m_player = 0; 93 m_effect.reset(); 152 const EffectParameter *result = 0; 153 for (int i=0; i<m_params.count() && !result; ++i) { 154 if (m_params[i].id() == id) 155 result = &m_params[i]; 156 } 157 Q_ASSERT_X(result, Q_FUNC_INFO, "Parameter not found"); 158 return *result; 94 159 } 160 161 int AbstractAudioEffect::parameterChanged(const EffectParameter ¶m, 162 const QVariant &value) 163 { 164 int err = 0; 165 166 switch (param.id()) { 167 case ParameterEnable: 168 setEnabled(value.toBool()); 169 break; 170 default: 171 { 172 const EffectParameter& internalParam = internalParameter(param.id()); 173 err = effectParameterChanged(internalParam, value); 174 } 175 break; 176 } 177 178 if (!err) 179 TRAP(err, m_effect->ApplyL()); 180 181 return err; 182 } 183 184 int AbstractAudioEffect::effectParameterChanged( 185 const EffectParameter ¶m, const QVariant &value) 186 { 187 // Default implementation 188 Q_ASSERT_X(false, Q_FUNC_INFO, "Effect has no parameters"); 189 return 0; 190 } 191 95 192 96 193 QT_END_NAMESPACE -
trunk/src/3rdparty/phonon/mmf/abstractaudioeffect.h
r561 r651 24 24 #include <AudioEffectBase.h> 25 25 26 #include <Phonon/effectinterface.h> 27 #include <Phonon/effectparameter.h> 26 #include <phonon/effectinterface.h> 28 27 29 28 #include "audioplayer.h" 29 #include "effectparameter.h" 30 30 #include "mmf_medianode.h" 31 31 #include "mmf_videoplayer.h" 32 33 class CMdaAudioOutputStream; 32 34 33 35 QT_BEGIN_NAMESPACE … … 37 39 namespace MMF 38 40 { 41 class AbstractPlayer; 39 42 class AbstractMediaPlayer; 40 43 … … 64 67 const QList<EffectParameter> ¶ms); 65 68 66 virtual QList<EffectParameter> parameters() const; 67 virtual QVariant parameterValue(const EffectParameter ¶m) const; 68 virtual void setParameterValue(const EffectParameter &, 69 // Phonon::EffectInterface 70 virtual QList<Phonon::EffectParameter> parameters() const; 71 virtual QVariant parameterValue(const Phonon::EffectParameter ¶m) const; 72 virtual void setParameterValue(const Phonon::EffectParameter &, 69 73 const QVariant &newValue); 70 74 71 enum Type 75 // Parameters which are shared by all effects 76 enum CommonParameters 72 77 { 73 EffectAudioEqualizer = 1, 74 EffectBassBoost, 75 EffectDistanceAttenuation, 76 EffectEnvironmentalReverb, 77 EffectListenerOrientation, 78 EffectLoudness, 79 EffectSourceOrientation, 80 EffectStereoWidening 78 ParameterEnable = 0, 79 ParameterBase // must be last entry in enum 81 80 }; 81 82 public Q_SLOTS: 83 void abstractPlayerChanged(AbstractPlayer *player); 84 void stateChanged(Phonon::State newState, 85 Phonon::State oldState); 82 86 83 87 protected: … … 86 90 void disconnectMediaObject(MediaObject *mediaObject); 87 91 88 virtual void connectAudioPlayer(AudioPlayer::NativePlayer *player) = 0; 89 virtual void applyParameters() = 0; 92 virtual void createEffect(AudioPlayer::NativePlayer *player) = 0; 90 93 91 virtual void parameterChanged(const int id, 92 const QVariant &value) = 0; 94 // Effect-specific parameter changed 95 virtual int effectParameterChanged(const EffectParameter ¶m, 96 const QVariant &value); 97 98 private: 99 void createEffect(); 100 void setEnabled(bool enabled); 101 const EffectParameter& internalParameter(int id) const; 102 int parameterChanged(const EffectParameter ¶m, 103 const QVariant &value); 93 104 94 105 protected: … … 96 107 97 108 private: 109 const QList<EffectParameter> m_params; 98 110 AbstractMediaPlayer * m_player; 99 const QList<EffectParameter> m_params;100 111 QHash<int, QVariant> m_values; 101 112 }; … … 104 115 } 105 116 117 118 // Macro for defining functions which depend on the native class name 119 // for each of the effects. Using this reduces repetition of boilerplate 120 // in the implementations of the backend effect nodes. 121 122 #define PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(Effect) \ 123 \ 124 void Effect##::createEffect(AudioPlayer::NativePlayer *player) \ 125 { \ 126 C##Effect *ptr = 0; \ 127 QT_TRAP_THROWING(ptr = C##Effect::NewL(*player)); \ 128 m_effect.reset(ptr); \ 129 } \ 130 \ 131 C##Effect* Effect::concreteEffect() \ 132 { \ 133 return static_cast<C##Effect *>(m_effect.data()); \ 134 } 135 106 136 QT_END_NAMESPACE 107 137 -
trunk/src/3rdparty/phonon/mmf/abstractplayer.h
r561 r651 20 20 #define PHONON_MMF_ABSTRACTPLAYER_H 21 21 22 #include < Phonon/phononnamespace.h>23 #include < Phonon/mediasource.h>22 #include <phonon/phononnamespace.h> 23 #include <phonon/mediasource.h> 24 24 25 25 #include <QObject> … … 107 107 void tick(qint64 time); 108 108 void bufferStatus(int percentFilled); 109 void stateChanged(Phonon::State oldState,110 Phonon::State newState);109 void stateChanged(Phonon::State newState, 110 Phonon::State oldState); 111 111 void metaDataChanged(const QMultiMap<QString, QString>& metaData); 112 112 void aboutToFinish(); -
trunk/src/3rdparty/phonon/mmf/audioequalizer.cpp
r561 r651 29 29 */ 30 30 31 AudioEqualizer::AudioEqualizer(QObject *parent) : AbstractAudioEffect::AbstractAudioEffect(parent, createParams()) 31 // Define functions which depend on concrete native effect class name 32 PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(AudioEqualizer) 33 34 AudioEqualizer::AudioEqualizer(QObject *parent, const QList<EffectParameter>& parameters) 35 : AbstractAudioEffect::AbstractAudioEffect(parent, parameters) 32 36 { 37 33 38 } 34 39 35 void AudioEqualizer::parameterChanged(const int pid,40 int AudioEqualizer::effectParameterChanged(const EffectParameter ¶m, 36 41 const QVariant &value) 37 42 { 38 if (m_effect.data()) { 39 const int band = pid; 40 const int level = value.toInt(); 41 setBandLevel(band, level); 42 } 43 const int band = param.id() - ParameterBase + 1; 44 45 const qreal externalLevel = value.toReal(); 46 const int internalLevel = param.toInternalValue(externalLevel); 47 48 TRAPD(err, concreteEffect()->SetBandLevelL(band, internalLevel)); 49 return err; 43 50 } 44 51 45 void AudioEqualizer::connectAudioPlayer(AudioPlayer::NativePlayer *player) 52 53 //----------------------------------------------------------------------------- 54 // Static functions 55 //----------------------------------------------------------------------------- 56 57 const char* AudioEqualizer::description() 46 58 { 47 CAudioEqualizer *ptr = 0; 48 QT_TRAP_THROWING(ptr = CAudioEqualizer::NewL(*player)); 49 m_effect.reset(ptr); 59 return "Audio equalizer"; 50 60 } 51 61 52 void AudioEqualizer::applyParameters() 62 bool AudioEqualizer::getParameters(CMdaAudioOutputStream *stream, 63 QList<EffectParameter>& parameters) 53 64 { 54 if (m_effect.data()) { 55 EffectParameter param; 56 foreach (param, parameters()) { 57 const int band = param.id(); 58 const int level = parameterValue(param).toInt(); 59 setBandLevel(band, level); 65 bool supported = false; 66 67 QScopedPointer<CAudioEqualizer> effect; 68 TRAPD(err, effect.reset(CAudioEqualizer::NewL(*stream))); 69 70 if (KErrNone == err) { 71 supported = true; 72 73 TInt32 dbMin; 74 TInt32 dbMax; 75 effect->DbLevelLimits(dbMin, dbMax); 76 77 const int bandCount = effect->NumberOfBands(); 78 79 for (int i = 0; i < bandCount; ++i) { 80 // For some reason, band IDs are 1-based, as opposed to the 81 // 0-based indices used in just about other Symbian API...! 82 const int band = i + 1; 83 84 const qint32 hz = effect->CenterFrequency(band); 85 86 // We pass a floating-point parameter range of -1.0 to +1.0 for 87 // each band in order to work around a limitation in 88 // Phonon::EffectWidget. See documentation of EffectParameter 89 // for more details. 90 EffectParameter param( 91 /* parameterId */ ParameterBase + i, 92 /* name */ tr("%1 Hz").arg(hz), 93 /* hints */ EffectParameter::LogarithmicHint, 94 /* defaultValue */ QVariant(qreal(0.0)), 95 /* minimumValue */ QVariant(qreal(-1.0)), 96 /* maximumValue */ QVariant(qreal(+1.0))); 97 98 param.setInternalRange(dbMin, dbMax); 99 parameters.append(param); 60 100 } 61 101 } 62 }63 102 64 void AudioEqualizer::setBandLevel(int band, int level) 65 { 66 CAudioEqualizer *const effect = static_cast<CAudioEqualizer *>(m_effect.data()); 67 // TODO: handle audio effect errors 68 TRAP_IGNORE(effect->SetBandLevelL(band, level)); 69 } 70 71 QList<EffectParameter> AudioEqualizer::createParams() 72 { 73 QList<EffectParameter> retval; 74 75 // We temporarily create an AudioPlayer, and run the effect on it, so 76 // we can extract the readonly data we need. 77 AudioPlayer dummyPlayer; 78 79 CAudioEqualizer *eqPtr = 0; 80 QT_TRAP_THROWING(eqPtr = CAudioEqualizer::NewL(*dummyPlayer.nativePlayer())); 81 QScopedPointer<CAudioEqualizer> e(eqPtr); 82 83 TInt32 dbMin; 84 TInt32 dbMax; 85 e->DbLevelLimits(dbMin, dbMax); 86 87 const int bandCount = e->NumberOfBands(); 88 89 for (int i = 0; i < bandCount; ++i) { 90 const qint32 hz = e->CenterFrequency(i); 91 92 const qint32 defVol = e->BandLevel(i); 93 94 retval.append(EffectParameter(i, 95 tr("Frequency band, %1 Hz").arg(hz), 96 EffectParameter::LogarithmicHint, 97 QVariant(qint32(defVol)), 98 QVariant(qint32(dbMin)), 99 QVariant(qint32(dbMax)), 100 QVariantList(), 101 QString())); 102 } 103 104 return retval; 103 return supported; 105 104 } 106 105 -
trunk/src/3rdparty/phonon/mmf/audioequalizer.h
r561 r651 22 22 #include "abstractaudioeffect.h" 23 23 24 class CAudioEqualizer; 25 24 26 QT_BEGIN_NAMESPACE 25 27 … … 40 42 Q_OBJECT 41 43 public: 42 AudioEqualizer(QObject *parent); 44 AudioEqualizer(QObject *parent, const QList<EffectParameter> ¶meters); 45 46 // Static interface required by EffectFactory 47 static const char* description(); 48 static bool getParameters(CMdaAudioOutputStream *stream, 49 QList<EffectParameter>& parameters); 43 50 44 51 protected: 45 52 // AbstractAudioEffect 46 virtual void c onnectAudioPlayer(AudioPlayer::NativePlayer *player);47 virtual void applyParameters();48 virtual void parameterChanged(const int id,const QVariant &value);53 virtual void createEffect(AudioPlayer::NativePlayer *player); 54 virtual int effectParameterChanged(const EffectParameter ¶m, 55 const QVariant &value); 49 56 50 57 private: 51 void setBandLevel(int band, int level); 52 53 private: 54 static QList<EffectParameter> createParams(); 58 CAudioEqualizer *concreteEffect(); 55 59 56 60 }; -
trunk/src/3rdparty/phonon/mmf/backend.cpp
r561 r651 46 46 : QObject(parent) 47 47 , m_ancestorMoveMonitor(new AncestorMoveMonitor(this)) 48 , m_effectFactory(new EffectFactory(this)) 48 49 { 49 50 TRACE_CONTEXT(Backend::Backend, EBackend); … … 82 83 Q_ASSERT(args.count() == 1); 83 84 Q_ASSERT(args.first().type() == QVariant::Int); 84 const AbstractAudioEffect::Type effect = AbstractAudioEffect::Type(args.first().toInt());85 86 return EffectFactory::createAudioEffect(effect, parent);85 const EffectFactory::Type type = 86 static_cast<EffectFactory::Type>(args.first().toInt()); 87 return m_effectFactory->createAudioEffect(type, parent); 87 88 } 88 89 case VideoWidgetClass: … … 106 107 { 107 108 case EffectType: 108 retval.append( EffectFactory::effectIndexes());109 retval.append(m_effectFactory->effectIndexes()); 109 110 break; 110 111 case AudioOutputDeviceType: … … 127 128 switch (type) { 128 129 case EffectType: 129 return EffectFactory::audioEffectDescriptions(AbstractAudioEffect::Type(index));130 return m_effectFactory->audioEffectDescriptions(EffectFactory::Type(index)); 130 131 case AudioOutputDeviceType: 131 132 return AudioOutput::audioOutputDescription(index); -
trunk/src/3rdparty/phonon/mmf/backend.h
r561 r651 21 21 22 22 #include "ancestormovemonitor.h" 23 #include "effectfactory.h" 23 24 24 #include < Phonon/mediasource.h>25 #include < Phonon/backendinterface.h>25 #include <phonon/mediasource.h> 26 #include <phonon/backendinterface.h> 26 27 #include <QScopedPointer> 27 28 … … 54 55 private: 55 56 QScopedPointer<AncestorMoveMonitor> m_ancestorMoveMonitor; 57 QScopedPointer<EffectFactory> m_effectFactory; 56 58 57 59 }; -
trunk/src/3rdparty/phonon/mmf/bassboost.cpp
r561 r651 25 25 using namespace Phonon::MMF; 26 26 27 // Define functions which depend on concrete native effect class name 28 PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(BassBoost) 29 27 30 /*! \class MMF::BassBoost 28 31 \internal 29 32 */ 30 33 31 BassBoost::BassBoost(QObject *parent ) : AbstractAudioEffect::AbstractAudioEffect(parent,32 QList<EffectParameter>())34 BassBoost::BassBoost(QObject *parent, const QList<EffectParameter> ¶meters) 35 : AbstractAudioEffect::AbstractAudioEffect(parent, parameters) 33 36 { 37 34 38 } 35 39 36 void BassBoost::parameterChanged(const int, 37 const QVariant &) 40 //----------------------------------------------------------------------------- 41 // Static functions 42 //----------------------------------------------------------------------------- 43 44 const char* BassBoost::description() 38 45 { 39 Q_ASSERT_X(false, Q_FUNC_INFO, "BassBoost has not parameters");46 return "Bass boost"; 40 47 } 41 48 42 void BassBoost::connectAudioPlayer(AudioPlayer::NativePlayer *player) 49 bool BassBoost::getParameters(CMdaAudioOutputStream *stream, 50 QList<EffectParameter> ¶meters) 43 51 { 44 CBassBoost *ptr = 0; 45 QT_TRAP_THROWING(ptr = CBassBoost::NewL(*player)); 46 m_effect.reset(ptr); 47 } 48 49 void BassBoost::applyParameters() 50 { 51 // No parameters to apply 52 QScopedPointer<CBassBoost> effect; 53 TRAPD(err, effect.reset(CBassBoost::NewL(*stream))); 54 return (KErrNone == err); 52 55 } 53 56 -
trunk/src/3rdparty/phonon/mmf/bassboost.h
r561 r651 22 22 #include "abstractaudioeffect.h" 23 23 24 class CBassBoost; 25 24 26 QT_BEGIN_NAMESPACE 25 27 … … 29 31 { 30 32 /** 31 * @short An "bass boost" effect. 32 * 33 * The documentation does not say what "bass boost" is, neither has it anykind 34 * of setting. It's an on or off thing. 33 * @short A "bass boost" effect. 35 34 */ 36 35 class BassBoost : public AbstractAudioEffect … … 38 37 Q_OBJECT 39 38 public: 40 BassBoost(QObject *parent); 39 BassBoost(QObject *parent, const QList<EffectParameter> ¶meters); 40 41 // Static interface required by EffectFactory 42 static const char* description(); 43 static bool getParameters(CMdaAudioOutputStream *stream, 44 QList<EffectParameter>& parameters); 41 45 42 46 protected: 43 47 // AbstractAudioEffect 44 virtual void connectAudioPlayer(AudioPlayer::NativePlayer *player); 45 virtual void applyParameters(); 46 virtual void parameterChanged(const int id, const QVariant &value); 48 virtual void createEffect(AudioPlayer::NativePlayer *player); 49 50 private: 51 CBassBoost *concreteEffect(); 47 52 48 53 }; -
trunk/src/3rdparty/phonon/mmf/effectfactory.cpp
r561 r651 20 20 #include <QCoreApplication> 21 21 22 #include <AudioEqualizerBase.h> 23 #include <BassBoostBase.h> 24 #include <DistanceAttenuationBase.h> 25 #include <DopplerBase.h> 26 #include <EnvironmentalReverbBase.h> 27 #include <ListenerOrientationBase.h> 28 #include <LocationBase.h> 29 #include <LoudnessBase.h> 30 #include <SourceOrientationBase.h> 31 #include <StereoWideningBase.h> 22 #include <mdaaudiooutputstream.h> 32 23 33 24 #include "audioequalizer.h" 34 25 #include "bassboost.h" 26 #include "environmentalreverb.h" 27 #include "loudness.h" 28 #include "stereowidening.h" 35 29 36 30 #include "effectfactory.h" … … 45 39 */ 46 40 47 QHash<QByteArray, QVariant> EffectFactory::constructEffectDescription(const QString &name, 48 const QString &description) 49 { 50 QHash<QByteArray, QVariant> retval; 51 52 retval.insert("name", name); 53 retval.insert("description", description); 54 retval.insert("available", true); 55 56 return retval; 57 } 58 59 60 QHash<QByteArray, QVariant> EffectFactory::audioEffectDescriptions(AbstractAudioEffect::Type type) 61 { 41 EffectFactory::EffectFactory(QObject *parent) 42 : QObject(parent) 43 , m_initialized(false) 44 { 45 46 } 47 48 EffectFactory::~EffectFactory() 49 { 50 51 } 52 53 //----------------------------------------------------------------------------- 54 // Public functions 55 //----------------------------------------------------------------------------- 56 57 AbstractAudioEffect *EffectFactory::createAudioEffect(Type type, 58 QObject *parent) 59 { 60 // Lazily initialize 61 if (!m_initialized) 62 initialize(); 63 64 Q_ASSERT(parent); 65 66 const QList<EffectParameter>& parameters = data(type).m_parameters; 67 68 AbstractAudioEffect *effect = 0; 69 62 70 switch (type) 63 71 { 64 case AbstractAudioEffect::EffectAudioEqualizer: 65 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Audio Equalizer"), "Audio equalizer."); 66 case AbstractAudioEffect::EffectBassBoost: 67 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Bass Boost"), "Bass boost."); 68 case AbstractAudioEffect::EffectDistanceAttenuation: 69 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Distance Attenuation"), "Distance Attenuation."); 70 case AbstractAudioEffect::EffectEnvironmentalReverb: 71 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Environmental Reverb"), "Environmental Reverb."); 72 case AbstractAudioEffect::EffectListenerOrientation: 73 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Environmental Reverb"), "Environmental Reverb."); 74 case AbstractAudioEffect::EffectLoudness: 75 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Loudness"), "Loudness."); 76 case AbstractAudioEffect::EffectSourceOrientation: 77 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Source Orientation"), "Source Orientation."); 78 case AbstractAudioEffect::EffectStereoWidening: 79 return constructEffectDescription(QCoreApplication::translate("Phonon::MMF::EffectFactory", "Stereo Widening"), "Stereo Widening."); 80 } 81 82 Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown effect type."); 83 return QHash<QByteArray, QVariant>(); 84 } 85 86 AbstractAudioEffect *EffectFactory::createAudioEffect(AbstractAudioEffect::Type type, 87 QObject *parent) 88 { 89 Q_ASSERT(parent); 90 91 switch (type) 72 case TypeBassBoost: 73 effect = new BassBoost(parent, parameters); 74 break; 75 case TypeAudioEqualizer: 76 effect = new AudioEqualizer(parent, parameters); 77 break; 78 case TypeEnvironmentalReverb: 79 effect = new EnvironmentalReverb(parent, parameters); 80 break; 81 case TypeLoudness: 82 effect = new Loudness(parent, parameters); 83 break; 84 case TypeStereoWidening: 85 effect = new StereoWidening(parent, parameters); 86 break; 87 88 // Not implemented 89 case TypeDistanceAttenuation: 90 case TypeListenerOrientation: 91 case TypeSourceOrientation: 92 // Fall through 93 default: 94 Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown effect"); 95 } 96 97 return effect; 98 } 99 100 QHash<QByteArray, QVariant> EffectFactory::audioEffectDescriptions(Type type) 101 { 102 // Lazily initialize 103 if (!m_initialized) 104 initialize(); 105 106 return data(type).m_descriptions; 107 } 108 109 QList<int> EffectFactory::effectIndexes() 110 { 111 // Lazily initialize 112 if (!m_initialized) 113 initialize(); 114 115 QList<int> result; 116 117 QHash<Type, EffectData>::const_iterator i = m_effectData.begin(); 118 for ( ; i != m_effectData.end(); ++i) 119 if (i.value().m_supported) 120 result.append(i.key()); 121 122 return result; 123 } 124 125 //----------------------------------------------------------------------------- 126 // Private functions 127 //----------------------------------------------------------------------------- 128 129 #define INITIALIZE_EFFECT(Effect) \ 130 { \ 131 EffectData data = getData<Effect>(); \ 132 m_effectData.insert(Type##Effect, data); \ 133 } 134 135 void EffectFactory::initialize() 136 { 137 Q_ASSERT_X(!m_initialized, Q_FUNC_INFO, "Already initialized"); 138 139 INITIALIZE_EFFECT(AudioEqualizer) 140 INITIALIZE_EFFECT(BassBoost) 141 INITIALIZE_EFFECT(EnvironmentalReverb) 142 INITIALIZE_EFFECT(Loudness) 143 INITIALIZE_EFFECT(StereoWidening) 144 145 m_initialized = true; 146 } 147 148 // This class is just a wrapper which allows us to instantiate a 149 // CMdaAudioOutputStream object. This is done in order to allow the 150 // effects API to query the DevSound implementation, to discover 151 // which effects are supported and what parameters they take. 152 // Ideally, we would use CMMFDevSound directly, but this class is not 153 // available in the public S60 SDK. 154 class OutputStreamFactory : public MMdaAudioOutputStreamCallback 155 { 156 public: 157 CMdaAudioOutputStream* create() 92 158 { 93 case AbstractAudioEffect::EffectBassBoost: 94 return new BassBoost(parent); 95 case AbstractAudioEffect::EffectAudioEqualizer: 96 return new AudioEqualizer(parent); 97 case AbstractAudioEffect::EffectDistanceAttenuation: 98 case AbstractAudioEffect::EffectEnvironmentalReverb: 99 case AbstractAudioEffect::EffectListenerOrientation: 100 case AbstractAudioEffect::EffectLoudness: 101 case AbstractAudioEffect::EffectSourceOrientation: 102 case AbstractAudioEffect::EffectStereoWidening: 103 ; 104 } 105 106 Q_ASSERT_X(false, Q_FUNC_INFO, "Unknown effect."); 107 return 0; 108 } 109 110 template<typename TEffect> 111 bool isEffectSupported() 112 { 113 AudioPlayer audioPlayer; 114 115 QScopedPointer<TEffect> eff; 116 TRAPD(errorCode, eff.reset(TEffect::NewL(*audioPlayer.nativePlayer()))); 117 118 return errorCode != KErrNone; 119 } 120 121 QList<int> EffectFactory::effectIndexes() 122 { 123 QList<int> retval; 124 125 if (isEffectSupported<CAudioEqualizer>()) 126 retval.append(AbstractAudioEffect::EffectAudioEqualizer); 127 128 if (isEffectSupported<CBassBoost>()) 129 retval.append(AbstractAudioEffect::EffectBassBoost); 130 131 /* We haven't implemented these yet. 132 if (isEffectSupported<CDistanceAttenuation>()) 133 retval.append(AbstractAudioEffect::EffectDistanceAttenuation); 134 135 if (isEffectSupported<CEnvironmentalReverb>()) 136 retval.append(AbstractAudioEffect::EffectEnvironmentalReverb); 137 138 if (isEffectSupported<CLoudness>()) 139 retval.append(AbstractAudioEffect::EffectLoudness); 140 141 if (isEffectSupported<CListenerOrientation>()) 142 retval.append(AbstractAudioEffect::EffectListenerOrientation); 143 144 if (isEffectSupported<CSourceOrientation>()) 145 retval.append(AbstractAudioEffect::EffectSourceOrientation); 146 147 if (isEffectSupported<CStereoWidening>()) 148 retval.append(AbstractAudioEffect::EffectStereoWidening); 149 */ 150 151 return retval; 159 CMdaAudioOutputStream* stream = 0; 160 QT_TRAP_THROWING(stream = CMdaAudioOutputStream::NewL(*this)); 161 return stream; 162 } 163 private: 164 void MaoscOpenComplete(TInt /*aError*/) { } 165 void MaoscBufferCopied(TInt /*aError*/, const TDesC8& /*aBuffer*/) { } 166 void MaoscPlayComplete(TInt /*aError*/) { } 167 }; 168 169 template<typename BackendNode> 170 EffectFactory::EffectData EffectFactory::getData() 171 { 172 EffectData data; 173 174 // Create a temporary CMdaAudioOutputStream object, so that the effects 175 // API can query DevSound to discover which effects are supported. 176 OutputStreamFactory streamFactory; 177 QScopedPointer<CMdaAudioOutputStream> stream(streamFactory.create()); 178 179 EffectParameter param( 180 /* parameterId */ AbstractAudioEffect::ParameterEnable, 181 /* name */ tr("Enabled"), 182 /* hints */ EffectParameter::ToggledHint, 183 /* defaultValue */ QVariant(bool(true))); 184 data.m_parameters.append(param); 185 186 if (data.m_supported = BackendNode::getParameters 187 (stream.data(), data.m_parameters)) { 188 const QString description = QCoreApplication::translate 189 ("Phonon::MMF::EffectFactory", BackendNode::description()); 190 data.m_descriptions.insert("name", description); 191 data.m_descriptions.insert("description", description); 192 data.m_descriptions.insert("available", true); 193 } 194 195 // Sanity check to ensure that all parameter IDs are unique 196 QSet<int> ids; 197 foreach (param, data.m_parameters) { 198 Q_ASSERT_X(ids.find(param.id()) == ids.end(), Q_FUNC_INFO, 199 "Parameter list contains duplicates"); 200 ids.insert(param.id()); 201 } 202 203 return data; 204 } 205 206 const EffectFactory::EffectData& EffectFactory::data(Type type) const 207 { 208 QHash<Type, EffectData>::const_iterator i = m_effectData.find(type); 209 Q_ASSERT_X(i != m_effectData.end(), Q_FUNC_INFO, "Effect data not found"); 210 return i.value(); 152 211 } 153 212 -
trunk/src/3rdparty/phonon/mmf/effectfactory.h
r561 r651 21 21 22 22 #include "abstractaudioeffect.h" 23 #include "effectparameter.h" 23 24 24 25 QT_BEGIN_NAMESPACE … … 32 33 * @short Contains utility functions related to effects. 33 34 */ 34 class EffectFactory 35 class EffectFactory : public QObject 35 36 { 37 Q_OBJECT 38 36 39 public: 40 EffectFactory(QObject *parent); 41 ~EffectFactory(); 42 43 enum Type 44 { 45 TypeAudioEqualizer = 0 46 , TypeBassBoost 47 , TypeDistanceAttenuation 48 , TypeEnvironmentalReverb 49 , TypeListenerOrientation 50 , TypeLoudness 51 , TypeSourceOrientation 52 , TypeStereoWidening 53 }; 54 37 55 /** 38 56 * @short Creates an audio effect of type @p type. 39 57 */ 40 static AbstractAudioEffect *createAudioEffect(AbstractAudioEffect::Type type, 41 QObject *parent); 58 AbstractAudioEffect *createAudioEffect(Type type, QObject *parent); 42 59 43 60 /** … … 47 64 * BackendInterface::objectDescriptionProperties(). 48 65 */ 49 static QHash<QByteArray, QVariant> audioEffectDescriptions(AbstractAudioEffect::Type type);66 QHash<QByteArray, QVariant> audioEffectDescriptions(Type type); 50 67 51 68 /** … … 55 72 * BackendInterface::objectDescriptionIndexes(). 56 73 */ 57 staticQList<int> effectIndexes();74 QList<int> effectIndexes(); 58 75 59 76 private: 60 static inline QHash<QByteArray, QVariant> constructEffectDescription(const QString &name, 61 const QString &description); 77 void initialize(); 62 78 63 /** 64 * This class is not supposed to be instantiated, so disable 65 * the default constructor. 66 */ 67 inline EffectFactory(); 68 Q_DISABLE_COPY(EffectFactory) 79 struct EffectData 80 { 81 bool m_supported; 82 QHash<QByteArray, QVariant> m_descriptions; 83 QList<EffectParameter> m_parameters; 84 }; 85 86 template<typename BackendNode> EffectData getData(); 87 const EffectData& data(Type type) const; 88 89 private: 90 bool m_initialized; 91 QHash<Type, EffectData> m_effectData; 92 69 93 }; 94 70 95 } 71 96 } -
trunk/src/3rdparty/phonon/mmf/mediaobject.cpp
r561 r651 298 298 } 299 299 300 if (oldPlayer) 301 emit abstractPlayerChanged(0); 300 302 m_player.reset(newPlayer); 303 emit abstractPlayerChanged(newPlayer); 301 304 302 305 if (oldPlayerHasVideo != hasVideo()) { -
trunk/src/3rdparty/phonon/mmf/mediaobject.h
r561 r651 20 20 #define PHONON_MMF_MEDIAOBJECT_H 21 21 22 #include < Phonon/mediasource.h>23 #include < Phonon/mediaobjectinterface.h>22 #include <phonon/mediasource.h> 23 #include <phonon/mediaobjectinterface.h> 24 24 #include <QScopedPointer> 25 25 #include <QTimer> … … 93 93 94 94 Q_SIGNALS: 95 void abstractPlayerChanged(AbstractPlayer *player); 95 96 void totalTimeChanged(qint64 length); 96 97 void hasVideoChanged(bool hasVideo); … … 102 103 void metaDataChanged(const QMultiMap<QString, QString>& metaData); 103 104 void currentSourceChanged(const MediaSource& source); 104 void stateChanged(Phonon::State oldState,105 Phonon::State newState);105 void stateChanged(Phonon::State newState, 106 Phonon::State oldState); 106 107 void finished(); 107 108 void tick(qint64 time); -
trunk/src/3rdparty/phonon/mmf/mmf_medianode.h
r561 r651 21 21 22 22 #include <QObject> 23 #include < Phonon/effectinterface.h>23 #include <phonon/effectinterface.h> 24 24 #include "audioplayer.h" 25 25 -
trunk/src/3rdparty/phonon/mmf/utils.h
r561 r651 45 45 class Utils 46 46 { 47 Q_DECLARE_TR_FUNCTIONS( Utils)47 Q_DECLARE_TR_FUNCTIONS(Phonon::MMF) 48 48 49 49 public: -
trunk/src/3rdparty/phonon/mmf/videooutput.h
r561 r651 25 25 #include "defs.h" 26 26 27 #include < Phonon/videowidget.h>27 #include <phonon/videowidget.h> 28 28 29 29 #include <e32std.h> -
trunk/src/3rdparty/phonon/mmf/videowidget.h
r561 r651 24 24 25 25 #include <QtGui/QWidget> 26 #include < Phonon/videowidget.h>27 #include < Phonon/videowidgetinterface.h>26 #include <phonon/videowidget.h> 27 #include <phonon/videowidgetinterface.h> 28 28 29 29 QT_BEGIN_NAMESPACE
Note:
See TracChangeset
for help on using the changeset viewer.