diff -r 41300fa6a67c -r 3b1da2848fc7 src/3rdparty/phonon/mmf/abstractaudioeffect.cpp --- a/src/3rdparty/phonon/mmf/abstractaudioeffect.cpp Tue Feb 02 00:43:10 2010 +0200 +++ b/src/3rdparty/phonon/mmf/abstractaudioeffect.cpp Fri Feb 19 23:40:16 2010 +0200 @@ -19,6 +19,8 @@ #include "mediaobject.h" #include "abstractaudioeffect.h" +#include "audioplayer.h" +#include "mmf_videoplayer.h" QT_BEGIN_NAMESPACE @@ -34,24 +36,25 @@ */ AbstractAudioEffect::AbstractAudioEffect(QObject *parent, - const QList ¶ms) : MediaNode::MediaNode(parent) - , m_params(params) + const QList ¶ms) + : MediaNode(parent) + , m_params(params) + , m_player(0) { + } -bool AbstractAudioEffect::disconnectMediaNode(MediaNode *target) +QList AbstractAudioEffect::parameters() const { - MediaNode::disconnectMediaNode(target); - m_effect.reset(); - return true; + // Convert from QList to QList + QList result; + EffectParameter param; + foreach (param, m_params) + result += param; + return result; } -QList AbstractAudioEffect::parameters() const -{ - return m_params; -} - -QVariant AbstractAudioEffect::parameterValue(const EffectParameter &queriedParam) const +QVariant AbstractAudioEffect::parameterValue(const Phonon::EffectParameter &queriedParam) const { const QVariant &val = m_values.value(queriedParam.id()); @@ -61,22 +64,131 @@ return val; } -bool AbstractAudioEffect::activateOnMediaObject(MediaObject *mo) -{ - AudioPlayer *const ap = qobject_cast(mo->abstractPlayer()); - - if (ap) - return activateOn(ap->player()); - else - return true; -} - -void AbstractAudioEffect::setParameterValue(const EffectParameter ¶m, +void AbstractAudioEffect::setParameterValue(const Phonon::EffectParameter ¶m, const QVariant &newValue) { m_values.insert(param.id(), newValue); - parameterChanged(param.id(), newValue); + + if (m_effect.data()) { + const EffectParameter& internalParam = internalParameter(param.id()); + int err = parameterChanged(internalParam, newValue); + // TODO: handle audio effect errors + Q_UNUSED(err); + } +} + +void AbstractAudioEffect::abstractPlayerChanged(AbstractPlayer *player) +{ + m_player = qobject_cast(player); + m_effect.reset(); +} + +void AbstractAudioEffect::stateChanged(Phonon::State newState, + Phonon::State oldState) +{ + if (Phonon::LoadingState == oldState + && Phonon::LoadingState != newState) + createEffect(); +} + +void AbstractAudioEffect::connectMediaObject(MediaObject *mediaObject) +{ + Q_ASSERT_X(!m_player, Q_FUNC_INFO, "Player already connected"); + Q_ASSERT_X(!m_effect.data(), Q_FUNC_INFO, "Effect already created"); + + abstractPlayerChanged(mediaObject->abstractPlayer()); + + connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), + SLOT(stateChanged(Phonon::State, Phonon::State))); + + connect(mediaObject, SIGNAL(abstractPlayerChanged(AbstractPlayer *)), + SLOT(abstractPlayerChanged(AbstractPlayer *))); + + if (mediaObject->state() != Phonon::LoadingState) + createEffect(); +} + +void AbstractAudioEffect::disconnectMediaObject(MediaObject *mediaObject) +{ + mediaObject->disconnect(this); + abstractPlayerChanged(0); +} + +void AbstractAudioEffect::setEnabled(bool enabled) +{ + TInt err = KErrNone; + + if (enabled) + // TODO: handle audio effect errors + TRAP(err, m_effect->EnableL()) + else + // TODO: handle audio effect errors + TRAP(err, m_effect->DisableL()) + + Q_UNUSED(err); } +void AbstractAudioEffect::createEffect() +{ + Q_ASSERT_X(m_player, Q_FUNC_INFO, "Invalid media player pointer"); + + if (AudioPlayer *audioPlayer = qobject_cast(m_player)) { + createEffect(audioPlayer->nativePlayer()); + } + + if (m_effect.data()) { + EffectParameter param; + int err = 0; + foreach (param, m_params) { + const QVariant value = parameterValue(param); + err = parameterChanged(param, value); + } + Q_UNUSED(err) + } +} + +const MMF::EffectParameter& AbstractAudioEffect::internalParameter(int id) const +{ + const EffectParameter *result = 0; + for (int i=0; iApplyL()); + + return err; +} + +int AbstractAudioEffect::effectParameterChanged( + const EffectParameter ¶m, const QVariant &value) +{ + // Default implementation + Q_ASSERT_X(false, Q_FUNC_INFO, "Effect has no parameters"); + return 0; +} + + QT_END_NAMESPACE