summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2002-04-21 03:39:22 (UTC)
committer llornkcor <llornkcor>2002-04-21 03:39:22 (UTC)
commite22eee22120129209bf91c91bd3176f977c75493 (patch) (unidiff)
treed11225387cde06f3c22019f7ea6837b4a2d1ffe7
parent6818807a46b80774de328b4c3001d4bc9d788666 (diff)
downloadopie-e22eee22120129209bf91c91bd3176f977c75493.zip
opie-e22eee22120129209bf91c91bd3176f977c75493.tar.gz
opie-e22eee22120129209bf91c91bd3176f977c75493.tar.bz2
REALLY fixed when playing stream..., stopped stream
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index 45c2d3e..15175d0 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -1,478 +1,480 @@
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>
26#endif 26#endif
27#include <stdio.h> 27#include <stdio.h>
28#include <stdlib.h> 28#include <stdlib.h>
29#include <string.h> 29#include <string.h>
30#include <pthread.h> 30#include <pthread.h>
31#include <errno.h> 31#include <errno.h>
32#include <unistd.h> 32#include <unistd.h>
33#include "loopcontrol.h" 33#include "loopcontrol.h"
34#include "videowidget.h" 34#include "videowidget.h"
35#include "audiodevice.h" 35#include "audiodevice.h"
36#include <qpe/mediaplayerplugininterface.h> 36#include <qpe/mediaplayerplugininterface.h>
37#include "mediaplayerstate.h" 37#include "mediaplayerstate.h"
38 38
39 39
40extern VideoWidget *videoUI; // now only needed to tell it to play a frame 40extern VideoWidget *videoUI; // now only needed to tell it to play a frame
41extern MediaPlayerState *mediaPlayerState; 41extern MediaPlayerState *mediaPlayerState;
42 42
43 43
44//#define DecodeLoopDebug(x) qDebug x 44//#define DecodeLoopDebug(x) qDebug x
45#define DecodeLoopDebug(x) 45#define DecodeLoopDebug(x)
46 46
47 47
48static char *audioBuffer = NULL; 48static char *audioBuffer = NULL;
49static AudioDevice *audioDevice = NULL; 49static AudioDevice *audioDevice = NULL;
50static bool disabledSuspendScreenSaver = FALSE; 50static bool disabledSuspendScreenSaver = FALSE;
51static bool previousSuspendMode = FALSE; 51static bool previousSuspendMode = FALSE;
52 52
53 53
54pthread_t audio_tid; 54pthread_t audio_tid;
55pthread_attr_t audio_attr; 55pthread_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
124 124
125LoopControl::~LoopControl() { 125LoopControl::~LoopControl() {
126 stop(); 126 stop();
127} 127}
128 128
129 129
130static long prev_frame = 0; 130static 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
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"); 223//qDebug("start audio");
224 audioMutex->lock(); 224 audioMutex->lock();
225 if ( moreAudio ) { 225 if ( moreAudio ) {
226 226
227 if ( !isMuted && mediaPlayerState->curDecoder() ) { 227 if ( !isMuted && mediaPlayerState->curDecoder() ) {
228 228
229 currentSample = audioSampleCounter + 1; 229 currentSample = audioSampleCounter + 1;
230 230
231 if ( currentSample != audioSampleCounter + 1 ) 231 if ( currentSample != audioSampleCounter + 1 )
232 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter); 232 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter);
233 233
234 long samplesRead = 0; 234 long samplesRead = 0;
235 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream ); 235 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream );
236 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000; 236 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000;
237 long sampleWaitTime = currentSample - sampleWeShouldBeAt; 237 long sampleWaitTime = currentSample - sampleWeShouldBeAt;
238 238
239// this causes drop outs not sure why its even here 239// this causes drop outs not sure why its even here
240// if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) { 240// if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) {
241// usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) ); 241// usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) );
242// } 242// }
243// else if ( sampleWaitTime <= -5000 ) { 243// else if ( sampleWaitTime <= -5000 ) {
244// qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt ); 244// qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt );
245// //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream ); 245// //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream );
246// currentSample = sampleWeShouldBeAt; 246// currentSample = sampleWeShouldBeAt;
247// } 247// }
248 248
249 audioDevice->write( audioBuffer, samplesRead * 2 * channels ); 249 audioDevice->write( audioBuffer, samplesRead * 2 * channels );
250 if( mediaPlayerState->isStreaming == FALSE);
251
250 audioSampleCounter = currentSample + samplesRead - 1; 252 audioSampleCounter = currentSample + samplesRead - 1;
251 253
252 moreAudio = readOk && (audioSampleCounter <= total_audio_samples); 254 moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
253 255
254 } else { 256 } else {
255 257
256 moreAudio = FALSE; 258 moreAudio = FALSE;
257 259
258 } 260 }
259 261
260 } 262 }
261 263
262 audioMutex->unlock(); 264 audioMutex->unlock();
263} 265}
264 266
265 267
266void LoopControl::killTimers() { 268void LoopControl::killTimers() {
267 269
268 audioMutex->lock(); 270 audioMutex->lock();
269 271
270 if ( hasVideoChannel ) 272 if ( hasVideoChannel )
271 killTimer( videoId ); 273 killTimer( videoId );
272 killTimer( sliderId ); 274 killTimer( sliderId );
273 threadOkToGo = FALSE; 275 threadOkToGo = FALSE;
274 276
275 audioMutex->unlock(); 277 audioMutex->unlock();
276} 278}
277 279
278 280
279void LoopControl::startTimers() { 281void LoopControl::startTimers() {
280 282
281 audioMutex->lock(); 283 audioMutex->lock();
282 284
283 moreVideo = FALSE; 285 moreVideo = FALSE;
284 moreAudio = FALSE; 286 moreAudio = FALSE;
285 287
286 if ( hasVideoChannel ) { 288 if ( hasVideoChannel ) {
287 moreVideo = TRUE; 289 moreVideo = TRUE;
288 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value 290 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
289 videoId = startTimer( mSecsBetweenFrames ); 291 videoId = startTimer( mSecsBetweenFrames );
290 } 292 }
291 293
292 if ( hasAudioChannel ) { 294 if ( hasAudioChannel ) {
293 moreAudio = TRUE; 295 moreAudio = TRUE;
294 threadOkToGo = TRUE; 296 threadOkToGo = TRUE;
295 } 297 }
296 298
297 sliderId = startTimer( 300 ); // update slider every 1/3 second 299 sliderId = startTimer( 300 ); // update slider every 1/3 second
298 300
299 audioMutex->unlock(); 301 audioMutex->unlock();
300} 302}
301 303
302 304
303void LoopControl::setPaused( bool pause ) { 305void LoopControl::setPaused( bool pause ) {
304 306
305 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) 307 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
306 return; 308 return;
307 309
308 if ( pause ) { 310 if ( pause ) {
309 killTimers(); 311 killTimers();
310 } else { 312 } else {
311 // Force an update of the position 313 // Force an update of the position
312 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 314 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
313 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 315 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
314 // Just like we never stopped 316 // Just like we never stopped
315 startTimers(); 317 startTimers();
316 } 318 }
317} 319}
318 320
319 321
320void LoopControl::stop( bool willPlayAgainShortly ) { 322void LoopControl::stop( bool willPlayAgainShortly ) {
321 323
322#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 324#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
323 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { 325 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) {
324 disabledSuspendScreenSaver = FALSE; 326 disabledSuspendScreenSaver = FALSE;
325 // Re-enable the suspend mode 327 // Re-enable the suspend mode
326 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 328 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
327 } 329 }
328#endif 330#endif
329 331
330 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { 332 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
331 333
332 killTimers(); 334 killTimers();
333 335
334 audioMutex->lock(); 336 audioMutex->lock();
335 337
336 mediaPlayerState->curDecoder()->close(); 338 mediaPlayerState->curDecoder()->close();
337 339
338 if ( audioDevice ) { 340 if ( audioDevice ) {
339 delete audioDevice; 341 delete audioDevice;
340 delete audioBuffer; 342 delete audioBuffer;
341 audioDevice = 0; 343 audioDevice = 0;
342 audioBuffer = 0; 344 audioBuffer = 0;
343 } 345 }
344 346
345 audioMutex->unlock(); 347 audioMutex->unlock();
346 348
347 } 349 }
348} 350}
349 351
350 352
351bool LoopControl::init( const QString& filename ) { 353bool LoopControl::init( const QString& filename ) {
352 stop(); 354 stop();
353 355
354 audioMutex->lock(); 356 audioMutex->lock();
355 357
356 fileName = filename; 358 fileName = filename;
357 stream = 0; // only play stream 0 for now 359 stream = 0; // only play stream 0 for now
358 current_frame = total_video_frames = total_audio_samples = 0; 360 current_frame = total_video_frames = total_audio_samples = 0;
359 361
360 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); 362 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() );
361 363
362 // ### 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
363 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) { 365 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) {
364 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename ) ) { 366 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename ) ) {
365 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); 367 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 );
366 mediaPlayerState->libMpeg3Decoder()->close(); 368 mediaPlayerState->libMpeg3Decoder()->close();
367 } 369 }
368 } 370 }
369 371
370 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { 372 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) {
371 audioMutex->unlock(); 373 audioMutex->unlock();
372 return FALSE; 374 return FALSE;
373 } 375 }
374 376
375 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; 377 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0;
376 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; 378 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;
377 379
378 if ( hasAudioChannel ) { 380 if ( hasAudioChannel ) {
379 int astream = 0; 381 int astream = 0;
380 382
381 channels = mediaPlayerState->curDecoder()->audioChannels( astream ); 383 channels = mediaPlayerState->curDecoder()->audioChannels( astream );
382 qDebug( "LC- channels = %d", channels ); 384 qDebug( "LC- channels = %d", channels );
383 385
384 if ( !total_audio_samples ) 386 if ( !total_audio_samples )
385 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); 387 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
386 388
387// total_audio_samples += 1000; 389// total_audio_samples += 1000;
388 390
389 mediaPlayerState->setLength( total_audio_samples ); 391 mediaPlayerState->setLength( total_audio_samples );
390 392
391 freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); 393 freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
392 qDebug( "LC- frequency = %d", freq ); 394 qDebug( "LC- frequency = %d", freq );
393 395
394 audioSampleCounter = 0; 396 audioSampleCounter = 0;
395 int bits_per_sample; 397 int bits_per_sample;
396 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { 398 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
397 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); 399 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
398 qDebug("using stupid hack"); 400 qDebug("using stupid hack");
399 } else { 401 } else {
400 bits_per_sample=0; 402 bits_per_sample=0;
401 } 403 }
402 404
403 audioDevice = new AudioDevice( freq, channels, bits_per_sample); 405 audioDevice = new AudioDevice( freq, channels, bits_per_sample);
404 audioBuffer = new char[ audioDevice->bufferSize() ]; 406 audioBuffer = new char[ audioDevice->bufferSize() ];
405 channels = audioDevice->channels(); 407 channels = audioDevice->channels();
406 408
407 //### must check which frequency is actually used. 409 //### must check which frequency is actually used.
408 static const int size = 1; 410 static const int size = 1;
409 short int buf[size]; 411 short int buf[size];
410 long samplesRead = 0; 412 long samplesRead = 0;
411 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); 413 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
412 } 414 }
413 415
414 if ( hasVideoChannel ) { 416 if ( hasVideoChannel ) {
415 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); 417 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
416 418
417 mediaPlayerState->setLength( total_video_frames ); 419 mediaPlayerState->setLength( total_video_frames );
418 420
419 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); 421 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
420 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); 422 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
421 423
422 if ( framerate <= 1.0 ) { 424 if ( framerate <= 1.0 ) {
423 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); 425 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
424 framerate = 25; 426 framerate = 25;
425 } 427 }
426 428
427 if ( total_video_frames == 1 ) { 429 if ( total_video_frames == 1 ) {
428 DecodeLoopDebug(( "Cannot seek to frame" )); 430 DecodeLoopDebug(( "Cannot seek to frame" ));
429 } 431 }
430 432
431 } 433 }
432 434
433 current_frame = 0; 435 current_frame = 0;
434 prev_frame = -1; 436 prev_frame = -1;
435 437
436 if( fileName.left(7) == "http://") 438 if( fileName.left(7) == "http://")
437 mediaPlayerState->isStreaming = TRUE; 439 mediaPlayerState->isStreaming = TRUE;
438 440
439 connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) ); 441 connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) );
440 connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) ); 442 connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) );
441 443
442 audioMutex->unlock(); 444 audioMutex->unlock();
443 445
444 return TRUE; 446 return TRUE;
445} 447}
446 448
447 449
448void LoopControl::play() { 450void LoopControl::play() {
449 qDebug("LC- play"); 451 qDebug("LC- play");
450#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 452#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
451 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { 453 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) {
452 disabledSuspendScreenSaver = TRUE; 454 disabledSuspendScreenSaver = TRUE;
453 previousSuspendMode = hasVideoChannel; 455 previousSuspendMode = hasVideoChannel;
454 // Stop the screen from blanking and power saving state 456 // Stop the screen from blanking and power saving state
455 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) 457 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" )
456 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); 458 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend );
457 } 459 }
458#endif 460#endif
459 461
460 playtime.start(); 462 playtime.start();
461 startTimers(); 463 startTimers();
462} 464}
463 465
464 466
465void LoopControl::setMute( bool on ) { 467void LoopControl::setMute( bool on ) {
466 if ( on != isMuted ) { 468 if ( on != isMuted ) {
467 isMuted = on; 469 isMuted = on;
468 if ( !on ) { 470 if ( !on ) {
469 // Force an update of the position 471 // Force an update of the position
470 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 472 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
471 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 473 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
472 // Resume playing audio 474 // Resume playing audio
473 moreAudio = TRUE; 475 moreAudio = TRUE;
474 } 476 }
475 } 477 }
476} 478}
477 479
478 480