diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:18:55 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:18:55 (GMT) |
commit | e5fcad302d86d316390c6b0f62759a067313e8a9 (patch) | |
tree | c2afbf6f1066b6ce261f14341cf6d310e5595bc1 /src/gui/kernel/qsound_qws.cpp | |
download | Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.zip Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.gz Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.bz2 |
Long live Qt 4.5!
Diffstat (limited to 'src/gui/kernel/qsound_qws.cpp')
-rw-r--r-- | src/gui/kernel/qsound_qws.cpp | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/src/gui/kernel/qsound_qws.cpp b/src/gui/kernel/qsound_qws.cpp new file mode 100644 index 0000000..e83935f --- /dev/null +++ b/src/gui/kernel/qsound_qws.cpp @@ -0,0 +1,350 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qapplication.h" + +#ifndef QT_NO_SOUND + +#include "qsound.h" +#include "qpaintdevice.h" +#include "qwsdisplay_qws.h" +#include "qsound_p.h" + +#include "qsoundqss_qws.h" + +#include "qhash.h" +#include "qfileinfo.h" + +#ifdef MEDIA_SERVER +#include "qbytearray.h" +#include "quuid.h" +#include "qdatastream.h" +#include "qcopchannel_qws.h" +#include "qbuffer.h" + +QT_BEGIN_NAMESPACE + +QT_USE_NAMESPACE + +#define SERVER_CHANNEL "QPE/MediaServer" + +class QCopMessage : public QDataStream +{ +public: + QCopMessage( const QString& channel, const QString& message ) + : QDataStream( new QBuffer ), m_channel( channel ), m_message( message ) + { + device()->open( QIODevice::WriteOnly ); + } + + ~QCopMessage() + { + QCopChannel::send( m_channel, m_message, ((QBuffer*)device())->buffer() ); + delete device(); + } + +private: + QString m_channel; + QString m_message; +}; + +#endif // MEDIA_SERVER + +class QAuServerQWS; + +class QAuBucketQWS : public QObject, public QAuBucket +{ + Q_OBJECT +public: + QAuBucketQWS( QAuServerQWS*, QSound*, QObject* parent = 0 ); + + ~QAuBucketQWS(); + +#ifndef MEDIA_SERVER + int id() const { return id_; } +#endif + + QSound* sound() const { return sound_; } + +#ifdef MEDIA_SERVER + void play(); + + void stop(); +#endif + +signals: + // Only for Media Server + void done( QAuBucketQWS* ); + +private slots: + // Only for Media Server + void processMessage( const QString& msg, const QByteArray& data ); + +private: +#ifdef MEDIA_SERVER + QCopChannel *m_channel; + QUuid m_id; +#endif + +#ifndef MEDIA_SERVER + int id_; +#endif + QSound *sound_; + QAuServerQWS *server_; + + static int next; +}; + +int QAuBucketQWS::next = 0; + +class QAuServerQWS : public QAuServer +{ + Q_OBJECT +public: + QAuServerQWS( QObject* parent ); + + void init( QSound* s ) + { + QAuBucketQWS *bucket = new QAuBucketQWS( this, s ); +#ifdef MEDIA_SERVER + connect( bucket, SIGNAL(done(QAuBucketQWS*)), + this, SLOT(complete(QAuBucketQWS*)) ); +#endif + setBucket( s, bucket ); + } + +#ifndef MEDIA_SERVER + // Register bucket + void insert( QAuBucketQWS *bucket ) + { + buckets.insert( bucket->id(), bucket ); + } + + // Remove bucket from register + void remove( QAuBucketQWS *bucket ) + { + buckets.remove( bucket->id() ); + } +#endif + + void play( QSound* s ) + { + QString filepath = QFileInfo( s->fileName() ).absoluteFilePath(); +#if defined(QT_NO_QWS_SOUNDSERVER) + server->playFile( bucket( s )->id(), filepath ); +#elif defined(MEDIA_SERVER) + bucket( s )->play(); +#else + client->play( bucket( s )->id(), filepath ); +#endif + } + + void stop( QSound* s ) + { +#if defined(QT_NO_QWS_SOUNDSERVER) + server->stopFile( bucket( s )->id() ); +#elif defined(MEDIA_SERVER) + bucket( s )->stop(); +#else + client->stop( bucket( s )->id() ); +#endif + } + + bool okay() { return true; } + +private slots: + // Continue playing sound if loops remain + void complete( int id ) + { +#ifndef MEDIA_SERVER + QAuBucketQWS *bucket = find( id ); + if( bucket ) { + QSound *sound = bucket->sound(); + if( decLoop( sound ) ) { + play( sound ); + } + } +#else + Q_UNUSED(id); +#endif + } + + // Only for Media Server + void complete( QAuBucketQWS* bucket ) + { +#ifndef MEDIA_SERVER + Q_UNUSED(bucket); +#else + QSound *sound = bucket->sound(); + if( decLoop( sound ) ) { + play( sound ); + } +#endif + } + +protected: + QAuBucketQWS* bucket( QSound *s ) + { + return (QAuBucketQWS*)QAuServer::bucket( s ); + } + +private: +#ifndef MEDIA_SERVER + // Find registered bucket with given id, return null if none found + QAuBucketQWS* find( int id ) + { + QHash<int, QAuBucketQWS*>::Iterator it = buckets.find( id ); + if( it != buckets.end() ) { + return it.value(); + } + + return 0; + } + + QHash<int, QAuBucketQWS*> buckets; // ### possible problem with overlapping keys + +#ifdef QT_NO_QWS_SOUNDSERVER + QWSSoundServer *server; +#else + QWSSoundClient *client; +#endif + +#endif // MEDIA_SERVER +}; + +QAuServerQWS::QAuServerQWS(QObject* parent) : + QAuServer(parent) +{ +#ifndef MEDIA_SERVER + setObjectName(QLatin1String("qauserverqws")); + +#ifdef QT_NO_QWS_SOUNDSERVER + server = new QWSSoundServer( this ); // ### only suitable for single application + + connect( server, SIGNAL(soundCompleted(int)), + this, SLOT(complete(int)) ); +#else + client = new QWSSoundClient( this ); // ### requires successful connection + + connect( client, SIGNAL(soundCompleted(int)), + this, SLOT(complete(int)) ); +#endif + +#endif // MEDIA_SERVER +} + +QAuBucketQWS::QAuBucketQWS( QAuServerQWS *server, QSound *sound, QObject* parent ) + : QObject( parent ), sound_( sound ), server_( server ) +{ +#ifdef MEDIA_SERVER + m_id = QUuid::createUuid(); + + sound->setObjectName( m_id.toString() ); + + m_channel = new QCopChannel(QString( QLatin1String("QPE/QSound/") ).append( m_id ), this ); + connect( m_channel, SIGNAL(received(QString,QByteArray)), + this, SLOT(processMessage(QString,QByteArray)) ); + + { + QCopMessage message( QLatin1String(SERVER_CHANNEL), QLatin1String("subscribe(QUuid)") ); + message << m_id; + } + + { + QString filepath = QFileInfo( sound_->fileName() ).absoluteFilePath(); + QCopMessage message( QLatin1String(SERVER_CHANNEL), QLatin1String("open(QUuid,QString)") ); + message << m_id << filepath; + } +#else + id_ = next++; + server_->insert( this ); +#endif +} + +#ifdef MEDIA_SERVER +void QAuBucketQWS::play() +{ + QString filepath = QFileInfo( sound_->fileName() ).absoluteFilePath(); + + QCopMessage message( QLatin1String(SERVER_CHANNEL), QLatin1String("play(QUuid)") ); + message << m_id; +} + +void QAuBucketQWS::stop() +{ + QCopMessage message( QLatin1String(SERVER_CHANNEL), QLatin1String("stop(QUuid)") ); + message << m_id; +} +#endif // MEDIA_SERVER + +void QAuBucketQWS::processMessage( const QString& msg, const QByteArray& data ) +{ + Q_UNUSED(data); +#ifndef MEDIA_SERVER + Q_UNUSED(msg); +#else + if( msg == QLatin1String("done()") ) { + emit done( this ); + } +#endif +} + +QAuBucketQWS::~QAuBucketQWS() +{ +#ifdef MEDIA_SERVER + QCopMessage message( QLatin1String(SERVER_CHANNEL), QLatin1String("revoke(QUuid)") ); + message << m_id; +#else + server_->remove( this ); +#endif +} + + +QAuServer* qt_new_audio_server() +{ + return new QAuServerQWS(qApp); +} + +#include "qsound_qws.moc" + +#endif // QT_NO_SOUND + +QT_END_NAMESPACE |