summaryrefslogtreecommitdiffstats
path: root/experimental/tqtinterface/qt4/src/kernel/tqsound_x11.cpp
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:17:53 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-07-10 15:17:53 -0500
commit37e3f157c7d76f13de807fa66e36df209e1005fb (patch)
tree7a4f131b2ee065337dac341bff34515310efba4f /experimental/tqtinterface/qt4/src/kernel/tqsound_x11.cpp
parent16630c3eff313238fa8412275555285c9195981b (diff)
downloadtde-37e3f157c7d76f13de807fa66e36df209e1005fb.tar.gz
tde-37e3f157c7d76f13de807fa66e36df209e1005fb.zip
Added TQt4 HEAD
Diffstat (limited to 'experimental/tqtinterface/qt4/src/kernel/tqsound_x11.cpp')
-rw-r--r--experimental/tqtinterface/qt4/src/kernel/tqsound_x11.cpp284
1 files changed, 284 insertions, 0 deletions
diff --git a/experimental/tqtinterface/qt4/src/kernel/tqsound_x11.cpp b/experimental/tqtinterface/qt4/src/kernel/tqsound_x11.cpp
new file mode 100644
index 000000000..6ffe6e80e
--- /dev/null
+++ b/experimental/tqtinterface/qt4/src/kernel/tqsound_x11.cpp
@@ -0,0 +1,284 @@
+/****************************************************************************
+**
+** Implementation of TQSound class and TQAuServer internal class
+**
+** Created : 000117
+**
+** Copyright (C) 1999-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the kernel module of the TQt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free TQt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#define TQT_CLEAN_NAMESPACE
+
+#include "tqsound.h"
+
+#ifndef TQT_NO_SOUND
+
+#include "tqptrdict.h"
+#include "tqsocketnotifier.h"
+#include "tqapplication.h"
+
+
+#ifdef TQT_NAS_SUPPORT
+
+#include <audio/audiolib.h>
+#include <audio/soundlib.h>
+
+static AuServer *nas=0;
+
+static AuBool eventPred(AuServer *, AuEvent *e, AuPointer p)
+{
+ if (e && (e->type == AuEventTypeElementNotify)) {
+ if (e->auelementnotify.flow == *((AuFlowID *)p))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+class TQAuBucketNAS : public TQAuBucket {
+public:
+ TQAuBucketNAS(AuBucketID b, AuFlowID f = 0) : id(b), flow(f), stopped(TRUE), numplaying(0) { }
+ ~TQAuBucketNAS()
+ {
+ if ( nas ) {
+ AuSync(nas, FALSE);
+ AuDestroyBucket(nas, id, NULL);
+
+ AuEvent ev;
+ while (AuScanEvents(nas, AuEventsQueuedAfterFlush, TRUE, eventPred, &flow, &ev))
+ ;
+ }
+ }
+
+ AuBucketID id;
+ AuFlowID flow;
+ bool stopped;
+ int numplaying;
+};
+
+class TQAuServerNAS : public TQAuServer {
+ Q_OBJECT
+ TQ_OBJECT
+
+ TQSocketNotifier* sn;
+
+public:
+ TQAuServerNAS(TQObject* tqparent);
+ ~TQAuServerNAS();
+
+ void init(TQSound*);
+ void play(const TQString& filename);
+ void play(TQSound*);
+ void stop(TQSound*);
+ bool okay();
+ void setDone(TQSound*);
+
+public Q_SLOTS:
+ void dataReceived();
+ void soundDestroyed(TQObject *o);
+
+private:
+ TQAuBucketNAS* bucket(TQSound* s)
+ {
+ return (TQAuBucketNAS*)TQAuServer::bucket(s);
+ }
+};
+
+TQAuServerNAS::TQAuServerNAS(TQObject* tqparent) :
+ TQAuServer(tqparent,"Network Audio System")
+{
+ nas = AuOpenServer(NULL, 0, NULL, 0, NULL, NULL);
+ if (nas) {
+ AuSetCloseDownMode(nas, AuCloseDownDestroy, NULL);
+ // Ask TQt for async messages...
+ sn=new TQSocketNotifier(AuServerConnectionNumber(nas),
+ TQSocketNotifier::Read);
+ TQObject::connect(sn, TQT_SIGNAL(activated(int)),
+ this, TQT_SLOT(dataReceived()));
+ } else {
+ sn = 0;
+ }
+}
+
+TQAuServerNAS::~TQAuServerNAS()
+{
+ if ( nas )
+ AuCloseServer( nas );
+ delete sn;
+ nas = 0;
+}
+
+static TQPtrDict<void> *inprogress=0;
+
+void TQAuServerNAS::soundDestroyed(TQObject *o)
+{
+ if (inprogress) {
+ TQSound *so = static_cast<TQSound *>(o);
+ while (inprogress->remove(so))
+ ; // Loop while remove returns TRUE
+ }
+}
+
+void TQAuServerNAS::play(const TQString& filename)
+{
+ if (nas) {
+ int iv=100;
+ AuFixedPoint volume=AuFixedPointFromFraction(iv,100);
+ AuSoundPlayFromFile(nas, filename, AuNone, volume, NULL, NULL, NULL, NULL, NULL, NULL);
+ AuFlush(nas);
+ dataReceived();
+ AuFlush(nas);
+ tqApp->flushX();
+ }
+}
+
+static void callback( AuServer*, AuEventHandlerRec*, AuEvent* e, AuPointer p)
+{
+ if ( inprogress->tqfind(p) && e ) {
+ if (e->type==AuEventTypeElementNotify &&
+ e->auelementnotify.kind==AuElementNotifyKindState) {
+ if ( e->auelementnotify.cur_state == AuStateStop )
+ ((TQAuServerNAS*)inprogress->tqfind(p))->setDone((TQSound*)p);
+ }
+ }
+}
+
+void TQAuServerNAS::setDone(TQSound* s)
+{
+ if (nas) {
+ decLoop(s);
+ if (s->loopsRemaining() && !bucket(s)->stopped) {
+ bucket(s)->stopped = TRUE;
+ play(s);
+ } else {
+ if (--(bucket(s)->numplaying) == 0)
+ bucket(s)->stopped = TRUE;
+ inprogress->remove(s);
+ }
+ }
+}
+
+void TQAuServerNAS::play(TQSound* s)
+{
+ if (nas) {
+ ++(bucket(s)->numplaying);
+ if (!bucket(s)->stopped) {
+ stop(s);
+ }
+
+ bucket(s)->stopped = FALSE;
+ if ( !inprogress )
+ inprogress = new TQPtrDict<void>;
+ inprogress->insert(s,(void*)this);
+ int iv=100;
+ AuFixedPoint volume=AuFixedPointFromFraction(iv,100);
+ TQAuBucketNAS *b = bucket(s);
+ AuSoundPlayFromBucket(nas, b->id, AuNone, volume,
+ callback, s, 0, &b->flow, NULL, NULL, NULL);
+ AuFlush(nas);
+ dataReceived();
+ AuFlush(nas);
+ tqApp->flushX();
+ }
+}
+
+void TQAuServerNAS::stop(TQSound* s)
+{
+ if (nas && !bucket(s)->stopped) {
+ bucket(s)->stopped = TRUE;
+ AuStopFlow(nas, bucket(s)->flow, NULL);
+ AuFlush(nas);
+ dataReceived();
+ AuFlush(nas);
+ tqApp->flushX();
+ }
+}
+
+void TQAuServerNAS::init(TQSound* s)
+{
+ connect(s, TQT_SIGNAL(destroyed(TQObject *)),
+ this, TQT_SLOT(soundDestroyed(TQObject *)));
+
+ if ( nas ) {
+ AuBucketID b_id =
+ AuSoundCreateBucketFromFile(nas, s->fileName(),
+ 0 /*AuAccessAllMasks*/, NULL, NULL);
+ setBucket(s, new TQAuBucketNAS(b_id));
+ }
+}
+
+bool TQAuServerNAS::okay()
+{
+ return !!nas;
+}
+
+void TQAuServerNAS::dataReceived()
+{
+ AuHandleEvents(nas);
+}
+
+#include "tqsound_x11.tqmoc"
+
+#endif
+
+
+class TQAuServerNull : public TQAuServer {
+public:
+ TQAuServerNull(TQObject* tqparent);
+
+ void play(const TQString&) { }
+ void play(TQSound*s) { while(decLoop(s) > 0) /* nothing */ ; }
+ void stop(TQSound*) { }
+ bool okay() { return FALSE; }
+};
+
+TQAuServerNull::TQAuServerNull(TQObject* tqparent) :
+ TQAuServer(tqparent,"Null Audio Server")
+{
+}
+
+
+TQAuServer* qt_new_audio_server()
+{
+#ifdef TQT_NAS_SUPPORT
+ TQAuServer* s=new TQAuServerNAS(TQT_TQOBJECT(tqApp));
+ if (s->okay()) {
+ return s;
+ } else {
+ delete s;
+ }
+#endif
+ return new TQAuServerNull(TQT_TQOBJECT(tqApp));
+}
+
+#endif // TQT_NO_SOUND