summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/loopcontrol.cpp
authorllornkcor <llornkcor>2002-06-17 12:54:54 (UTC)
committer llornkcor <llornkcor>2002-06-17 12:54:54 (UTC)
commit282007e58a8a038a0db042341528510e73ac80fc (patch) (unidiff)
treef1a16c9a6a380bdc4217e9f92ac6ef6128d10717 /core/multimedia/opieplayer/loopcontrol.cpp
parent2917d7481dc8c1b053e3212a699e64948a90ec4c (diff)
downloadopie-282007e58a8a038a0db042341528510e73ac80fc.zip
opie-282007e58a8a038a0db042341528510e73ac80fc.tar.gz
opie-282007e58a8a038a0db042341528510e73ac80fc.tar.bz2
fixes for goofy crap going on
Diffstat (limited to 'core/multimedia/opieplayer/loopcontrol.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp384
1 files changed, 193 insertions, 191 deletions
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index 3171c4b..70e4a78 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -1,25 +1,25 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000 Trolltech AS. All rights reserved. 2 ** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3 **
4** This file is part of Qtopia Environment. 4 ** This file is part of Qtopia Environment.
5** 5 **
6** This file may be distributed and/or modified under the terms of the 6 ** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7 ** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8 ** Foundation and appearing in the file LICENSE.GPL included in the
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// L.J.Potter added changes Fri 02-15-2002 20// L.J.Potter added changes Fri 02-15-2002
21 21
22#include <qpe/qpeapplication.h> 22#include <qpe/qpeapplication.h>
23 23
24#ifdef Q_WS_QWS 24#ifdef Q_WS_QWS
25#include <qpe/qcopenvelope_qws.h> 25#include <qpe/qcopenvelope_qws.h>
@@ -56,68 +56,68 @@ pthread_attr_t audio_attr;
56bool threadOkToGo = FALSE; 56bool threadOkToGo = FALSE;
57 57
58 58
59class Mutex { 59class Mutex {
60public: 60public:
61 Mutex() { 61 Mutex() {
62 pthread_mutexattr_t attr; 62 pthread_mutexattr_t attr;
63 pthread_mutexattr_init( &attr ); 63 pthread_mutexattr_init( &attr );
64 pthread_mutex_init( &mutex, &attr ); 64 pthread_mutex_init( &mutex, &attr );
65 pthread_mutexattr_destroy( &attr ); 65 pthread_mutexattr_destroy( &attr );
66 } 66 }
67 67
68 ~Mutex() { 68 ~Mutex() {
69 pthread_mutex_destroy( &mutex ); 69 pthread_mutex_destroy( &mutex );
70 } 70 }
71 71
72 void lock() { 72 void lock() {
73 pthread_mutex_lock( &mutex ); 73 pthread_mutex_lock( &mutex );
74 } 74 }
75 75
76 void unlock() { 76 void unlock() {
77 pthread_mutex_unlock( &mutex ); 77 pthread_mutex_unlock( &mutex );
78 } 78 }
79private: 79private:
80 pthread_mutex_t mutex; 80 pthread_mutex_t mutex;
81}; 81};
82 82
83 83
84void *startAudioThread( void *ptr ) { 84void *startAudioThread( void *ptr ) {
85 LoopControl *mpegView = (LoopControl *)ptr; 85 LoopControl *mpegView = (LoopControl *)ptr;
86 while ( TRUE ) { 86 while ( TRUE ) {
87 if ( threadOkToGo && mpegView->moreAudio ) 87 if ( threadOkToGo && mpegView->moreAudio )
88 mpegView->startAudio(); 88 mpegView->startAudio();
89 else 89 else
90 usleep( 10000 ); // Semi-buzy-wait till we are playing again 90 usleep( 10000 ); // Semi-buzy-wait till we are playing again
91 } 91 }
92 return 0; 92 return 0;
93} 93}
94 94
95 95
96Mutex *audioMutex; 96Mutex *audioMutex;
97 97
98 98
99LoopControl::LoopControl( QObject *parent, const char *name ) 99LoopControl::LoopControl( QObject *parent, const char *name )
100 : QObject( parent, name ) { 100 : QObject( parent, name ) {
101 isMuted = FALSE; 101 isMuted = FALSE;
102 connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( setMute(bool) ) ); 102 connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( setMute(bool) ) );
103//qDebug("starting loopcontrol"); 103//qDebug("starting loopcontrol");
104 audioMutex = new Mutex; 104 audioMutex = new Mutex;
105 105
106 pthread_attr_init(&audio_attr); 106 pthread_attr_init(&audio_attr);
107#define USE_REALTIME_AUDIO_THREAD 107#define USE_REALTIME_AUDIO_THREAD
108#ifdef USE_REALTIME_AUDIO_THREAD 108#ifdef USE_REALTIME_AUDIO_THREAD
109 // Attempt to set it to real-time round robin 109 // Attempt to set it to real-time round robin
110 if ( pthread_attr_setschedpolicy( &audio_attr, SCHED_RR ) == 0 ) { 110 if ( pthread_attr_setschedpolicy( &audio_attr, SCHED_RR ) == 0 ) {
111 sched_param params; 111 sched_param params;
112 params.sched_priority = 50; 112 params.sched_priority = 50;
113 pthread_attr_setschedparam(&audio_attr,&params); 113 pthread_attr_setschedparam(&audio_attr,&params);
114 } else { 114 } else {
115 qDebug( "Error setting up a realtime thread, reverting to using a normal thread." ); 115 qDebug( "Error setting up a realtime thread, reverting to using a normal thread." );
116 pthread_attr_destroy(&audio_attr); 116 pthread_attr_destroy(&audio_attr);
117 pthread_attr_init(&audio_attr); 117 pthread_attr_init(&audio_attr);
118 } 118 }
119#endif 119#endif
120//qDebug("create audio thread"); 120//qDebug("create audio thread");
121 pthread_create(&audio_tid, &audio_attr, (void * (*)(void *))startAudioThread, this); 121 pthread_create(&audio_tid, &audio_attr, (void * (*)(void *))startAudioThread, this);
122} 122}
123 123
@@ -131,149 +131,148 @@ static long prev_frame = 0;
131static int currentSample = 0; 131static int currentSample = 0;
132 132
133 133
134void LoopControl::timerEvent( QTimerEvent *te ) { 134void LoopControl::timerEvent( QTimerEvent *te ) {
135 135
136 if ( te->timerId() == videoId ) 136 if ( te->timerId() == videoId )
137 startVideo(); 137 startVideo();
138 138
139 if ( te->timerId() == sliderId ) { 139 if ( te->timerId() == sliderId ) {
140 if ( hasAudioChannel && !hasVideoChannel && moreAudio ) { 140 if ( hasAudioChannel && !hasVideoChannel && moreAudio ) {
141 mediaPlayerState->updatePosition( audioSampleCounter ); 141 mediaPlayerState->updatePosition( audioSampleCounter );
142 } else if ( hasVideoChannel && moreVideo ) { 142 } else if ( hasVideoChannel && moreVideo ) {
143 mediaPlayerState->updatePosition( current_frame ); 143 mediaPlayerState->updatePosition( current_frame );
144 } 144 }
145 } 145 }
146 146
147 if ( !moreVideo && !moreAudio ) { 147 if ( !moreVideo && !moreAudio ) {
148 mediaPlayerState->setPlaying( FALSE ); 148 mediaPlayerState->setPlaying( FALSE );
149 mediaPlayerState->setNext(); 149 mediaPlayerState->setNext();
150 } 150 }
151} 151}
152 152
153 153
154void LoopControl::setPosition( long pos ) { 154void LoopControl::setPosition( long pos ) {
155 audioMutex->lock(); 155 audioMutex->lock();
156 156// qDebug("Loop control %d", pos);
157 if ( hasVideoChannel && hasAudioChannel ) { 157 if ( hasVideoChannel && hasAudioChannel ) {
158 playtime.restart(); 158 playtime.restart();
159 playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) ); 159 playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) );
160 current_frame = pos + 1; 160 current_frame = pos + 1;
161 mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); 161 mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
162 prev_frame = current_frame - 1; 162 prev_frame = current_frame - 1;
163 currentSample = (int)( (double)current_frame * freq / framerate ); 163 currentSample = (int)( (double)current_frame * freq / framerate );
164 mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream ); 164 mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream );
165 audioSampleCounter = currentSample - 1; 165 audioSampleCounter = currentSample - 1;
166 } else if ( hasVideoChannel ) { 166 } else if ( hasVideoChannel ) {
167 playtime.restart(); 167 playtime.restart();
168 playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) ); 168 playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) );
169 current_frame = pos + 1; 169 current_frame = pos + 1;
170 mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); 170 mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
171 prev_frame = current_frame - 1; 171 prev_frame = current_frame - 1;
172 } else if ( hasAudioChannel ) { 172 } else if ( hasAudioChannel ) {
173 playtime.restart(); 173 playtime.restart();
174 playtime = playtime.addMSecs( long((double)-pos * 1000.0 / freq) ); 174 playtime = playtime.addMSecs( long((double)-pos * 1000.0 / freq) );
175 currentSample = pos + 1; 175 currentSample = pos + 1;
176 mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream ); 176 mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream );
177 audioSampleCounter = currentSample - 1; 177 audioSampleCounter = currentSample - 1;
178 } 178 }
179 179
180 audioMutex->unlock(); 180 audioMutex->unlock();
181} 181}
182 182
183 183
184void LoopControl::startVideo() { 184void LoopControl::startVideo() {
185 185
186 if ( moreVideo ) { 186 if ( moreVideo ) {
187 187
188 if ( mediaPlayerState->curDecoder() ) { 188 if ( mediaPlayerState->curDecoder() ) {
189 189
190 if ( hasAudioChannel && !isMuted ) { 190 if ( hasAudioChannel && !isMuted ) {
191 191
192 current_frame = long( playtime.elapsed() * framerate / 1000 ); 192 current_frame = long( playtime.elapsed() * framerate / 1000 );
193 193
194 if ( prev_frame != -1 && current_frame <= prev_frame ) 194 if ( prev_frame != -1 && current_frame <= prev_frame )
195 return; 195 return;
196 196
197 } else { 197 } else {
198 // Don't skip 198 // Don't skip
199 current_frame++; 199 current_frame++;
200 } 200 }
201 201
202 if ( prev_frame == -1 || current_frame > prev_frame ) { 202 if ( prev_frame == -1 || current_frame > prev_frame ) {
203 if ( current_frame > prev_frame + 1 ) { 203 if ( current_frame > prev_frame + 1 ) {
204 mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); 204 mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
205 } 205 }
206 moreVideo = videoUI->playVideo(); 206 moreVideo = videoUI->playVideo();
207 prev_frame = current_frame; 207 prev_frame = current_frame;
208 } 208 }
209 209
210 } else { 210 } else {
211 211
212 moreVideo = FALSE; 212 moreVideo = FALSE;
213 killTimer( videoId ); 213 killTimer( videoId );
214 214
215 } 215 }
216 216
217 } 217 }
218} 218}
219 219
220 220
221void LoopControl::startAudio() { 221void LoopControl::startAudio() {
222 222
223//qDebug("start audio");
224 audioMutex->lock(); 223 audioMutex->lock();
225 if ( moreAudio ) { 224 if ( moreAudio ) {
226 225
227 if ( !isMuted && mediaPlayerState->curDecoder() ) { 226 if ( !isMuted && mediaPlayerState->curDecoder() ) {
228 227
229 currentSample = audioSampleCounter + 1; 228 currentSample = audioSampleCounter + 1;
230 229
231 if ( currentSample != audioSampleCounter + 1 ) 230 if ( currentSample != audioSampleCounter + 1 )
232 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter); 231 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter);
233 232
234 long samplesRead = 0; 233 long samplesRead = 0;
235 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream ); 234 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream );
236 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000; 235 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000;
237 long sampleWaitTime = currentSample - sampleWeShouldBeAt; 236 long sampleWaitTime = currentSample - sampleWeShouldBeAt;
238 237
239// this causes drop outs not sure why its even here 238// this causes drop outs not sure why its even here
240 if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) { 239// if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) {
241 usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) ); 240// usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) );
242 } 241// }
243 else if ( sampleWaitTime <= -5000 ) { 242// else if ( sampleWaitTime <= -5000 ) {
244 qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt ); 243// qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt );
245// //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream ); 244// // //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream );
246 currentSample = sampleWeShouldBeAt; 245// currentSample = sampleWeShouldBeAt;
247 } 246// }
248 247
249 audioDevice->write( audioBuffer, samplesRead * 2 * channels ); 248 audioDevice->write( audioBuffer, samplesRead * 2 * channels );
250 249
251 if( mediaPlayerState->isStreaming == FALSE) 250 if( mediaPlayerState->isStreaming == FALSE)
252 audioSampleCounter = currentSample + samplesRead - 1; 251 audioSampleCounter = currentSample + samplesRead - 1;
253 252
254 moreAudio = readOk && (audioSampleCounter <= total_audio_samples); 253 moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
255 254
256 } else { 255 } else {
257 256
258 moreAudio = FALSE; 257 moreAudio = FALSE;
259 258
260 } 259 }
261 260
262 } 261 }
263 262
264 audioMutex->unlock(); 263 audioMutex->unlock();
265} 264}
266 265
267 266
268void LoopControl::killTimers() { 267void LoopControl::killTimers() {
269 268
270 audioMutex->lock(); 269 audioMutex->lock();
271 270
272 if ( hasVideoChannel ) 271 if ( hasVideoChannel )
273 killTimer( videoId ); 272 killTimer( videoId );
274 killTimer( sliderId ); 273 killTimer( sliderId );
275 threadOkToGo = FALSE; 274 threadOkToGo = FALSE;
276 275
277 audioMutex->unlock(); 276 audioMutex->unlock();
278} 277}
279 278
@@ -283,159 +282,160 @@ void LoopControl::startTimers() {
283 audioMutex->lock(); 282 audioMutex->lock();
284 283
285 moreVideo = FALSE; 284 moreVideo = FALSE;
286 moreAudio = FALSE; 285 moreAudio = FALSE;
287 286
288 if ( hasVideoChannel ) { 287 if ( hasVideoChannel ) {
289 moreVideo = TRUE; 288 moreVideo = TRUE;
290 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value 289 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
291 videoId = startTimer( mSecsBetweenFrames ); 290 videoId = startTimer( mSecsBetweenFrames );
292 } 291 }
293 292
294 if ( hasAudioChannel ) { 293 if ( hasAudioChannel ) {
295 moreAudio = TRUE; 294 moreAudio = TRUE;
296 threadOkToGo = TRUE; 295 threadOkToGo = TRUE;
297 } 296 }
298 297
299 sliderId = startTimer( 300 ); // update slider every 1/3 second 298 sliderId = startTimer( 300 ); // update slider every 1/3 second
300 299
301 audioMutex->unlock(); 300 audioMutex->unlock();
302} 301}
303 302
304 303
305void LoopControl::setPaused( bool pause ) { 304void LoopControl::setPaused( bool pause ) {
306 305
307 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) 306 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
308 return; 307 return;
309 308
310 if ( pause ) { 309 if ( pause ) {
311 killTimers(); 310 killTimers();
312 } else { 311 } else {
313 // Force an update of the position 312 // Force an update of the position
314 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 313 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
315 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 314 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
316 // Just like we never stopped 315 // Just like we never stopped
317 startTimers(); 316 startTimers();
318 } 317 }
319} 318}
320 319
321 320
322void LoopControl::stop( bool willPlayAgainShortly ) { 321void LoopControl::stop( bool willPlayAgainShortly ) {
323 322
324#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 323#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
325 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { 324 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) {
326 disabledSuspendScreenSaver = FALSE; 325 disabledSuspendScreenSaver = FALSE;
327 // Re-enable the suspend mode 326 // Re-enable the suspend mode
328 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 327 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
329 } 328 }
330#endif 329#endif
331 330
332 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { 331 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
333 332
334 killTimers(); 333 killTimers();
335 334
336 audioMutex->lock(); 335 audioMutex->lock();
337 336
338 mediaPlayerState->curDecoder()->close(); 337 mediaPlayerState->curDecoder()->close();
339 338
340 if ( audioDevice ) { 339 if ( audioDevice ) {
341 delete audioDevice; 340 delete audioDevice;
342 delete audioBuffer; 341 delete audioBuffer;
343 audioDevice = 0; 342 audioDevice = 0;
344 audioBuffer = 0; 343 audioBuffer = 0;
345 } 344 }
346
347 audioMutex->unlock();
348 345
346 audioMutex->unlock();
349 } 347 }
348 audioSampleCounter=0;
349 current_frame=0;
350 total_audio_samples=0;
350} 351}
351 352
352 353
353bool LoopControl::init( const QString& filename ) { 354bool LoopControl::init( const QString& filename ) {
354 stop(); 355 stop();
355
356 audioMutex->lock(); 356 audioMutex->lock();
357 357
358 fileName = filename; 358 fileName = filename;
359 stream = 0; // only play stream 0 for now 359 stream = 0; // only play stream 0 for now
360 current_frame = total_video_frames = total_audio_samples = 0; 360 current_frame = total_video_frames = total_audio_samples = 0;
361 361
362 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); 362 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() );
363 363
364 // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin 364 // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin
365 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) { 365 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) {
366 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) { 366 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) {
367 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); 367 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 );
368 mediaPlayerState->libMpeg3Decoder()->close(); 368 mediaPlayerState->libMpeg3Decoder()->close();
369 } 369 }
370 } 370 }
371 371
372 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { 372 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) {
373 audioMutex->unlock(); 373 audioMutex->unlock();
374 return FALSE; 374 return FALSE;
375 } 375 }
376 376
377 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; 377 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0;
378 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; 378 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;
379 379
380 if ( hasAudioChannel ) { 380 if ( hasAudioChannel ) {
381 int astream = 0; 381 int astream = 0;
382 382
383 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") ) 383 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") )
384 channels = 2; //dont akx me why, but it needs this hack 384 channels = 2; //dont akx me why, but it needs this hack
385 else 385 else
386 channels = mediaPlayerState->curDecoder()->audioChannels( astream ); 386 channels = mediaPlayerState->curDecoder()->audioChannels( astream );
387 387
388 qDebug( "LC- channels = %d", channels ); 388 qDebug( "LC- channels = %d", channels );
389 389
390 if ( !total_audio_samples ) 390 if ( !total_audio_samples )
391 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); 391 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
392 392
393 total_audio_samples += 1000; 393 total_audio_samples += 1000;
394 394
395 mediaPlayerState->setLength( total_audio_samples ); 395 mediaPlayerState->setLength( total_audio_samples );
396 396
397 freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); 397 freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
398 qDebug( "LC- frequency = %d", freq ); 398 qDebug( "LC- frequency = %d", freq );
399 399
400 audioSampleCounter = 0; 400 audioSampleCounter = 0;
401 int bits_per_sample; 401 int bits_per_sample;
402 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { 402 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
403 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); 403 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
404 qDebug("using stupid hack"); 404 qDebug("using stupid hack");
405 } else { 405 } else {
406 bits_per_sample=0; 406 bits_per_sample=0;
407 } 407 }
408 408
409 audioDevice = new AudioDevice( freq, channels, bits_per_sample); 409 audioDevice = new AudioDevice( freq, channels, bits_per_sample);
410 audioBuffer = new char[ audioDevice->bufferSize() ]; 410 audioBuffer = new char[ audioDevice->bufferSize() ];
411 channels = audioDevice->channels(); 411 channels = audioDevice->channels();
412 412
413 //### must check which frequency is actually used. 413 //### must check which frequency is actually used.
414 static const int size = 1; 414 static const int size = 1;
415 short int buf[size]; 415 short int buf[size];
416 long samplesRead = 0; 416 long samplesRead = 0;
417 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); 417 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
418 } 418 }
419 419
420 if ( hasVideoChannel ) { 420 if ( hasVideoChannel ) {
421 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); 421 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
422 422
423 mediaPlayerState->setLength( total_video_frames ); 423 mediaPlayerState->setLength( total_video_frames );
424 424
425 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); 425 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
426 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); 426 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
427 427
428 if ( framerate <= 1.0 ) { 428 if ( framerate <= 1.0 ) {
429 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); 429 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
430 framerate = 25; 430 framerate = 25;
431 } 431 }
432 432
433 if ( total_video_frames == 1 ) { 433 if ( total_video_frames == 1 ) {
434 DecodeLoopDebug(( "Cannot seek to frame" )); 434 DecodeLoopDebug(( "Cannot seek to frame" ));
435 } 435 }
436 436
437 } 437 }
438 438
439 current_frame = 0; 439 current_frame = 0;
440 prev_frame = -1; 440 prev_frame = -1;
441 441
@@ -447,35 +447,37 @@ bool LoopControl::init( const QString& filename ) {
447 return TRUE; 447 return TRUE;
448} 448}
449 449
450 450
451void LoopControl::play() { 451void LoopControl::play() {
452 qDebug("LC- play"); 452 qDebug("LC- play");
453 mediaPlayerState->setPosition( 0); //uglyhack
454
453#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 455#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
454 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { 456 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) {
455 disabledSuspendScreenSaver = TRUE; 457 disabledSuspendScreenSaver = TRUE;
456 previousSuspendMode = hasVideoChannel; 458 previousSuspendMode = hasVideoChannel;
457 // Stop the screen from blanking and power saving state 459 // Stop the screen from blanking and power saving state
458 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) 460 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" )
459 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); 461 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend );
460 } 462 }
461#endif 463#endif
462 464
463 playtime.start(); 465 playtime.start();
464 startTimers(); 466 startTimers();
465} 467}
466 468
467 469
468void LoopControl::setMute( bool on ) { 470void LoopControl::setMute( bool on ) {
469 if ( on != isMuted ) { 471 if ( on != isMuted ) {
470 isMuted = on; 472 isMuted = on;
471 if ( !on ) { 473 if ( !on ) {
472 // Force an update of the position 474 // Force an update of the position
473 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 475 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
474 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 476 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
475 // Resume playing audio 477 // Resume playing audio
476 moreAudio = TRUE; 478 moreAudio = TRUE;
477 } 479 }
478 } 480 }
479} 481}
480 482
481 483