Ignore:
Timestamp:
Mar 8, 2010, 12:52:58 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.2 sources.

Location:
trunk
Files:
18 edited
8 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/3rdparty/phonon/mmf/abstractaudioeffect.cpp

    r561 r651  
    3838AbstractAudioEffect::AbstractAudioEffect(QObject *parent,
    3939                                         const QList<EffectParameter> &params)
    40     :   MediaNode::MediaNode(parent)
     40    :   MediaNode(parent)
     41    ,   m_params(params)
    4142    ,   m_player(0)
    42     ,   m_params(params)
    4343{
     44
    4445}
    4546
    46 QList<EffectParameter> AbstractAudioEffect::parameters() const
     47QList<Phonon::EffectParameter> AbstractAudioEffect::parameters() const
    4748{
    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;
    4955}
    5056
    51 QVariant AbstractAudioEffect::parameterValue(const EffectParameter &queriedParam) const
     57QVariant AbstractAudioEffect::parameterValue(const Phonon::EffectParameter &queriedParam) const
    5258{
    5359    const QVariant &val = m_values.value(queriedParam.id());
     
    5965}
    6066
    61 void AbstractAudioEffect::setParameterValue(const EffectParameter &param,
     67void AbstractAudioEffect::setParameterValue(const Phonon::EffectParameter &param,
    6268                                            const QVariant &newValue)
    6369{
    6470    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
     80void AbstractAudioEffect::abstractPlayerChanged(AbstractPlayer *player)
     81{
     82    m_player = qobject_cast<AbstractMediaPlayer *>(player);
     83    m_effect.reset();
     84}
     85
     86void AbstractAudioEffect::stateChanged(Phonon::State newState,
     87                                       Phonon::State oldState)
     88{
     89    if (Phonon::LoadingState == oldState
     90        && Phonon::LoadingState != newState)
     91        createEffect();
    6892}
    6993
     
    7397    Q_ASSERT_X(!m_effect.data(), Q_FUNC_INFO, "Effect already created");
    7498
    75     AbstractMediaPlayer *const player =
    76         qobject_cast<AbstractMediaPlayer *>(mediaObject->abstractPlayer());
     99    abstractPlayerChanged(mediaObject->abstractPlayer());
    77100
    78     if (player) {
    79         m_player = player;
     101    connect(mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)),
     102            SLOT(stateChanged(Phonon::State, Phonon::State)));
    80103
    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
     111void AbstractAudioEffect::disconnectMediaObject(MediaObject *mediaObject)
     112{
     113    mediaObject->disconnect(this);
     114    abstractPlayerChanged(0);
     115}
     116
     117void 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
     131void 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);
    86145        }
     146        Q_UNUSED(err)
    87147    }
    88148}
    89149
    90 void AbstractAudioEffect::disconnectMediaObject(MediaObject * /*mediaObject*/)
     150const MMF::EffectParameter& AbstractAudioEffect::internalParameter(int id) const
    91151{
    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;
    94159}
     160
     161int AbstractAudioEffect::parameterChanged(const EffectParameter &param,
     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
     184int AbstractAudioEffect::effectParameterChanged(
     185    const EffectParameter &param, const QVariant &value)
     186{
     187    // Default implementation
     188    Q_ASSERT_X(false, Q_FUNC_INFO, "Effect has no parameters");
     189    return 0;
     190}
     191
    95192
    96193QT_END_NAMESPACE
  • trunk/src/3rdparty/phonon/mmf/abstractaudioeffect.h

    r561 r651  
    2424#include <AudioEffectBase.h>
    2525
    26 #include <Phonon/effectinterface.h>
    27 #include <Phonon/effectparameter.h>
     26#include <phonon/effectinterface.h>
    2827
    2928#include "audioplayer.h"
     29#include "effectparameter.h"
    3030#include "mmf_medianode.h"
    3131#include "mmf_videoplayer.h"
     32
     33class CMdaAudioOutputStream;
    3234
    3335QT_BEGIN_NAMESPACE
     
    3739namespace MMF
    3840{
     41class AbstractPlayer;
    3942class AbstractMediaPlayer;
    4043
     
    6467                        const QList<EffectParameter> &params);
    6568
    66     virtual QList<EffectParameter> parameters() const;
    67     virtual QVariant parameterValue(const EffectParameter &param) const;
    68     virtual void setParameterValue(const EffectParameter &,
     69    // Phonon::EffectInterface
     70    virtual QList<Phonon::EffectParameter> parameters() const;
     71    virtual QVariant parameterValue(const Phonon::EffectParameter &param) const;
     72    virtual void setParameterValue(const Phonon::EffectParameter &,
    6973                                   const QVariant &newValue);
    7074
    71     enum Type
     75    // Parameters which are shared by all effects
     76    enum CommonParameters
    7277    {
    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
    8180    };
     81
     82public Q_SLOTS:
     83    void abstractPlayerChanged(AbstractPlayer *player);
     84    void stateChanged(Phonon::State newState,
     85                      Phonon::State oldState);
    8286
    8387protected:
     
    8690    void disconnectMediaObject(MediaObject *mediaObject);
    8791
    88     virtual void connectAudioPlayer(AudioPlayer::NativePlayer *player) = 0;
    89     virtual void applyParameters() = 0;
     92    virtual void createEffect(AudioPlayer::NativePlayer *player) = 0;
    9093
    91     virtual void parameterChanged(const int id,
    92                                   const QVariant &value) = 0;
     94    // Effect-specific parameter changed
     95    virtual int effectParameterChanged(const EffectParameter &param,
     96                                  const QVariant &value);
     97
     98private:
     99    void createEffect();
     100    void setEnabled(bool enabled);
     101    const EffectParameter& internalParameter(int id) const;
     102    int parameterChanged(const EffectParameter &param,
     103            const QVariant &value);
    93104
    94105protected:
     
    96107
    97108private:
     109    const QList<EffectParameter>    m_params;
    98110    AbstractMediaPlayer *           m_player;
    99     const QList<EffectParameter>    m_params;
    100111    QHash<int, QVariant>            m_values;
    101112};
     
    104115}
    105116
     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                                                                        \
     124void 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                                                                        \
     131C##Effect* Effect::concreteEffect()                                     \
     132{                                                                       \
     133    return static_cast<C##Effect *>(m_effect.data());                   \
     134}
     135
    106136QT_END_NAMESPACE
    107137
  • trunk/src/3rdparty/phonon/mmf/abstractplayer.h

    r561 r651  
    2020#define PHONON_MMF_ABSTRACTPLAYER_H
    2121
    22 #include <Phonon/phononnamespace.h>
    23 #include <Phonon/mediasource.h>
     22#include <phonon/phononnamespace.h>
     23#include <phonon/mediasource.h>
    2424
    2525#include <QObject>
     
    107107    void tick(qint64 time);
    108108    void bufferStatus(int percentFilled);
    109     void stateChanged(Phonon::State oldState,
    110                       Phonon::State newState);
     109    void stateChanged(Phonon::State newState,
     110                      Phonon::State oldState);
    111111    void metaDataChanged(const QMultiMap<QString, QString>& metaData);
    112112    void aboutToFinish();
  • trunk/src/3rdparty/phonon/mmf/audioequalizer.cpp

    r561 r651  
    2929*/
    3030
    31 AudioEqualizer::AudioEqualizer(QObject *parent) : AbstractAudioEffect::AbstractAudioEffect(parent, createParams())
     31// Define functions which depend on concrete native effect class name
     32PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(AudioEqualizer)
     33
     34AudioEqualizer::AudioEqualizer(QObject *parent, const QList<EffectParameter>& parameters)
     35    :   AbstractAudioEffect::AbstractAudioEffect(parent, parameters)
    3236{
     37
    3338}
    3439
    35 void AudioEqualizer::parameterChanged(const int pid,
     40int AudioEqualizer::effectParameterChanged(const EffectParameter &param,
    3641                                      const QVariant &value)
    3742{
    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;
    4350}
    4451
    45 void AudioEqualizer::connectAudioPlayer(AudioPlayer::NativePlayer *player)
     52
     53//-----------------------------------------------------------------------------
     54// Static functions
     55//-----------------------------------------------------------------------------
     56
     57const char* AudioEqualizer::description()
    4658{
    47     CAudioEqualizer *ptr = 0;
    48     QT_TRAP_THROWING(ptr = CAudioEqualizer::NewL(*player));
    49     m_effect.reset(ptr);
     59    return "Audio equalizer";
    5060}
    5161
    52 void AudioEqualizer::applyParameters()
     62bool AudioEqualizer::getParameters(CMdaAudioOutputStream *stream,
     63    QList<EffectParameter>& parameters)
    5364{
    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);
    60100        }
    61101    }
    62 }
    63102
    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;
    105104}
    106105
  • trunk/src/3rdparty/phonon/mmf/audioequalizer.h

    r561 r651  
    2222#include "abstractaudioeffect.h"
    2323
     24class CAudioEqualizer;
     25
    2426QT_BEGIN_NAMESPACE
    2527
     
    4042    Q_OBJECT
    4143public:
    42     AudioEqualizer(QObject *parent);
     44    AudioEqualizer(QObject *parent, const QList<EffectParameter> &parameters);
     45
     46    // Static interface required by EffectFactory
     47    static const char* description();
     48    static bool getParameters(CMdaAudioOutputStream *stream,
     49        QList<EffectParameter>& parameters);
    4350
    4451protected:
    4552    // AbstractAudioEffect
    46     virtual void connectAudioPlayer(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 &param,
     55                                      const QVariant &value);
    4956
    5057private:
    51     void setBandLevel(int band, int level);
    52 
    53 private:
    54     static QList<EffectParameter> createParams();
     58    CAudioEqualizer *concreteEffect();
    5559
    5660};
  • trunk/src/3rdparty/phonon/mmf/backend.cpp

    r561 r651  
    4646    : QObject(parent)
    4747    , m_ancestorMoveMonitor(new AncestorMoveMonitor(this))
     48    , m_effectFactory(new EffectFactory(this))
    4849{
    4950    TRACE_CONTEXT(Backend::Backend, EBackend);
     
    8283        Q_ASSERT(args.count() == 1);
    8384        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);
    8788    }
    8889    case VideoWidgetClass:
     
    106107    {
    107108        case EffectType:
    108             retval.append(EffectFactory::effectIndexes());
     109            retval.append(m_effectFactory->effectIndexes());
    109110            break;
    110111        case AudioOutputDeviceType:
     
    127128    switch (type) {
    128129        case EffectType:
    129             return EffectFactory::audioEffectDescriptions(AbstractAudioEffect::Type(index));
     130            return m_effectFactory->audioEffectDescriptions(EffectFactory::Type(index));
    130131        case AudioOutputDeviceType:
    131132            return AudioOutput::audioOutputDescription(index);
  • trunk/src/3rdparty/phonon/mmf/backend.h

    r561 r651  
    2121
    2222#include "ancestormovemonitor.h"
     23#include "effectfactory.h"
    2324
    24 #include <Phonon/mediasource.h>
    25 #include <Phonon/backendinterface.h>
     25#include <phonon/mediasource.h>
     26#include <phonon/backendinterface.h>
    2627#include <QScopedPointer>
    2728
     
    5455private:
    5556    QScopedPointer<AncestorMoveMonitor> m_ancestorMoveMonitor;
     57    QScopedPointer<EffectFactory>       m_effectFactory;
    5658
    5759};
  • trunk/src/3rdparty/phonon/mmf/bassboost.cpp

    r561 r651  
    2525using namespace Phonon::MMF;
    2626
     27// Define functions which depend on concrete native effect class name
     28PHONON_MMF_DEFINE_EFFECT_FUNCTIONS(BassBoost)
     29
    2730/*! \class MMF::BassBoost
    2831  \internal
    2932*/
    3033
    31 BassBoost::BassBoost(QObject *parent) : AbstractAudioEffect::AbstractAudioEffect(parent,
    32                                                                                 QList<EffectParameter>())
     34BassBoost::BassBoost(QObject *parent, const QList<EffectParameter> &parameters)
     35    :   AbstractAudioEffect::AbstractAudioEffect(parent, parameters)
    3336{
     37
    3438}
    3539
    36 void BassBoost::parameterChanged(const int,
    37                                  const QVariant &)
     40//-----------------------------------------------------------------------------
     41// Static functions
     42//-----------------------------------------------------------------------------
     43
     44const char* BassBoost::description()
    3845{
    39     Q_ASSERT_X(false, Q_FUNC_INFO, "BassBoost has not parameters");
     46    return "Bass boost";
    4047}
    4148
    42 void BassBoost::connectAudioPlayer(AudioPlayer::NativePlayer *player)
     49bool BassBoost::getParameters(CMdaAudioOutputStream *stream,
     50    QList<EffectParameter> &parameters)
    4351{
    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);
    5255}
    5356
  • trunk/src/3rdparty/phonon/mmf/bassboost.h

    r561 r651  
    2222#include "abstractaudioeffect.h"
    2323
     24class CBassBoost;
     25
    2426QT_BEGIN_NAMESPACE
    2527
     
    2931{
    3032/**
    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.
    3534 */
    3635class BassBoost : public AbstractAudioEffect
     
    3837    Q_OBJECT
    3938public:
    40     BassBoost(QObject *parent);
     39    BassBoost(QObject *parent, const QList<EffectParameter> &parameters);
     40
     41    // Static interface required by EffectFactory
     42    static const char* description();
     43    static bool getParameters(CMdaAudioOutputStream *stream,
     44        QList<EffectParameter>& parameters);
    4145
    4246protected:
    4347    // 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
     50private:
     51    CBassBoost *concreteEffect();
    4752
    4853};
  • trunk/src/3rdparty/phonon/mmf/effectfactory.cpp

    r561 r651  
    2020#include <QCoreApplication>
    2121
    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>
    3223
    3324#include "audioequalizer.h"
    3425#include "bassboost.h"
     26#include "environmentalreverb.h"
     27#include "loudness.h"
     28#include "stereowidening.h"
    3529
    3630#include "effectfactory.h"
     
    4539*/
    4640
    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 {
     41EffectFactory::EffectFactory(QObject *parent)
     42    :   QObject(parent)
     43    ,   m_initialized(false)
     44{
     45
     46}
     47
     48EffectFactory::~EffectFactory()
     49{
     50
     51}
     52
     53//-----------------------------------------------------------------------------
     54// Public functions
     55//-----------------------------------------------------------------------------
     56
     57AbstractAudioEffect *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
    6270    switch (type)
    6371    {
    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
     100QHash<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
     109QList<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
     135void 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.
     154class OutputStreamFactory : public MMdaAudioOutputStreamCallback
     155{
     156public:
     157    CMdaAudioOutputStream* create()
    92158    {
    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    }
     163private:
     164    void MaoscOpenComplete(TInt /*aError*/) { }
     165    void MaoscBufferCopied(TInt /*aError*/, const TDesC8& /*aBuffer*/) { }
     166    void MaoscPlayComplete(TInt /*aError*/) { }
     167};
     168
     169template<typename BackendNode>
     170EffectFactory::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
     206const 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();
    152211}
    153212
  • trunk/src/3rdparty/phonon/mmf/effectfactory.h

    r561 r651  
    2121
    2222#include "abstractaudioeffect.h"
     23#include "effectparameter.h"
    2324
    2425QT_BEGIN_NAMESPACE
     
    3233 * @short Contains utility functions related to effects.
    3334 */
    34 class EffectFactory
     35class EffectFactory : public QObject
    3536{
     37    Q_OBJECT
     38
    3639public:
     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
    3755    /**
    3856     * @short Creates an audio effect of type @p type.
    3957     */
    40     static AbstractAudioEffect *createAudioEffect(AbstractAudioEffect::Type type,
    41                                                   QObject *parent);
     58    AbstractAudioEffect *createAudioEffect(Type type, QObject *parent);
    4259
    4360    /**
     
    4764     * BackendInterface::objectDescriptionProperties().
    4865     */
    49     static QHash<QByteArray, QVariant> audioEffectDescriptions(AbstractAudioEffect::Type type);
     66    QHash<QByteArray, QVariant> audioEffectDescriptions(Type type);
    5067
    5168    /**
     
    5572     * BackendInterface::objectDescriptionIndexes().
    5673     */
    57     static QList<int> effectIndexes();
     74    QList<int> effectIndexes();
    5875
    5976private:
    60     static inline QHash<QByteArray, QVariant> constructEffectDescription(const QString &name,
    61                                                                          const QString &description);
     77    void initialize();
    6278
    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
     89private:
     90    bool                                m_initialized;
     91    QHash<Type, EffectData>             m_effectData;
     92
    6993};
     94
    7095}
    7196}
  • trunk/src/3rdparty/phonon/mmf/mediaobject.cpp

    r561 r651  
    298298    }
    299299
     300    if (oldPlayer)
     301        emit abstractPlayerChanged(0);
    300302    m_player.reset(newPlayer);
     303    emit abstractPlayerChanged(newPlayer);
    301304
    302305    if (oldPlayerHasVideo != hasVideo()) {
  • trunk/src/3rdparty/phonon/mmf/mediaobject.h

    r561 r651  
    2020#define PHONON_MMF_MEDIAOBJECT_H
    2121
    22 #include <Phonon/mediasource.h>
    23 #include <Phonon/mediaobjectinterface.h>
     22#include <phonon/mediasource.h>
     23#include <phonon/mediaobjectinterface.h>
    2424#include <QScopedPointer>
    2525#include <QTimer>
     
    9393
    9494Q_SIGNALS:
     95    void abstractPlayerChanged(AbstractPlayer *player);
    9596    void totalTimeChanged(qint64 length);
    9697    void hasVideoChanged(bool hasVideo);
     
    102103    void metaDataChanged(const QMultiMap<QString, QString>& metaData);
    103104    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);
    106107    void finished();
    107108    void tick(qint64 time);
  • trunk/src/3rdparty/phonon/mmf/mmf_medianode.h

    r561 r651  
    2121
    2222#include <QObject>
    23 #include <Phonon/effectinterface.h>
     23#include <phonon/effectinterface.h>
    2424#include "audioplayer.h"
    2525
  • trunk/src/3rdparty/phonon/mmf/utils.h

    r561 r651  
    4545class Utils
    4646{
    47     Q_DECLARE_TR_FUNCTIONS(Utils)
     47    Q_DECLARE_TR_FUNCTIONS(Phonon::MMF)
    4848
    4949public:
  • trunk/src/3rdparty/phonon/mmf/videooutput.h

    r561 r651  
    2525#include "defs.h"
    2626
    27 #include <Phonon/videowidget.h>
     27#include <phonon/videowidget.h>
    2828
    2929#include <e32std.h>
  • trunk/src/3rdparty/phonon/mmf/videowidget.h

    r561 r651  
    2424
    2525#include <QtGui/QWidget>
    26 #include <Phonon/videowidget.h>
    27 #include <Phonon/videowidgetinterface.h>
     26#include <phonon/videowidget.h>
     27#include <phonon/videowidgetinterface.h>
    2828
    2929QT_BEGIN_NAMESPACE
Note: See TracChangeset for help on using the changeset viewer.