src/3rdparty/phonon/mmf/abstractaudioeffect.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
    17 */
    17 */
    18 
    18 
    19 #include "mediaobject.h"
    19 #include "mediaobject.h"
    20 
    20 
    21 #include "abstractaudioeffect.h"
    21 #include "abstractaudioeffect.h"
       
    22 #include "audioplayer.h"
    22 
    23 
    23 QT_BEGIN_NAMESPACE
    24 QT_BEGIN_NAMESPACE
    24 
    25 
    25 using namespace Phonon;
    26 using namespace Phonon;
    26 using namespace Phonon::MMF;
    27 using namespace Phonon::MMF;
    32 /*! \namespace Phonon::MMF
    33 /*! \namespace Phonon::MMF
    33   \internal
    34   \internal
    34 */
    35 */
    35 
    36 
    36 AbstractAudioEffect::AbstractAudioEffect(QObject *parent,
    37 AbstractAudioEffect::AbstractAudioEffect(QObject *parent,
    37                                          const QList<EffectParameter> &params) : MediaNode::MediaNode(parent)
    38                                          const QList<EffectParameter> &params)
    38                                                                                , m_params(params)
    39     :   MediaNode(parent)
       
    40     ,   m_params(params)
       
    41     ,   m_player(0)
    39 {
    42 {
       
    43 
    40 }
    44 }
    41 
    45 
    42 bool AbstractAudioEffect::disconnectMediaNode(MediaNode *target)
    46 QList<Phonon::EffectParameter> AbstractAudioEffect::parameters() const
    43 {
    47 {
    44     MediaNode::disconnectMediaNode(target);
    48     // Convert from QList<MMF::EffectParameter> to QList<Phonon::EffectParameter>
    45     m_effect.reset();
    49     QList<Phonon::EffectParameter> result;
    46     return true;
    50     EffectParameter param;
       
    51     foreach (param, m_params)
       
    52         result += param;
       
    53     return result;
    47 }
    54 }
    48 
    55 
    49 QList<EffectParameter> AbstractAudioEffect::parameters() const
    56 QVariant AbstractAudioEffect::parameterValue(const Phonon::EffectParameter &queriedParam) const
    50 {
       
    51     return m_params;
       
    52 }
       
    53 
       
    54 QVariant AbstractAudioEffect::parameterValue(const EffectParameter &queriedParam) const
       
    55 {
    57 {
    56     const QVariant &val = m_values.value(queriedParam.id());
    58     const QVariant &val = m_values.value(queriedParam.id());
    57 
    59 
    58     if (val.isNull())
    60     if (val.isNull())
    59         return queriedParam.defaultValue();
    61         return queriedParam.defaultValue();
    60     else
    62     else
    61         return val;
    63         return val;
    62 }
    64 }
    63 
    65 
    64 bool AbstractAudioEffect::activateOnMediaObject(MediaObject *mo)
    66 void AbstractAudioEffect::setParameterValue(const Phonon::EffectParameter &param,
    65 {
       
    66     AudioPlayer *const ap = qobject_cast<AudioPlayer *>(mo->abstractPlayer());
       
    67 
       
    68     if (ap)
       
    69         return activateOn(ap->player());
       
    70     else
       
    71         return true;
       
    72 }
       
    73 
       
    74 void AbstractAudioEffect::setParameterValue(const EffectParameter &param,
       
    75                                             const QVariant &newValue)
    67                                             const QVariant &newValue)
    76 {
    68 {
    77     m_values.insert(param.id(), newValue);
    69     m_values.insert(param.id(), newValue);
    78     parameterChanged(param.id(), newValue);
    70 
       
    71     if (m_effect.data()) {
       
    72         const EffectParameter& internalParam = internalParameter(param.id());
       
    73         int err = parameterChanged(internalParam, newValue);
       
    74         // TODO: handle audio effect errors
       
    75         Q_UNUSED(err);
       
    76     }
    79 }
    77 }
       
    78 
       
    79 void AbstractAudioEffect::abstractPlayerChanged(AbstractPlayer *player)
       
    80 {
       
    81     m_player = qobject_cast<AbstractMediaPlayer *>(player);
       
    82     m_effect.reset();
       
    83 }
       
    84 
       
    85 void AbstractAudioEffect::stateChanged(Phonon::State newState,
       
    86                                        Phonon::State oldState)
       
    87 {
       
    88     if (Phonon::LoadingState == oldState
       
    89         && Phonon::LoadingState != newState)
       
    90         createEffect();
       
    91 }
       
    92 
       
    93 void AbstractAudioEffect::connectMediaObject(MediaObject *mediaObject)
       
    94 {
       
    95     Q_ASSERT_X(!m_player, Q_FUNC_INFO, "Player already connected");
       
    96     Q_ASSERT_X(!m_effect.data(), Q_FUNC_INFO, "Effect already created");
       
    97 
       
    98     abstractPlayerChanged(mediaObject->abstractPlayer());
       
    99 
       
   100     connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)),
       
   101             SLOT(stateChanged(Phonon::State, Phonon::State)));
       
   102 
       
   103     connect(mediaObject, SIGNAL(abstractPlayerChanged(AbstractPlayer *)),
       
   104             SLOT(abstractPlayerChanged(AbstractPlayer *)));
       
   105 
       
   106     if (mediaObject->state() != Phonon::LoadingState)
       
   107         createEffect();
       
   108 }
       
   109 
       
   110 void AbstractAudioEffect::disconnectMediaObject(MediaObject *mediaObject)
       
   111 {
       
   112     mediaObject->disconnect(this);
       
   113     abstractPlayerChanged(0);
       
   114 }
       
   115 
       
   116 void AbstractAudioEffect::setEnabled(bool enabled)
       
   117 {
       
   118     TInt err = KErrNone;
       
   119 
       
   120     if (enabled)
       
   121         // TODO: handle audio effect errors
       
   122         TRAP(err, m_effect->EnableL())
       
   123     else
       
   124         // TODO: handle audio effect errors
       
   125         TRAP(err, m_effect->DisableL())
       
   126 
       
   127     Q_UNUSED(err);
       
   128 }
       
   129 
       
   130 void AbstractAudioEffect::createEffect()
       
   131 {
       
   132     Q_ASSERT_X(m_player, Q_FUNC_INFO, "Invalid media player pointer");
       
   133 
       
   134     if (AudioPlayer *audioPlayer = qobject_cast<AudioPlayer *>(m_player)) {
       
   135         createEffect(audioPlayer->nativePlayer());
       
   136     }
       
   137 
       
   138     if (m_effect.data()) {
       
   139         EffectParameter param;
       
   140 	int err = 0;
       
   141         foreach (param, m_params) {
       
   142             const QVariant value = parameterValue(param);
       
   143             err = parameterChanged(param, value);
       
   144         }
       
   145 	Q_UNUSED(err)
       
   146     }
       
   147 }
       
   148 
       
   149 const MMF::EffectParameter& AbstractAudioEffect::internalParameter(int id) const
       
   150 {
       
   151     const EffectParameter *result = 0;
       
   152     for (int i=0; i<m_params.count() && !result; ++i) {
       
   153         if (m_params[i].id() == id)
       
   154             result = &m_params[i];
       
   155     }
       
   156     Q_ASSERT_X(result, Q_FUNC_INFO, "Parameter not found");
       
   157     return *result;
       
   158 }
       
   159 
       
   160 int AbstractAudioEffect::parameterChanged(const EffectParameter &param,
       
   161             const QVariant &value)
       
   162 {
       
   163     int err = 0;
       
   164 
       
   165     switch (param.id()) {
       
   166     case ParameterEnable:
       
   167         setEnabled(value.toBool());
       
   168         break;
       
   169     default:
       
   170         {
       
   171         const EffectParameter& internalParam = internalParameter(param.id());
       
   172         err = effectParameterChanged(internalParam, value);
       
   173         }
       
   174         break;
       
   175     }
       
   176 
       
   177     if (!err)
       
   178         TRAP(err, m_effect->ApplyL());
       
   179 
       
   180     return err;
       
   181 }
       
   182 
       
   183 int AbstractAudioEffect::effectParameterChanged(
       
   184     const EffectParameter &param, const QVariant &value)
       
   185 {
       
   186     // Default implementation
       
   187     Q_ASSERT_X(false, Q_FUNC_INFO, "Effect has no parameters");
       
   188     return 0;
       
   189 }
       
   190 
    80 
   191 
    81 QT_END_NAMESPACE
   192 QT_END_NAMESPACE
    82 
   193