From edc76ed07104d5eb54c83abd845178bc9b1cfb1d Mon Sep 17 00:00:00 2001 From: Robin Burchell Date: Sat, 3 Aug 2013 00:37:43 +0200 Subject: [PATCH 1/3] Change libresourceqt's .pc file. The one public port of this library to Qt 5 changed the .pc to libresourceqt5, to avoid clashing with the Qt 4 version. Change-Id: I6a248606e20c4e7a8f432612ca00aded846264d9 Reviewed-by: Andy Nichols --- config.tests/resourcepolicy/resourcepolicy.pro | 2 +- src/gsttools/gsttools.pro | 2 +- src/plugins/gstreamer/common.pri | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config.tests/resourcepolicy/resourcepolicy.pro b/config.tests/resourcepolicy/resourcepolicy.pro index 9dddaa96..7627d480 100644 --- a/config.tests/resourcepolicy/resourcepolicy.pro +++ b/config.tests/resourcepolicy/resourcepolicy.pro @@ -3,5 +3,5 @@ SOURCES += main.cpp CONFIG += link_pkgconfig PKGCONFIG += \ - libresourceqt1 + libresourceqt5 diff --git a/src/gsttools/gsttools.pro b/src/gsttools/gsttools.pro index 9d1f7c8f..d3025797 100644 --- a/src/gsttools/gsttools.pro +++ b/src/gsttools/gsttools.pro @@ -26,7 +26,7 @@ maemo*:PKGCONFIG +=gstreamer-plugins-bad-0.10 config_resourcepolicy { DEFINES += HAVE_RESOURCE_POLICY - PKGCONFIG += libresourceqt1 + PKGCONFIG += libresourceqt5 } # Header files must go inside source directory of a module diff --git a/src/plugins/gstreamer/common.pri b/src/plugins/gstreamer/common.pri index 91086576..4349a8ae 100644 --- a/src/plugins/gstreamer/common.pri +++ b/src/plugins/gstreamer/common.pri @@ -23,7 +23,7 @@ maemo*:PKGCONFIG +=gstreamer-plugins-bad-0.10 config_resourcepolicy { DEFINES += HAVE_RESOURCE_POLICY - PKGCONFIG += libresourceqt1 + PKGCONFIG += libresourceqt5 } config_xvideo:qtHaveModule(widgets) { From f01af490a0be13219deb0499c210ceee700332ba Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 24 Jul 2013 13:01:08 +0200 Subject: [PATCH 2/3] Fixed bug in QWaveDecoder. When looking for a specific chunk, it was entering an infinite loop if not finding it in the next two chunks available. It now correctly tries to find the chunk until it reaches the end of the IO device. Change-Id: I29252318566fe3a47f267410c91dacaf302d9618 Reviewed-by: Andy Nichols --- src/multimedia/audio/qwavedecoder_p.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/multimedia/audio/qwavedecoder_p.cpp b/src/multimedia/audio/qwavedecoder_p.cpp index b75bfaf8..497a146d 100644 --- a/src/multimedia/audio/qwavedecoder_p.cpp +++ b/src/multimedia/audio/qwavedecoder_p.cpp @@ -244,16 +244,18 @@ bool QWaveDecoder::enoughDataAvailable() bool QWaveDecoder::findChunk(const char *chunkId) { chunk descriptor; - if (!peekChunk(&descriptor)) - return false; - if (qstrncmp(descriptor.id, chunkId, 4) == 0) - return true; + do { + if (!peekChunk(&descriptor)) + return false; + + if (qstrncmp(descriptor.id, chunkId, 4) == 0) + return true; + + // It's possible that bytes->available() is less than the chunk size + // if it's corrupt. + junkToSkip = qint64(sizeof(chunk) + descriptor.size); - // It's possible that bytes->available() is less than the chunk size - // if it's corrupt. - junkToSkip = qint64(sizeof(chunk) + descriptor.size); - while (source->bytesAvailable() > 0) { // Skip the current amount if (junkToSkip > 0) discardBytes(junkToSkip); @@ -263,12 +265,7 @@ bool QWaveDecoder::findChunk(const char *chunkId) if (junkToSkip > 0) return false; - if (!peekChunk(&descriptor)) - return false; - - if (qstrncmp(descriptor.id, chunkId, 4) == 0) - return true; - } + } while (source->bytesAvailable() > 0); return false; } From 9f484eae83fd81e12aa4f07398ad13f9d453ba92 Mon Sep 17 00:00:00 2001 From: Robin Burchell Date: Sat, 3 Aug 2013 00:27:40 +0200 Subject: [PATCH 3/3] Implement resource policy plugin using libresourceqt. This contains a new resource policy plugin, replacing the built-in code that was deleted when the plugin interface was removed in 138242fb2dc19438a0ead34b36af848800e27190 (which unfortunately did not provide a plugin). Change-Id: Iae7ed6edc330c69ca0c72d50bde6c7e12b8cca4e Reviewed-by: Andy Nichols --- src/plugins/plugins.pro | 4 + .../resourcepolicy/resourcepolicy.json | 4 + src/plugins/resourcepolicy/resourcepolicy.pro | 21 +++ .../resourcepolicy/resourcepolicyimpl.cpp | 137 ++++++++++++++++++ .../resourcepolicy/resourcepolicyimpl.h | 84 +++++++++++ .../resourcepolicy/resourcepolicyplugin.cpp | 64 ++++++++ .../resourcepolicy/resourcepolicyplugin.h | 61 ++++++++ 7 files changed, 375 insertions(+) create mode 100644 src/plugins/resourcepolicy/resourcepolicy.json create mode 100644 src/plugins/resourcepolicy/resourcepolicy.pro create mode 100644 src/plugins/resourcepolicy/resourcepolicyimpl.cpp create mode 100644 src/plugins/resourcepolicy/resourcepolicyimpl.h create mode 100644 src/plugins/resourcepolicy/resourcepolicyplugin.cpp create mode 100644 src/plugins/resourcepolicy/resourcepolicyplugin.h diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 8f751ae3..8234e7ee 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -53,3 +53,7 @@ mac:!simulator { } } +config_resourcepolicy { + SUBDIRS += resourcepolicy +} + diff --git a/src/plugins/resourcepolicy/resourcepolicy.json b/src/plugins/resourcepolicy/resourcepolicy.json new file mode 100644 index 00000000..d751b849 --- /dev/null +++ b/src/plugins/resourcepolicy/resourcepolicy.json @@ -0,0 +1,4 @@ +{ + "Keys": ["resourcepolicy"], + "Services": ["org.qt-project.qt.mediaplayerresourcesetfactory", "default"] +} diff --git a/src/plugins/resourcepolicy/resourcepolicy.pro b/src/plugins/resourcepolicy/resourcepolicy.pro new file mode 100644 index 00000000..7aa1ced9 --- /dev/null +++ b/src/plugins/resourcepolicy/resourcepolicy.pro @@ -0,0 +1,21 @@ +TARGET = resourceqt + +QT += multimedia-private +CONFIG += no_private_qt_headers_warning link_pkgconfig +PKGCONFIG += libresourceqt5 + +PLUGIN_TYPE = resourcepolicy +PLUGIN_CLASS_NAME = ResourceQtPolicyPlugin +load(qt_plugin) + +INCLUDEPATH += $$PWD \ + $${SOURCE_DIR}/src/multimedia + +HEADERS += \ + $$PWD/resourcepolicyplugin.h \ + $$PWD/resourcepolicyimpl.h + +SOURCES += \ + $$PWD/resourcepolicyplugin.cpp \ + $$PWD/resourcepolicyimpl.cpp + diff --git a/src/plugins/resourcepolicy/resourcepolicyimpl.cpp b/src/plugins/resourcepolicy/resourcepolicyimpl.cpp new file mode 100644 index 00000000..26f71356 --- /dev/null +++ b/src/plugins/resourcepolicy/resourcepolicyimpl.cpp @@ -0,0 +1,137 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd, author: +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +#include "resourcepolicyimpl.h" + +ResourcePolicyImpl::ResourcePolicyImpl(QObject *parent) + : QMediaPlayerResourceSetInterface(parent) +{ + m_resourceSet = new ResourcePolicy::ResourceSet("player", this); + m_resourceSet->setAlwaysReply(); + + ResourcePolicy::AudioResource *audioResource = new ResourcePolicy::AudioResource("player"); + audioResource->setProcessID(QCoreApplication::applicationPid()); + audioResource->setStreamTag("media.name", "*"); + m_resourceSet->addResourceObject(audioResource); + + m_resourceSet->addResource(ResourcePolicy::VideoPlaybackType); + m_resourceSet->update(); + + connect(m_resourceSet, SIGNAL(resourcesGranted(const QList)), + this, SLOT(handleResourcesGranted())); + connect(m_resourceSet, SIGNAL(resourcesDenied()), + this, SLOT(handleResourcesDenied())); + connect(m_resourceSet, SIGNAL(lostResources()), + this, SLOT(handleResourcesLost())); + connect(m_resourceSet, SIGNAL(resourcesReleasedByManager()), + this, SLOT(handleResourcesLost())); +} + +bool ResourcePolicyImpl::isVideoEnabled() const +{ + return m_videoEnabled; +} + +void ResourcePolicyImpl::setVideoEnabled(bool videoEnabled) +{ + if (m_videoEnabled != videoEnabled) { + m_videoEnabled = videoEnabled; + + if (videoEnabled) + m_resourceSet->addResource(ResourcePolicy::VideoPlaybackType); + else + m_resourceSet->deleteResource(ResourcePolicy::VideoPlaybackType); + + m_resourceSet->update(); + } +} + +void ResourcePolicyImpl::acquire() +{ + m_status = RequestedResource; + m_resourceSet->acquire(); +} + +void ResourcePolicyImpl::release() +{ + m_resourceSet->release(); + m_status = Initial; +} + +bool ResourcePolicyImpl::isGranted() const +{ + return m_status == GrantedResource; +} + +bool ResourcePolicyImpl::isAvailable() const +{ + // TODO: is this used? what is it for? + qWarning() << Q_FUNC_INFO << "Stub"; + return true; +} + +void ResourcePolicyImpl::handleResourcesGranted() +{ + m_status = GrantedResource; + emit resourcesGranted(); +} + +void ResourcePolicyImpl::handleResourcesDenied() +{ + m_status = Initial; + emit resourcesDenied(); +} + +void ResourcePolicyImpl::handleResourcesLost() +{ + if (m_status != Initial) { + m_status = Initial; + emit resourcesLost(); + } + + m_resourceSet->release(); +} + diff --git a/src/plugins/resourcepolicy/resourcepolicyimpl.h b/src/plugins/resourcepolicy/resourcepolicyimpl.h new file mode 100644 index 00000000..8680df86 --- /dev/null +++ b/src/plugins/resourcepolicy/resourcepolicyimpl.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd, author: +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef RESOURCEPOLICYIMPL_H +#define RESOURCEPOLICYIMPL_H + +#include + +#include + +namespace ResourcePolicy { + class ResourceSet; +}; + +class ResourcePolicyImpl : public QMediaPlayerResourceSetInterface +{ + Q_OBJECT +public: + ResourcePolicyImpl(QObject *parent = 0); + + bool isVideoEnabled() const; + void setVideoEnabled(bool videoEnabled); + void acquire(); + void release(); + bool isGranted() const; + bool isAvailable() const; + +private slots: + void handleResourcesGranted(); + void handleResourcesDenied(); + void handleResourcesLost(); + +private: + enum ResourceStatus { + Initial = 0, + RequestedResource, + GrantedResource + }; + + bool m_videoEnabled; + ResourcePolicy::ResourceSet *m_resourceSet; + ResourceStatus m_status; +}; + +#endif // RESOURCEPOLICYIMPL_H diff --git a/src/plugins/resourcepolicy/resourcepolicyplugin.cpp b/src/plugins/resourcepolicy/resourcepolicyplugin.cpp new file mode 100644 index 00000000..7fc69d32 --- /dev/null +++ b/src/plugins/resourcepolicy/resourcepolicyplugin.cpp @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd, author: +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "resourcepolicyplugin.h" +#include "resourcepolicyimpl.h" + +ResourcePolicyPlugin::ResourcePolicyPlugin(QObject *parent) + : QMediaResourcePolicyPlugin(parent) +{ +} + +QObject *ResourcePolicyPlugin::create(const QString &interfaceId) +{ + // TODO: what is interfaceId for? + return new ResourcePolicyImpl(this); +} + +void ResourcePolicyPlugin::destroy(QObject *resourceSet) +{ + // TODO: do we need to do anything more elaborate here? + delete resourceSet; +} + diff --git a/src/plugins/resourcepolicy/resourcepolicyplugin.h b/src/plugins/resourcepolicy/resourcepolicyplugin.h new file mode 100644 index 00000000..f23641a7 --- /dev/null +++ b/src/plugins/resourcepolicy/resourcepolicyplugin.h @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Jolla Ltd, author: +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef RESOURCEPOLICYPLUGIN_H +#define RESOURCEPOLICYPLUGIN_H + +#include +#include + +class ResourcePolicyPlugin : public QMediaResourcePolicyPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaresourcesetfactory/5.0" FILE "resourcepolicy.json") + Q_INTERFACES(QMediaResourceSetFactoryInterface) +public: + ResourcePolicyPlugin(QObject *parent = 0); + + QObject *create(const QString &interfaceId); + void destroy(QObject *resourceSet); +}; + +#endif // RESOURCEPOLICYPLUGIN_H