src/3rdparty/phonon/ds9/effect.cpp
changeset 0 1918ee327afb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/3rdparty/phonon/ds9/effect.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,152 @@
+/*  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 "effect.h"
+#include <phonon/effectparameter.h>
+
+#include <medparam.h>
+#include <dmo.h>
+#include <dmodshow.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_PHONON_EFFECT
+
+namespace Phonon
+{
+    namespace DS9
+    {
+        Effect::Effect(CLSID effectClass, QObject *parent)
+            : BackendNode(parent)
+        {
+            //creation of the filter
+            for(int i = 0; i < FILTER_COUNT; ++i) {
+                Filter &filter = m_filters[i];
+                filter = Filter(CLSID_DMOWrapperFilter, IID_IBaseFilter);
+                Q_ASSERT(filter);
+                ComPointer<IDMOWrapperFilter> wrapper(filter, IID_IDMOWrapperFilter);
+                Q_ASSERT(wrapper);
+                wrapper->Init(effectClass, DMOCATEGORY_AUDIO_EFFECT);
+            }
+        }
+
+        Effect::Effect(QObject *parent) : BackendNode(parent)
+        {
+            //at this point the QVector of Filter should be filled
+        }
+
+        Effect::~Effect()
+        {
+        }
+
+        QList<Phonon::EffectParameter> Effect::parameters() const
+        {
+            QList<Phonon::EffectParameter> ret;
+            ComPointer<IMediaParamInfo> paramInfo(m_filters[0], IID_IMediaParamInfo);
+            if (!paramInfo) {
+                return ret;
+            }
+            DWORD paramCount = 0;
+            paramInfo->GetParamCount( &paramCount);
+
+            for(quint32 i = 0; i < paramCount; i++) {
+                MP_PARAMINFO info;
+                HRESULT hr = paramInfo->GetParamInfo(i, &info);
+                Q_ASSERT(SUCCEEDED(hr));
+                WCHAR *name = 0;
+                hr = paramInfo->GetParamText(i, &name);
+                Q_ASSERT(SUCCEEDED(hr));
+                QVariant def, min, max;
+
+                QVariantList values;
+
+                switch(info.mpType)
+                {
+                case MPT_ENUM:
+                    {
+                        WCHAR *current = name;
+                        current += wcslen(current) + 1; //skip the name
+                        current += wcslen(current) + 1; //skip the unit
+                        for(; *current; current += wcslen(current) + 1) {
+                            values.append( QString::fromWCharArray(current) );
+                        }
+                    }
+                    //FALLTHROUGH
+                case MPT_INT:
+                    def = int(info.mpdNeutralValue);
+                    min = int(info.mpdMinValue);
+                    max = int(info.mpdMaxValue);
+                    break;
+                case MPT_FLOAT:
+                    def = info.mpdNeutralValue;
+                    min = info.mpdMinValue;
+                    max = info.mpdMaxValue;
+                    break;
+                case MPT_BOOL:
+                    def = bool(info.mpdNeutralValue);
+                    break;
+                case MPT_MAX:
+                    //Reserved ms-help://MS.PSDKSVR2003R2.1033/directshow/htm/mp_typeenumeration.htm
+                    break;
+                }
+
+                Phonon::EffectParameter::Hints hint = info.mopCaps == MP_CAPS_CURVE_INVSQUARE ?
+                    Phonon::EffectParameter::LogarithmicHint : Phonon::EffectParameter::Hints(0);
+
+                const QString n = QString::fromWCharArray(name);
+                ret.append(Phonon::EffectParameter(i, n, hint, def, min, max, values));
+                ::CoTaskMemFree(name); //let's free the memory
+            }
+            return ret;
+        }
+
+        QVariant Effect::parameterValue(const Phonon::EffectParameter &p) const
+        {
+            QVariant ret;
+            ComPointer<IMediaParams> params(m_filters[0], IID_IMediaParams);
+            Q_ASSERT(params);
+            MP_DATA data;
+            HRESULT hr = params->GetParam(p.id(), &data);
+            if(SUCCEEDED(hr))
+                return data;
+            else
+                return QVariant();
+        }
+
+        void Effect::setParameterValue(const Phonon::EffectParameter &p, const QVariant &v)
+        {
+            if (v.isNull()) {
+                return;
+            }
+
+            for(int i=0; i < FILTER_COUNT ; ++i) {
+                const Filter &filter = m_filters[i];
+                ComPointer<IMediaParams> params(filter, IID_IMediaParams);
+                Q_ASSERT(params);
+
+                params->SetParam(p.id(), v.toFloat());
+            }
+        }
+
+    }
+}
+
+#endif //QT_NO_PHONON_EFFECT
+
+QT_END_NAMESPACE
+
+#include "moc_effect.cpp"