summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp18
1 files changed, 10 insertions, 8 deletions
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index 70e4a78..ba14882 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -47,392 +47,394 @@ extern MediaPlayerState *mediaPlayerState;
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// qDebug("Loop control %d", pos); 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 audioMutex->lock(); 223 audioMutex->lock();
224 if ( moreAudio ) { 224 if ( moreAudio ) {
225 225
226 if ( !isMuted && mediaPlayerState->curDecoder() ) { 226 if ( !isMuted && mediaPlayerState->curDecoder() ) {
227 227
228 currentSample = audioSampleCounter + 1; 228 currentSample = audioSampleCounter + 1;
229 229
230 if ( currentSample != audioSampleCounter + 1 ) 230 if ( currentSample != audioSampleCounter + 1 )
231 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter); 231 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter);
232 232
233 long samplesRead = 0; 233 long samplesRead = 0;
234 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream ); 234 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream );
235 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000; 235 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000;
236 long sampleWaitTime = currentSample - sampleWeShouldBeAt; 236 long sampleWaitTime = currentSample - sampleWeShouldBeAt;
237 237
238// this causes drop outs not sure why its even here 238// this causes drop outs not sure why its even here
239// if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) { 239 if ( hasVideoChannel ) {
240// usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) ); 240 if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) {
241// } 241 usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) );
242// else if ( sampleWaitTime <= -5000 ) { 242 }
243// qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt ); 243 else if ( sampleWaitTime <= -5000 ) {
244// // //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream ); 244 qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt );
245// currentSample = sampleWeShouldBeAt; 245 // //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream );
246// } 246 currentSample = sampleWeShouldBeAt;
247 }
248}
247 249
248 audioDevice->write( audioBuffer, samplesRead * 2 * channels ); 250 audioDevice->write( audioBuffer, samplesRead * 2 * channels );
249 251
250 if( mediaPlayerState->isStreaming == FALSE) 252 if( mediaPlayerState->isStreaming == FALSE)
251 audioSampleCounter = currentSample + samplesRead - 1; 253 audioSampleCounter = currentSample + samplesRead - 1;
252 254
253 moreAudio = readOk && (audioSampleCounter <= total_audio_samples); 255 moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
254 256
255 } else { 257 } else {
256 258
257 moreAudio = FALSE; 259 moreAudio = FALSE;
258 260
259 } 261 }
260 262
261 } 263 }
262 264
263 audioMutex->unlock(); 265 audioMutex->unlock();
264} 266}
265 267
266 268
267void LoopControl::killTimers() { 269void LoopControl::killTimers() {
268 270
269 audioMutex->lock(); 271 audioMutex->lock();
270 272
271 if ( hasVideoChannel ) 273 if ( hasVideoChannel )
272 killTimer( videoId ); 274 killTimer( videoId );
273 killTimer( sliderId ); 275 killTimer( sliderId );
274 threadOkToGo = FALSE; 276 threadOkToGo = FALSE;
275 277
276 audioMutex->unlock(); 278 audioMutex->unlock();
277} 279}
278 280
279 281
280void LoopControl::startTimers() { 282void LoopControl::startTimers() {
281 283
282 audioMutex->lock(); 284 audioMutex->lock();
283 285
284 moreVideo = FALSE; 286 moreVideo = FALSE;
285 moreAudio = FALSE; 287 moreAudio = FALSE;
286 288
287 if ( hasVideoChannel ) { 289 if ( hasVideoChannel ) {
288 moreVideo = TRUE; 290 moreVideo = TRUE;
289 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value 291 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
290 videoId = startTimer( mSecsBetweenFrames ); 292 videoId = startTimer( mSecsBetweenFrames );
291 } 293 }
292 294
293 if ( hasAudioChannel ) { 295 if ( hasAudioChannel ) {
294 moreAudio = TRUE; 296 moreAudio = TRUE;
295 threadOkToGo = TRUE; 297 threadOkToGo = TRUE;
296 } 298 }
297 299
298 sliderId = startTimer( 300 ); // update slider every 1/3 second 300 sliderId = startTimer( 300 ); // update slider every 1/3 second
299 301
300 audioMutex->unlock(); 302 audioMutex->unlock();
301} 303}
302 304
303 305
304void LoopControl::setPaused( bool pause ) { 306void LoopControl::setPaused( bool pause ) {
305 307
306 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) 308 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
307 return; 309 return;
308 310
309 if ( pause ) { 311 if ( pause ) {
310 killTimers(); 312 killTimers();
311 } else { 313 } else {
312 // Force an update of the position 314 // Force an update of the position
313 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 315 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
314 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 316 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
315 // Just like we never stopped 317 // Just like we never stopped
316 startTimers(); 318 startTimers();
317 } 319 }
318} 320}
319 321
320 322
321void LoopControl::stop( bool willPlayAgainShortly ) { 323void LoopControl::stop( bool willPlayAgainShortly ) {
322 324
323#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 325#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
324 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { 326 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) {
325 disabledSuspendScreenSaver = FALSE; 327 disabledSuspendScreenSaver = FALSE;
326 // Re-enable the suspend mode 328 // Re-enable the suspend mode
327 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 329 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
328 } 330 }
329#endif 331#endif
330 332
331 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { 333 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
332 334
333 killTimers(); 335 killTimers();
334 336
335 audioMutex->lock(); 337 audioMutex->lock();
336 338
337 mediaPlayerState->curDecoder()->close(); 339 mediaPlayerState->curDecoder()->close();
338 340
339 if ( audioDevice ) { 341 if ( audioDevice ) {
340 delete audioDevice; 342 delete audioDevice;
341 delete audioBuffer; 343 delete audioBuffer;
342 audioDevice = 0; 344 audioDevice = 0;
343 audioBuffer = 0; 345 audioBuffer = 0;
344 } 346 }
345 347
346 audioMutex->unlock(); 348 audioMutex->unlock();
347 } 349 }
348 audioSampleCounter=0; 350 audioSampleCounter=0;
349 current_frame=0; 351 current_frame=0;
350 total_audio_samples=0; 352 total_audio_samples=0;
351} 353}
352 354
353 355
354bool LoopControl::init( const QString& filename ) { 356bool LoopControl::init( const QString& filename ) {
355 stop(); 357 stop();
356 audioMutex->lock(); 358 audioMutex->lock();
357 359
358 fileName = filename; 360 fileName = filename;
359 stream = 0; // only play stream 0 for now 361 stream = 0; // only play stream 0 for now
360 current_frame = total_video_frames = total_audio_samples = 0; 362 current_frame = total_video_frames = total_audio_samples = 0;
361 363
362 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); 364 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() );
363 365
364 // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin 366 // ### 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") ) { 367 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) {
366 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) { 368 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) {
367 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); 369 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 );
368 mediaPlayerState->libMpeg3Decoder()->close(); 370 mediaPlayerState->libMpeg3Decoder()->close();
369 } 371 }
370 } 372 }
371 373
372 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { 374 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) {
373 audioMutex->unlock(); 375 audioMutex->unlock();
374 return FALSE; 376 return FALSE;
375 } 377 }
376 378
377 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; 379 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0;
378 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; 380 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;
379 381
380 if ( hasAudioChannel ) { 382 if ( hasAudioChannel ) {
381 int astream = 0; 383 int astream = 0;
382 384
383 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") ) 385 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") )
384 channels = 2; //dont akx me why, but it needs this hack 386 channels = 2; //dont akx me why, but it needs this hack
385 else 387 else
386 channels = mediaPlayerState->curDecoder()->audioChannels( astream ); 388 channels = mediaPlayerState->curDecoder()->audioChannels( astream );
387 389
388 qDebug( "LC- channels = %d", channels ); 390 qDebug( "LC- channels = %d", channels );
389 391
390 if ( !total_audio_samples ) 392 if ( !total_audio_samples )
391 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); 393 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
392 394
393 total_audio_samples += 1000; 395 total_audio_samples += 1000;
394 396
395 mediaPlayerState->setLength( total_audio_samples ); 397 mediaPlayerState->setLength( total_audio_samples );
396 398
397 freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); 399 freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
398 qDebug( "LC- frequency = %d", freq ); 400 qDebug( "LC- frequency = %d", freq );
399 401
400 audioSampleCounter = 0; 402 audioSampleCounter = 0;
401 int bits_per_sample; 403 int bits_per_sample;
402 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { 404 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
403 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); 405 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
404 qDebug("using stupid hack"); 406 qDebug("using stupid hack");
405 } else { 407 } else {
406 bits_per_sample=0; 408 bits_per_sample=0;
407 } 409 }
408 410
409 audioDevice = new AudioDevice( freq, channels, bits_per_sample); 411 audioDevice = new AudioDevice( freq, channels, bits_per_sample);
410 audioBuffer = new char[ audioDevice->bufferSize() ]; 412 audioBuffer = new char[ audioDevice->bufferSize() ];
411 channels = audioDevice->channels(); 413 channels = audioDevice->channels();
412 414
413 //### must check which frequency is actually used. 415 //### must check which frequency is actually used.
414 static const int size = 1; 416 static const int size = 1;
415 short int buf[size]; 417 short int buf[size];
416 long samplesRead = 0; 418 long samplesRead = 0;
417 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); 419 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
418 } 420 }
419 421
420 if ( hasVideoChannel ) { 422 if ( hasVideoChannel ) {
421 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); 423 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
422 424
423 mediaPlayerState->setLength( total_video_frames ); 425 mediaPlayerState->setLength( total_video_frames );
424 426
425 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); 427 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
426 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); 428 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
427 429
428 if ( framerate <= 1.0 ) { 430 if ( framerate <= 1.0 ) {
429 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); 431 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
430 framerate = 25; 432 framerate = 25;
431 } 433 }
432 434
433 if ( total_video_frames == 1 ) { 435 if ( total_video_frames == 1 ) {
434 DecodeLoopDebug(( "Cannot seek to frame" )); 436 DecodeLoopDebug(( "Cannot seek to frame" ));
435 } 437 }
436 438
437 } 439 }
438 440