diff --git a/phonon/experimental/CMakeLists.txt b/phonon/experimental/CMakeLists.txt index 207aafd1a2..811450fa9a 100644 --- a/phonon/experimental/CMakeLists.txt +++ b/phonon/experimental/CMakeLists.txt @@ -1,25 +1,33 @@ include_directories(${KDE4_KIO_INCLUDES}) add_subdirectory( tests ) ########### libphononexperimental ############### set(phononexperimental_LIB_SRCS audiodataoutput.cpp videodataoutput.cpp visualization.cpp + mediasource.cpp + backendcapabilities.cpp + factory.cpp + globalconfig.cpp ../abstractaudiooutput_p.cpp ../abstractvideooutput_p.cpp ) kde4_add_library(phononexperimental SHARED ${phononexperimental_LIB_SRCS}) target_link_libraries(phononexperimental ${KDE4_PHONON_LIBS}) #do not use GENERIC versioning in phonon set_target_properties(phononexperimental PROPERTIES VERSION 5.2.0 SOVERSION 5) install(TARGETS phononexperimental DESTINATION ${LIB_INSTALL_DIR}) ########### install headers ############### install(FILES export.h audiodataoutput.h videoframe.h videodataoutput.h visualization.h + mediasource.h + backendcapabilities.h + backendinterface.h + factory.h DESTINATION ${INCLUDE_INSTALL_DIR}/phonon/experimental) diff --git a/phonon/experimental/backendcapabilities.cpp b/phonon/experimental/backendcapabilities.cpp new file mode 100644 index 0000000000..831c7f2e46 --- /dev/null +++ b/phonon/experimental/backendcapabilities.cpp @@ -0,0 +1,39 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#include "backendcapabilities.h" +#include "globalconfig.h" + +namespace Phonon +{ +namespace Experimental +{ + +QList BackendCapabilities::availableVideoCaptureDevices() +{ + QList ret; + const QList deviceIndexes = GlobalConfig().videoCaptureDeviceListFor(Phonon::NoCategory); + foreach (int i, deviceIndexes) { + ret.append(VideoCaptureDevice::fromIndex(i)); + } + return ret; +} + +} // namespace Experimental +} // namespace Phonon diff --git a/phonon/experimental/backendcapabilities.h b/phonon/experimental/backendcapabilities.h new file mode 100644 index 0000000000..361c83a0b8 --- /dev/null +++ b/phonon/experimental/backendcapabilities.h @@ -0,0 +1,44 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef PHONON_EXPERIMENTAL_BACKENDCAPABILITIES_H +#define PHONON_EXPERIMENTAL_BACKENDCAPABILITIES_H + +#include "export.h" +#include "objectdescription.h" + +namespace Phonon +{ +namespace Experimental +{ +namespace BackendCapabilities +{ + + /** + * Returns the video capture devices the backend supports. + * + * \return A list of VideoCaptureDevice objects that give a name and + * description for every supported video capture device. + */ + PHONONEXPERIMENTAL_EXPORT QList availableVideoCaptureDevices(); + +} // namespace BackendCapabilities +} // namespace Experimental +} // namespace Phonon +#endif // PHONON_EXPERIMENTAL_BACKENDCAPABILITIES_H diff --git a/phonon/experimental/backendinterface.h b/phonon/experimental/backendinterface.h new file mode 100644 index 0000000000..7d1febffc3 --- /dev/null +++ b/phonon/experimental/backendinterface.h @@ -0,0 +1,36 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef PHONON_EXPERIMENTAL_BACKENDINTERFACE_H +#define PHONON_EXPERIMENTAL_BACKENDINTERFACE_H + +namespace Phonon +{ +namespace Experimental +{ +namespace BackendInterface +{ +enum Class { + VideoDataOutputClass = 0x10000 +}; +} // namespace BackendInterface +} // namespace Experimental +} // namespace Phonon + +#endif // PHONON_EXPERIMENTAL_BACKENDINTERFACE_H diff --git a/phonon/experimental/factory.cpp b/phonon/experimental/factory.cpp new file mode 100644 index 0000000000..57ade96b87 --- /dev/null +++ b/phonon/experimental/factory.cpp @@ -0,0 +1,94 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "factory.h" +#include "objectdescription.h" +#include "../factory.h" +#include "../globalstatic_p.h" +#include "../backendinterface.h" +#include "backendinterface.h" +#include + +namespace Phonon +{ +namespace Experimental +{ + +class FactoryPrivate : public Phonon::Experimental::Factory::Sender +{ + public: + FactoryPrivate(); + ~FactoryPrivate(); + //QPointer m_backendObject; + + private Q_SLOTS: + void objectDescriptionChanged(ObjectDescriptionType); +}; + +PHONON_GLOBAL_STATIC(Phonon::Experimental::FactoryPrivate, globalFactory) + +FactoryPrivate::FactoryPrivate() +{ + QObject *backendObj = Phonon::Factory::backend(); + Q_ASSERT(backendObj); + //QMetaObject::invokeMethod(backendObj, "experimentalBackend", Qt::DirectConnection, + //Q_RETURN_ARG(QObject *, m_backendObject)); + //if (!m_backendObject) { + //qDebug() << "The backend does not support Phonon::Experimental"; + //return; + //} + connect(backendObj, SIGNAL(objectDescriptionChanged(ObjectDescriptionType)), + SLOT(objectDescriptionChanged(ObjectDescriptionType))); +} + +FactoryPrivate::~FactoryPrivate() +{ +} + +void FactoryPrivate::objectDescriptionChanged(ObjectDescriptionType type) +{ + qDebug() << Q_FUNC_INFO << type; + switch (type) { + case VideoCaptureDeviceType: + emit availableVideoCaptureDevicesChanged(); + break; + default: + break; + } +} + +Factory::Sender *Factory::sender() +{ + return globalFactory; +} + +QObject *Factory::createVideoDataOutput(QObject *parent) +{ + Phonon::BackendInterface *b = qobject_cast(Phonon::Factory::backend()); + if (b) { + return Phonon::Factory::registerQObject(b->createObject( + static_cast(Phonon::Experimental::BackendInterface::VideoDataOutputClass), + parent)); + } + return 0; +} + +} // namespace Experimental +} // namespace Phonon diff --git a/phonon/experimental/factory.h b/phonon/experimental/factory.h new file mode 100644 index 0000000000..d07909dec6 --- /dev/null +++ b/phonon/experimental/factory.h @@ -0,0 +1,58 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef PHONON_EXPERIMENTAL_FACTORY_H +#define PHONON_EXPERIMENTAL_FACTORY_H + +#include +#include "export.h" + +namespace Phonon +{ +namespace Experimental +{ +namespace Factory +{ + /** + * Emits signals for Phonon::Experimental::Factory. + */ + class Sender : public QObject + { + Q_OBJECT + Q_SIGNALS: + /** + * \copydoc Phonon::Experimental::BackendCapabilities::Notifier::availableVideoCaptureDevicesChanged + */ + void availableVideoCaptureDevicesChanged(); + }; + + PHONONEXPERIMENTAL_EXPORT Sender *sender(); + + /** + * Create a new backend object for a VideoDataOutput. + * + * \return a pointer to the VideoDataOutput the backend provides. + */ + PHONONEXPERIMENTAL_EXPORT QObject *createVideoDataOutput(QObject *parent = 0); + +} // namespace Factory +} // namespace Experimental +} // namespace Phonon + +#endif // PHONON_EXPERIMENTAL_FACTORY_H diff --git a/phonon/experimental/globalconfig.cpp b/phonon/experimental/globalconfig.cpp new file mode 100644 index 0000000000..21e79b1ce4 --- /dev/null +++ b/phonon/experimental/globalconfig.cpp @@ -0,0 +1,118 @@ +/* This file is part of the KDE project + Copyright (C) 2006-2008 Matthias Kretz + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "globalconfig.h" + +#include "../factory.h" +#include "objectdescription.h" +#include "../phonondefs_p.h" +#include "../backendinterface.h" +#include "../qsettingsgroup_p.h" + +#include +#include + +namespace Phonon +{ +namespace Experimental +{ + +GlobalConfig::GlobalConfig(QObject *parent) + : QObject(parent) + , m_config(QLatin1String("kde.org"), QLatin1String("libphonon")) +{ +} + +GlobalConfig::~GlobalConfig() +{ +} + +static void filterAdvanced(BackendInterface *backendIface, QList *list) +{ + QMutableListIterator it(*list); + while (it.hasNext()) { + const QHash properties = backendIface->objectDescriptionProperties( + static_cast(Phonon::Experimental::VideoCaptureDeviceType), it.next()); + QVariant var = properties.value("isAdvanced"); + if (var.isValid() && var.toBool()) { + it.remove(); + } + } +} + +QList GlobalConfig::videoCaptureDeviceListFor(Phonon::Category category, HideAdvancedDevicesOverride override) const +{ + //The devices need to be stored independently for every backend + const QSettingsGroup backendConfig(&m_config, QLatin1String("VideoCaptureDevice")); // + Factory::identifier()); + const QSettingsGroup generalGroup(&m_config, QLatin1String("General")); + const bool hideAdvancedDevices = (override == FromSettings + ? generalGroup.value(QLatin1String("HideAdvancedDevices"), true) + : static_cast(override)); + + //First we lookup the available devices directly from the backend + BackendInterface *backendIface = qobject_cast(Phonon::Factory::backend()); + if (!backendIface) { + return QList(); + } + + // this list already is in default order (as defined by the backend) + QList defaultList = backendIface->objectDescriptionIndexes(static_cast(Phonon::Experimental::VideoCaptureDeviceType)); + if (hideAdvancedDevices) { + filterAdvanced(backendIface, &defaultList); + } + + QString categoryKey = QLatin1String("Category") + QString::number(static_cast(category)); + if (!backendConfig.hasKey(categoryKey)) { + // no list in config for the given category + QString categoryKey = QLatin1String("Category") + QString::number(static_cast(Phonon::NoCategory)); + if (!backendConfig.hasKey(categoryKey)) { + // no list in config for NoCategory + return defaultList; + } + } + + //Now the list from m_config + QList deviceList = backendConfig.value(categoryKey, QList()); + + //if there are devices in m_config that the backend doesn't report, remove them from the list + QMutableListIterator i(deviceList); + while (i.hasNext()) { + if (0 == defaultList.removeAll(i.next())) { + i.remove(); + } + } + + //if the backend reports more devices that are not in m_config append them to the list + deviceList += defaultList; + + return deviceList; +} + +int GlobalConfig::videoCaptureDeviceFor(Phonon::Category category) const +{ + QList ret = videoCaptureDeviceListFor(category); + if (ret.isEmpty()) + return -1; + return ret.first(); +} + +} // namespace Experimental +} // namespace Phonon + +#include "moc_globalconfig.cpp" diff --git a/phonon/experimental/globalconfig.h b/phonon/experimental/globalconfig.h new file mode 100644 index 0000000000..d6d7d86b9c --- /dev/null +++ b/phonon/experimental/globalconfig.h @@ -0,0 +1,64 @@ +/* This file is part of the KDE project +Copyright (C) 2006-2008 Matthias Kretz + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License version 2 as published by the Free Software Foundation. + +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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public License +along with this library; see the file COPYING.LIB. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. + +*/ + +#ifndef PHONON_EXPERIMENTAL_GLOBALCONFIG_H +#define PHONON_EXPERIMENTAL_GLOBALCONFIG_H + +#include +#include + +#include "phonon/phononnamespace.h" + +QT_BEGIN_HEADER +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace Experimental +{ + +class GlobalConfig : public QObject +{ + Q_OBJECT +public: + GlobalConfig(QObject *parent = 0); + ~GlobalConfig(); + + enum HideAdvancedDevicesOverride { + ShowAdvancedDevices = 0, + HideAdvancedDevices = 1, + FromSettings = 2 + }; + QList videoCaptureDeviceListFor(Phonon::Category category, HideAdvancedDevicesOverride override = FromSettings) const; + int videoCaptureDeviceFor(Phonon::Category category) const; + +Q_SIGNALS: + void videoCaptureDeviceConfigChanged(); + +private: + QSettings m_config; +}; + +} // namespace Experimental +} // namespace Phonon + +QT_END_NAMESPACE +QT_END_HEADER + +#endif // PHONON_EXPERIMENTAL_GLOBALCONFIG_H diff --git a/phonon/experimental/mediasource.cpp b/phonon/experimental/mediasource.cpp new file mode 100644 index 0000000000..c47e69005d --- /dev/null +++ b/phonon/experimental/mediasource.cpp @@ -0,0 +1,75 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#include "mediasource.h" +#include "mediasource_p.h" + +#define S_D(Class) Class##Private *d = reinterpret_cast(Phonon::MediaSource::d.data()) + +namespace Phonon +{ +namespace Experimental +{ + +MediaSource::MediaSource(const MediaSource &rhs) + : Phonon::MediaSource(rhs) +{ +} + +MediaSource &MediaSource::operator=(const MediaSource &rhs) +{ + d = rhs.d; + return *this; +} + +bool MediaSource::operator==(const MediaSource &rhs) const +{ + return d == rhs.d; +} + +VideoCaptureDevice MediaSource::videoCaptureDevice() const +{ + S_D(const MediaSource); + return d->videoCaptureDevice; +} + +MediaSource::MediaSource(const VideoCaptureDevice &videoDevice) + : Phonon::MediaSource(*new MediaSourcePrivate(VideoCaptureDeviceSource)) +{ + S_D(MediaSource); + d->videoCaptureDevice = videoDevice; +} + +MediaSource::MediaSource(const QList &mediaList) + : Phonon::MediaSource(*new MediaSourcePrivate(Link)) +{ + d->linkedSources = mediaList; + foreach (Phonon::MediaSource ms, mediaList) { + Q_ASSERT(static_cast(ms.type()) != Link); + } +} + +QList MediaSource::substreams() const +{ + return d->linkedSources; +} + +} // namespace Experimental +} // namespace Phonon diff --git a/phonon/experimental/mediasource.h b/phonon/experimental/mediasource.h new file mode 100644 index 0000000000..f49d9a21fd --- /dev/null +++ b/phonon/experimental/mediasource.h @@ -0,0 +1,71 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#ifndef PHONON_EXPERIMENTAL_MEDIASOURCE_H +#define PHONON_EXPERIMENTAL_MEDIASOURCE_H + +#include "../mediasource.h" +#include "export.h" +#include "objectdescription.h" + +namespace Phonon +{ +namespace Experimental +{ + +class PHONONEXPERIMENTAL_EXPORT MediaSource : public Phonon::MediaSource +{ + public: + enum Type { + Link = 0xffff, + VideoCaptureDeviceSource + }; + + /** + * Constructs a copy of \p rhs. + * + * This constructor is fast thanks to explicit sharing. + */ + MediaSource(const MediaSource &rhs); + + /** + * Assigns \p rhs to this MediaSource and returns a reference to this MediaSource. + * + * This operation is fast thanks to explicit sharing. + */ + MediaSource &operator=(const MediaSource &rhs); + + /** + * Returns \p true if this MediaSource is equal to \p rhs; otherwise returns \p false. + */ + bool operator==(const MediaSource &rhs) const; + + VideoCaptureDevice videoCaptureDevice() const; + + MediaSource(const VideoCaptureDevice &videoDevice); + MediaSource(const QList &mediaList); + + QList substreams() const; +}; + +} // namespace Experimental +} // namespace Phonon + +#endif // PHONON_EXPERIMENTAL_MEDIASOURCE_H diff --git a/phonon/experimental/mediasource_p.h b/phonon/experimental/mediasource_p.h new file mode 100644 index 0000000000..5dca8cefd2 --- /dev/null +++ b/phonon/experimental/mediasource_p.h @@ -0,0 +1,47 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ + +#ifndef PHONON_EXPERIMENTAL_MEDIASOURCE_P_H +#define PHONON_EXPERIMENTAL_MEDIASOURCE_P_H + +#include "mediasource.h" +#include "../mediasource_p.h" +#include "objectdescription.h" + +namespace Phonon +{ +namespace Experimental +{ + +class MediaSourcePrivate : public Phonon::MediaSourcePrivate +{ + public: + MediaSourcePrivate(MediaSource::Type t) + : Phonon::MediaSourcePrivate(static_cast(t)) + { + } + + VideoCaptureDevice videoCaptureDevice; +}; + +} // namespace Experimental +} // namespace Phonon + +#endif // PHONON_EXPERIMENTAL_MEDIASOURCE_P_H diff --git a/phonon/experimental/objectdescription.h b/phonon/experimental/objectdescription.h new file mode 100644 index 0000000000..9cfd0fa0b1 --- /dev/null +++ b/phonon/experimental/objectdescription.h @@ -0,0 +1,40 @@ +/* This file is part of the KDE project + Copyright (C) 2008 Matthias Kretz + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) version 3. + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + +*/ +#ifndef PHONON_EXPERIMENTAL_OBJECTDESCRIPTION_H +#define PHONON_EXPERIMENTAL_OBJECTDESCRIPTION_H + +#include "../objectdescription.h" + +namespace Phonon +{ +namespace Experimental +{ + +enum ObjectDescriptionType +{ + VideoCaptureDeviceType = 0x10000 +}; + +typedef Phonon::ObjectDescription(Phonon::Experimental::VideoCaptureDeviceType)> VideoCaptureDevice; + +} // namespace Experimental +} // namespace Phonon + +#endif // PHONON_EXPERIMENTAL_OBJECTDESCRIPTION_H