| /* This file is part of the KDE project. |
| |
| Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
| |
| This library is free software: you can redistribute it and/or modify |
| it under the terms of the GNU Lesser General Public License as published by |
| the Free Software Foundation, either version 2.1 or 3 of the License. |
| |
| This library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with this library. If not, see <http://www.gnu.org/licenses/>. |
| |
| */ |
| |
| #include "mediaobject.h" |
| |
| #include "abstractaudioeffect.h" |
| #include "audioplayer.h" |
| |
| QT_BEGIN_NAMESPACE |
| |
| using namespace Phonon; |
| using namespace Phonon::MMF; |
| |
| /*! \class MMF::AbstractAudioEffect |
| \internal |
| */ |
| |
| /*! \namespace Phonon::MMF |
| \internal |
| */ |
| |
| AbstractAudioEffect::AbstractAudioEffect(QObject *parent, |
| const QList<EffectParameter> ¶ms) |
| : MediaNode(parent) |
| , m_params(params) |
| , m_player(0) |
| { |
| |
| } |
| |
| QList<Phonon::EffectParameter> AbstractAudioEffect::parameters() const |
| { |
| // Convert from QList<MMF::EffectParameter> to QList<Phonon::EffectParameter> |
| QList<Phonon::EffectParameter> result; |
| EffectParameter param; |
| foreach (param, m_params) |
| result += param; |
| return result; |
| } |
| |
| QVariant AbstractAudioEffect::parameterValue(const Phonon::EffectParameter &queriedParam) const |
| { |
| const QVariant &val = m_values.value(queriedParam.id()); |
| |
| if (val.isNull()) |
| return queriedParam.defaultValue(); |
| else |
| return val; |
| } |
| |
| void AbstractAudioEffect::setParameterValue(const Phonon::EffectParameter ¶m, |
| const QVariant &newValue) |
| { |
| m_values.insert(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<AbstractMediaPlayer *>(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<AudioPlayer *>(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; i<m_params.count() && !result; ++i) { |
| if (m_params[i].id() == id) |
| result = &m_params[i]; |
| } |
| Q_ASSERT_X(result, Q_FUNC_INFO, "Parameter not found"); |
| return *result; |
| } |
| |
| int AbstractAudioEffect::parameterChanged(const EffectParameter ¶m, |
| const QVariant &value) |
| { |
| int err = 0; |
| |
| switch (param.id()) { |
| case ParameterEnable: |
| setEnabled(value.toBool()); |
| break; |
| default: |
| { |
| const EffectParameter& internalParam = internalParameter(param.id()); |
| err = effectParameterChanged(internalParam, value); |
| } |
| break; |
| } |
| |
| if (!err) |
| TRAP(err, m_effect->ApplyL()); |
| |
| return err; |
| } |
| |
| int AbstractAudioEffect::effectParameterChanged( |
| const EffectParameter ¶m, const QVariant &value) |
| { |
| // Default implementation |
| Q_UNUSED(param) |
| Q_UNUSED(value) |
| Q_ASSERT_X(false, Q_FUNC_INFO, "Effect has no parameters"); |
| return 0; |
| } |
| |
| |
| QT_END_NAMESPACE |
| |