source: trunk/src/gui/kernel/qsound.cpp@ 441

Last change on this file since 441 was 250, checked in by Dmitry A. Kuminov, 16 years ago

gui: Ported QSound to OS/2 using the MMPM backend.

File size: 9.9 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the QtGui module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qsound.h"
43
44#ifndef QT_NO_SOUND
45
46#include "qlist.h"
47#include <private/qobject_p.h>
48#include "qsound_p.h"
49
50QT_BEGIN_NAMESPACE
51
52static QList<QAuServer*> *servers=0;
53
54QAuServer::QAuServer(QObject* parent)
55 : QObject(parent)
56{
57 if (!servers)
58 servers = new QList<QAuServer*>;
59 servers->prepend(this);
60}
61
62QAuServer::~QAuServer()
63{
64 servers->removeAll(this);
65 if (servers->count() == 0) {
66 delete servers;
67 servers = 0;
68 }
69}
70
71void QAuServer::play(const QString& filename)
72{
73 QSound s(filename);
74 play(&s);
75}
76
77extern QAuServer* qt_new_audio_server();
78
79static QAuServer& server()
80{
81 if (!servers) qt_new_audio_server();
82 return *servers->first();
83}
84
85class QSoundPrivate : public QObjectPrivate
86{
87public:
88 QSoundPrivate(const QString& fname)
89 : filename(fname), server(0), bucket(0), looprem(0), looptotal(1)
90 {
91 }
92
93 ~QSoundPrivate()
94 {
95 delete bucket;
96 }
97
98 QString filename;
99 QAuServer* server;
100 QAuBucket* bucket;
101 int looprem;
102 int looptotal;
103};
104
105/*!
106 \class QSound
107 \brief The QSound class provides access to the platform audio facilities.
108
109 \ingroup multimedia
110 \mainclass
111
112 Qt provides the most commonly required audio operation in GUI
113 applications: asynchronously playing a sound file. This is most
114 easily accomplished using the static play() function:
115
116 \snippet doc/src/snippets/code/src_gui_kernel_qsound.cpp 0
117
118 Alternatively, create a QSound object from the sound file first
119 and then call the play() slot:
120
121 \snippet doc/src/snippets/code/src_gui_kernel_qsound.cpp 1
122
123 Once created a QSound object can be queried for its fileName() and
124 total number of loops() (i.e. the number of times the sound will
125 play). The number of repetitions can be altered using the
126 setLoops() function. While playing the sound, the loopsRemaining()
127 function returns the remaining number of repetitions. Use the
128 isFinished() function to determine whether the sound has finished
129 playing.
130
131 Sounds played using a QSound object may use more memory than the
132 static play() function, but it may also play more immediately
133 (depending on the underlying platform audio facilities). Use the
134 static isAvailable() function to determine whether sound
135 facilities exist on the platform. Which facilities that are
136 actually used varies:
137
138 \table
139 \header \o Platform \o Audio Facility
140 \row
141 \o Microsoft Windows
142 \o The underlying multimedia system is used; only WAVE format sound files
143 are supported.
144 \row
145 \o X11
146 \o The \l{ftp://ftp.x.org/contrib/audio/nas/}{Network Audio System}
147 is used if available, otherwise all operations work silently. NAS
148 supports WAVE and AU files.
149 \row
150 \o Mac OS X
151 \o NSSound is used. All formats that NSSound supports, including QuickTime formats,
152 are supported by Qt for Mac OS X.
153 \row
154 \o Qt for Embedded Linux
155 \o A built-in mixing sound server is used, accessing \c /dev/dsp
156 directly. Only the WAVE format is supported.
157 \endtable
158
159 Note that QSound does not support \l{resources.html}{resources}.
160 This might be fixed in a future Qt version.
161*/
162
163/*!
164 Plays the sound stored in the file specified by the given \a filename.
165
166 \sa stop(), loopsRemaining(), isFinished()
167*/
168void QSound::play(const QString& filename)
169{
170 server().play(filename);
171}
172
173/*!
174 Constructs a QSound object from the file specified by the given \a
175 filename and with the given \a parent.
176
177 This may use more memory than the static play() function, but it
178 may also play more immediately (depending on the underlying
179 platform audio facilities).
180
181 \sa play()
182*/
183QSound::QSound(const QString& filename, QObject* parent)
184 : QObject(*new QSoundPrivate(filename), parent)
185{
186 d_func()->server = &server();
187 d_func()->server->init(this);
188}
189
190#ifdef QT3_SUPPORT
191/*!
192 \obsolete
193
194 Constructs a QSound object from the file specified by the given \a
195 filename and with the given \a parent and \a name. Use the
196 QSound() construcor and QObject::setObjectName() instead.
197
198 \oldcode
199 QSound *mySound = new QSound(filename, parent, name);
200 \newcode
201 QSounc *mySound = new QSound(filename, parent);
202 mySound->setObjectName(name);
203 \endcode
204*/
205QSound::QSound(const QString& filename, QObject* parent, const char* name)
206 : QObject(*new QSoundPrivate(filename), parent)
207{
208 setObjectName(QString::fromAscii(name));
209 server().init(this);
210}
211#endif
212
213/*!
214 Destroys this sound object. If the sound is not finished playing,
215 the stop() function is called before the sound object is
216 destructed.
217
218 \sa stop(), isFinished()
219*/
220QSound::~QSound()
221{
222 if (!isFinished())
223 stop();
224}
225
226/*!
227 Returns true if the sound has finished playing; otherwise returns false.
228
229 \warning On Windows this function always returns true for unlooped sounds.
230*/
231bool QSound::isFinished() const
232{
233 Q_D(const QSound);
234 return d->looprem == 0;
235}
236
237/*!
238 \overload
239
240 Starts playing the sound specified by this QSound object.
241
242 The function returns immediately. Depending on the platform audio
243 facilities, other sounds may stop or be mixed with the new
244 sound. The sound can be played again at any time, possibly mixing
245 or replacing previous plays of the sound.
246
247 \sa fileName()
248*/
249void QSound::play()
250{
251 Q_D(QSound);
252 d->looprem = d->looptotal;
253 server().play(this);
254}
255
256/*!
257 Returns the number of times the sound will play.
258
259 \sa loopsRemaining(), setLoops()
260*/
261int QSound::loops() const
262{
263 Q_D(const QSound);
264 return d->looptotal;
265}
266
267/*!
268 Returns the remaining number of times the sound will loop (this
269 value decreases each time the sound is played).
270
271 \sa loops(), isFinished()
272*/
273int QSound::loopsRemaining() const
274{
275 Q_D(const QSound);
276 return d->looprem;
277}
278
279/*!
280 \fn void QSound::setLoops(int number)
281
282 Sets the sound to repeat the given \a number of times when it is
283 played.
284
285 Note that passing the value -1 will cause the sound to loop
286 indefinitely.
287
288 \sa loops()
289*/
290void QSound::setLoops(int n)
291{
292 Q_D(QSound);
293 d->looptotal = n;
294}
295
296/*!