summaryrefslogtreecommitdiff
authorzecke <zecke>2004-08-25 21:32:12 (UTC)
committer zecke <zecke>2004-08-25 21:32:12 (UTC)
commite4811064703ad34f42f15c3044cd8f63c0e7583c (patch) (unidiff)
tree5c2ab29a176540761b351c29b6556c852067f613
parent656d233aa88a92b461abaa618e52db11c1f9d625 (diff)
downloadopie-e4811064703ad34f42f15c3044cd8f63c0e7583c.zip
opie-e4811064703ad34f42f15c3044cd8f63c0e7583c.tar.gz
opie-e4811064703ad34f42f15c3044cd8f63c0e7583c.tar.bz2
-If play() is called again kill old 'looping/playing' in favor
of the new value. This deletes the timer and would fix possible shortage on timer resources -A small friend to hook to an internal signal to avoid problems in Opie::Core::ODevice entering the event loop to wait for the sound to be finished. processEvents() can give strange results as some applications do not expect that the eventloop is entered. This could possible deliver a Timer, or an Event from QSocketNotifier which could give all kind of problems of wrong reentrancy. So let us avoid it.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/sound.cpp35
-rw-r--r--library/sound.h2
2 files changed, 35 insertions, 2 deletions
diff --git a/library/sound.cpp b/library/sound.cpp
index ee2aabc..d1e2388 100644
--- a/library/sound.cpp
+++ b/library/sound.cpp
@@ -89,98 +89,126 @@ static int WAVsoundDuration(const QString& filename)
89 //qDebug("WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag); 89 //qDebug("WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag);
90 return 0; 90 return 0;
91 } 91 }
92 } else { 92 } else {
93//qDebug("skip %.4s chunk",chunk.id); 93//qDebug("skip %.4s chunk",chunk.id);
94 // ignored chunk 94 // ignored chunk
95 if ( chunk.size < 10000000 ) 95 if ( chunk.size < 10000000 )
96 (void)input.at(input.at()+chunk.size); 96 (void)input.at(input.at()+chunk.size);
97 } 97 }
98 } 98 }
99 99
100//qDebug("%dms",total); 100//qDebug("%dms",total);
101 return total; 101 return total;
102} 102}
103 103
104class SoundData : public QSound { 104class SoundData : public QSound {
105 Q_OBJECT
106signals:
107 void stopped();
105public: 108public:
106 SoundData ( const QString& name ) : 109 SoundData ( const QString& name ) :
107 QSound ( Resource::findSound ( name )), 110 QSound ( Resource::findSound ( name )),
108 filename ( Resource::findSound ( name )) 111 filename ( Resource::findSound ( name ))
109 { 112 {
110 loopsleft=0; 113 loopsleft=0;
111 ms = WAVsoundDuration(filename); 114 ms = WAVsoundDuration(filename);
112 } 115 }
113 116
114 void playLoop ( int loopcnt = -1 ) 117 void playLoop ( int loopcnt = -1 )
115 { 118 {
116 // needs server support 119 // needs server support
117 loopsleft = loopcnt; 120 loopsleft = loopcnt;
118 121
119 if ( ms ) 122 if ( ms )
120 startTimer ( ms > 50 ? ms-50 : 0 ); // 50 for latency 123 startTimer ( ms > 50 ? ms-50 : 0 ); // 50 for latency
121 play ( ); 124 play ( );
122 } 125 }
123 126
124 void timerEvent ( QTimerEvent *e ) 127 void timerEvent ( QTimerEvent *e )
125 { 128 {
126 if ( loopsleft >= 0 ) { 129 if ( loopsleft >= 0 ) {
127 if ( --loopsleft <= 0 ) { 130 if ( --loopsleft <= 0 ) {
128 killTimer ( e-> timerId ( )); 131 killTimer ( e-> timerId ( ));
129 loopsleft = 0; 132 loopsleft = 0;
130 return; 133 return;
131 } 134 }
132 } 135 }
133 play(); 136 play();
134 } 137 }
135 138
136 bool isFinished ( ) const 139 bool isFinished ( ) const
137 { 140 {
138 return ( loopsleft == 0 ); 141 return ( loopsleft == 0 );
139 } 142 }
140 143
144 /*
145 * non virtual reimplementation
146 * @internal
147 */
148 void killTimers() {
149 QObject::killTimers();
150 emit stopped();
151 }
152
141private: 153private:
142 QString filename; 154 QString filename;
143 int loopsleft; 155 int loopsleft;
144 int ms; 156 int ms;
145}; 157};
146 158
147#endif 159#endif
148 160
161
162/*
163 * @internal
164 * Using sender() when the slot is called is unsafe!
165 *
166 * @param snd instance
167 * @param obj The QObject to be called
168 * @param slot connect SIGNAL(stopped()) to slot
169 */
170void register_qpe_sound_finished( Sound* snd, QObject* obj, const char* slot ) {
171#ifndef QT_NO_SOUND
172 QObject::connect(snd->d, SIGNAL(stopped()), obj, slot );
173#endif
174}
175
149/*! Opens a wave sound file \a name for playing 176/*! Opens a wave sound file \a name for playing
150 * Resource is used for finding the file 177 * Resource is used for finding the file
151 **/ 178 **/
152Sound::Sound(const QString& name) 179Sound::Sound(const QString& name)
153{ 180{
154#ifndef QT_NO_SOUND 181#ifndef QT_NO_SOUND
155 d = new SoundData(name); 182 d = new SoundData(name);
156#endif 183#endif
157} 184}
158 185
159/*! Destroys the sound */ 186/*! Destroys the sound */
160Sound::~Sound() 187Sound::~Sound()
161{ 188{
162#ifndef QT_NO_SOUND 189#ifndef QT_NO_SOUND
163 delete d; 190 delete d;
164#endif 191#endif
165} 192}
166 193
167/*! Play the sound once */ 194/*! Play the sound once */
168void Sound::play() 195void Sound::play()
169{ 196{
170#ifndef QT_NO_SOUND 197#ifndef QT_NO_SOUND
198 d->killTimers();
171 d->playLoop(1); 199 d->playLoop(1);
172#endif 200#endif
173} 201}
174 202
175/*! Play the sound, repeatedly until stop() is called */ 203/*! Play the sound, repeatedly until stop() is called */
176void Sound::playLoop() 204void Sound::playLoop()
177{ 205{
178#ifndef QT_NO_SOUND 206#ifndef QT_NO_SOUND
179 d->killTimers(); 207 d->killTimers();
180 d->playLoop(); 208 d->playLoop();
181#endif 209#endif
182} 210}
183 211
184/*! Do not repeat the sound after it finishes. This will end a playLoop() */ 212/*! Do not repeat the sound after it finishes. This will end a playLoop() */
185void Sound::stop() 213void Sound::stop()
186{ 214{
@@ -207,16 +235,19 @@ void Sound::soundAlarm()
207 QCopEnvelope( "QPE/TaskBar", "soundAlarm()" ); 235 QCopEnvelope( "QPE/TaskBar", "soundAlarm()" );
208#endif 236#endif
209} 237}
210 238
211 239
212/*! \class Sound 240/*! \class Sound
213 \brief The Sound class plays WAVE sound files and can invoke the audible alarm. 241 \brief The Sound class plays WAVE sound files and can invoke the audible alarm.
214 242
215 The Sound class is constructed with the .wav music file name. The Sound 243 The Sound class is constructed with the .wav music file name. The Sound
216 class retrieves the sound file from the shared Resource class. This class 244 class retrieves the sound file from the shared Resource class. This class
217 ties together QSound and the available sound resources. 245 ties together QSound and the available sound resources.
218 246
219 To sound an audible system alarm, call the static method soundAlarm() 247 To sound an audible system alarm, call the static method soundAlarm()
220 248
221 \ingroup qtopiaemb 249 \ingroup qtopiaemb
222*/ 250*/
251
252
253#include "sound.moc"
diff --git a/library/sound.h b/library/sound.h
index 9f35107..daef70f 100644
--- a/library/sound.h
+++ b/library/sound.h
@@ -9,34 +9,36 @@
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#ifndef SOUND_H 20#ifndef SOUND_H
21#define SOUND_H 21#define SOUND_H
22 22
23class QString; 23class QString;
24class SoundData; 24class SoundData;
25class QObject;
25 26
26class Sound { 27class Sound {
28 /*INTERNAL*/ friend void register_qpe_sound_finished( Sound*, QObject *obj, const char* slot);
27public: 29public:
28 Sound(const QString& name); 30 Sound(const QString& name);
29 ~Sound(); 31 ~Sound();
30 32
31 void play(); 33 void play();
32 void playLoop(); 34 void playLoop();
33 void stop(); 35 void stop();
34 36
35 bool isFinished ( ) const; 37 bool isFinished ( ) const;
36 38
37 static void soundAlarm(); 39 static void soundAlarm();
38 //static void soundClick(); 40 //static void soundClick();
39 //static void soundTap(); 41 //static void soundTap();
40 42
41private: 43private:
42 SoundData* d; 44 SoundData* d;