You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
7.5 KiB
317 lines
7.5 KiB
13 years ago
|
/****************************************************************************
|
||
|
**
|
||
|
** 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 retquirements 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.
|
||
|
**
|
||
|
**********************************************************************/
|
||
|
|
||
|
#include "qsound.h"
|
||
|
|
||
|
#ifndef QT_NO_SOUND
|
||
|
|
||
|
#include "qptrlist.h"
|
||
|
|
||
|
static TQPtrList<TQAuServer> *servers=0;
|
||
|
|
||
|
TQAuServer::TQAuServer(TQObject* parent, const char* name) :
|
||
|
TQObject(parent,name)
|
||
|
{
|
||
|
if ( !servers ) {
|
||
|
servers = new TQPtrList<TQAuServer>;
|
||
|
// ### add cleanup
|
||
|
}
|
||
|
servers->prepend(this);
|
||
|
}
|
||
|
|
||
|
TQAuServer::~TQAuServer()
|
||
|
{
|
||
|
servers->remove(this);
|
||
|
if ( servers->count() == 0 ) {
|
||
|
delete servers;
|
||
|
servers = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void TQAuServer::play(const TQString& filename)
|
||
|
{
|
||
|
TQSound s(filename);
|
||
|
play(&s);
|
||
|
}
|
||
|
|
||
|
extern TQAuServer* qt_new_audio_server();
|
||
|
|
||
|
static TQAuServer& server()
|
||
|
{
|
||
|
if (!servers) qt_new_audio_server();
|
||
|
return *servers->first();
|
||
|
}
|
||
|
|
||
|
class TQSoundData {
|
||
|
public:
|
||
|
TQSoundData(const TQString& fname) :
|
||
|
filename(fname), bucket(0), looprem(0), looptotal(1)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
~TQSoundData()
|
||
|
{
|
||
|
delete bucket;
|
||
|
}
|
||
|
|
||
|
TQString filename;
|
||
|
TQAuBucket* bucket;
|
||
|
int looprem;
|
||
|
int looptotal;
|
||
|
};
|
||
|
|
||
|
/*!
|
||
|
\class TQSound qsound.h
|
||
|
\brief The TQSound class provides access to the platform audio facilities.
|
||
|
|
||
|
\ingroup multimedia
|
||
|
\mainclass
|
||
|
|
||
|
TQt provides the most commonly retquired audio operation in GUI
|
||
|
applications: asynchronously playing a sound file. This is most
|
||
|
easily accomplished with a single call:
|
||
|
\code
|
||
|
TQSound::play("mysounds/bells.wav");
|
||
|
\endcode
|
||
|
|
||
|
A second API is provided in which a TQSound object is created from
|
||
|
a sound file and is played later:
|
||
|
\code
|
||
|
TQSound bells("mysounds/bells.wav");
|
||
|
|
||
|
bells.play();
|
||
|
\endcode
|
||
|
|
||
|
Sounds played using the second model may use more memory but play
|
||
|
more immediately than sounds played using the first model,
|
||
|
depending on the underlying platform audio facilities.
|
||
|
|
||
|
On Microsoft Windows the underlying multimedia system is used;
|
||
|
only WAVE format sound files are supported.
|
||
|
|
||
|
On X11 the \link ftp://ftp.x.org/contrib/audio/nas/ Network Audio
|
||
|
System\endlink is used if available, otherwise all operations work
|
||
|
silently. NAS supports WAVE and AU files.
|
||
|
|
||
|
On Macintosh, ironically, we use QT (\link
|
||
|
http://tquicktime.apple.com QuickTime\endlink) for sound, this
|
||
|
means all QuickTime formats are supported by TQt/Mac.
|
||
|
|
||
|
On TQt/Embedded, a built-in mixing sound server is used, which
|
||
|
accesses \c /dev/dsp directly. Only the WAVE format is supported.
|
||
|
|
||
|
The availability of sound can be tested with
|
||
|
TQSound::isAvailable().
|
||
|
*/
|
||
|
|
||
|
/*!
|
||
|
\fn static bool TQSound::available()
|
||
|
|
||
|
Returns TRUE if sound support is available; otherwise returns FALSE.
|
||
|
*/
|
||
|
|
||
|
/*!
|
||
|
Plays the sound in a file called \a filename.
|
||
|
*/
|
||
|
void TQSound::play(const TQString& filename)
|
||
|
{
|
||
|
server().play(filename);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Constructs a TQSound that can tquickly play the sound in a file
|
||
|
named \a filename.
|
||
|
|
||
|
This may use more memory than the static \c play function.
|
||
|
|
||
|
The \a parent and \a name arguments (default 0) are passed on to
|
||
|
the TQObject constructor.
|
||
|
*/
|
||
|
TQSound::TQSound(const TQString& filename, TQObject* parent, const char* name) :
|
||
|
TQObject(parent,name),
|
||
|
d(new TQSoundData(filename))
|
||
|
{
|
||
|
server().init(this);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Destroys the sound object. If the sound is not finished playing stop() is called on it.
|
||
|
|
||
|
\sa stop() isFinished()
|
||
|
*/
|
||
|
TQSound::~TQSound()
|
||
|
{
|
||
|
if ( !isFinished() )
|
||
|
stop();
|
||
|
delete d;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Returns TRUE if the sound has finished playing; otherwise returns FALSE.
|
||
|
|
||
|
\warning On Windows this function always returns TRUE for unlooped sounds.
|
||
|
*/
|
||
|
bool TQSound::isFinished() const
|
||
|
{
|
||
|
return d->looprem == 0;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
\overload
|
||
|
|
||
|
Starts the sound playing. The function returns immediately.
|
||
|
Depending on the platform audio facilities, other sounds may stop
|
||
|
or may be mixed with the new sound.
|
||
|
|
||
|
The sound can be played again at any time, possibly mixing or
|
||
|
replacing previous plays of the sound.
|
||
|
*/
|
||
|
void TQSound::play()
|
||
|
{
|
||
|
d->looprem = d->looptotal;
|
||
|
server().play(this);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Returns the number of times the sound will play.
|
||
|
*/
|
||
|
int TQSound::loops() const
|
||
|
{
|
||
|
return d->looptotal;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Returns the number of times the sound will loop. This value
|
||
|
decreases each time the sound loops.
|
||
|
*/
|
||
|
int TQSound::loopsRemaining() const
|
||
|
{
|
||
|
return d->looprem;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Sets the sound to repeat \a l times when it is played. Passing the
|
||
|
value -1 will cause the sound to loop indefinitely.
|
||
|
|
||
|
\sa loops()
|
||
|
*/
|
||
|
void TQSound::setLoops(int l)
|
||
|
{
|
||
|
d->looptotal = l;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Returns the filename associated with the sound.
|
||
|
*/
|
||
|
TQString TQSound::fileName() const
|
||
|
{
|
||
|
return d->filename;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Stops the sound playing.
|
||
|
|
||
|
On Windows the current loop will finish if a sound is played
|
||
|
in a loop.
|
||
|
|
||
|
\sa play()
|
||
|
*/
|
||
|
void TQSound::stop()
|
||
|
{
|
||
|
server().stop(this);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*!
|
||
|
Returns TRUE if sound facilities exist on the platform; otherwise
|
||
|
returns FALSE. An application may choose either to notify the user
|
||
|
if sound is crucial to the application or to operate silently
|
||
|
without bothering the user.
|
||
|
|
||
|
If no sound is available, all TQSound operations work silently and
|
||
|
tquickly.
|
||
|
*/
|
||
|
bool TQSound::isAvailable()
|
||
|
{
|
||
|
return server().okay();
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Sets the internal bucket record of sound \a s to \a b, deleting
|
||
|
any previous setting.
|
||
|
*/
|
||
|
void TQAuServer::setBucket(TQSound* s, TQAuBucket* b)
|
||
|
{
|
||
|
delete s->d->bucket;
|
||
|
s->d->bucket = b;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Returns the internal bucket record of sound \a s.
|
||
|
*/
|
||
|
TQAuBucket* TQAuServer::bucket(TQSound* s)
|
||
|
{
|
||
|
return s->d->bucket;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Decrements the TQSound::loopRemaining() value for sound \a s,
|
||
|
returning the result.
|
||
|
*/
|
||
|
int TQAuServer::decLoop(TQSound* s)
|
||
|
{
|
||
|
if ( s->d->looprem > 0 )
|
||
|
--s->d->looprem;
|
||
|
return s->d->looprem;
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Initializes the sound. The default implementation does nothing.
|
||
|
*/
|
||
|
void TQAuServer::init(TQSound*)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
TQAuBucket::~TQAuBucket()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
#endif // QT_NO_SOUND
|