summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/loopcontrol.cpp
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/loopcontrol.cpp') (more/less context) (show whitespace changes)
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp39
1 files changed, 19 insertions, 20 deletions
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index dd466ed..90a7cc6 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -1,10 +1,10 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the 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**
@@ -14,27 +14,30 @@
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
21
22
20#include <qpe/qpeapplication.h> 23#include <qpe/qpeapplication.h>
21#ifdef Q_WS_QWS
22 24
25#ifdef Q_WS_QWS
23#include <qpe/qcopenvelope_qws.h> 26#include <qpe/qcopenvelope_qws.h>
24#endif 27#endif
25#include <qpe/mediaplayerplugininterface.h>
26#include <stdio.h> 28#include <stdio.h>
27#include <stdlib.h> 29#include <stdlib.h>
28#include <string.h> 30#include <string.h>
29#include <pthread.h> 31#include <pthread.h>
30#include <errno.h> 32#include <errno.h>
31#include <unistd.h> 33#include <unistd.h>
32#include "loopcontrol.h" 34#include "loopcontrol.h"
33#include "videowidget.h" 35#include "videowidget.h"
34#include "audiodevice.h" 36#include "audiodevice.h"
37#include "mediaplayerplugininterface.h"
35#include "mediaplayerstate.h" 38#include "mediaplayerstate.h"
36 39
37 40
38extern VideoWidget *videoUI; // now only needed to tell it to play a frame 41extern VideoWidget *videoUI; // now only needed to tell it to play a frame
39extern MediaPlayerState *mediaPlayerState; 42extern MediaPlayerState *mediaPlayerState;
40 43
@@ -99,30 +102,25 @@ LoopControl::LoopControl( QObject *parent, const char *name )
99 isMuted = FALSE; 102 isMuted = FALSE;
100 connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( setMute(bool) ) ); 103 connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( setMute(bool) ) );
101 104
102 audioMutex = new Mutex; 105 audioMutex = new Mutex;
103 106
104 pthread_attr_init(&audio_attr); 107 pthread_attr_init(&audio_attr);
105 108#define USE_REALTIME_AUDIO_THREAD
106 if ( getuid() == 0 ) { 109#ifdef USE_REALTIME_AUDIO_THREAD
107 printf("true, guid = %i\n", getuid());
108
109 // Attempt to set it to real-time round robin 110 // Attempt to set it to real-time round robin
110 if ( pthread_attr_setschedpolicy( &audio_attr, SCHED_RR ) == 0 ) { 111 if ( pthread_attr_setschedpolicy( &audio_attr, SCHED_RR ) == 0 ) {
111 sched_param params; 112 sched_param params;
112 params.sched_priority = 50; 113 params.sched_priority = 50;
113 pthread_attr_setschedparam(&audio_attr,&params); 114 pthread_attr_setschedparam(&audio_attr,&params);
114 } else { 115 } else {
115 qDebug( "Error setting up a realtime thread, reverting to using a normal thread." ); 116 qDebug( "Error setting up a realtime thread, reverting to using a normal thread." );
116 pthread_attr_destroy(&audio_attr); 117 pthread_attr_destroy(&audio_attr);
117 pthread_attr_init(&audio_attr); 118 pthread_attr_init(&audio_attr);
118 } 119 }
119 } 120#endif
120// printf("false, guid = %i\n", getuid());
121 usleep( 100 );
122
123 pthread_create(&audio_tid, &audio_attr, (void * (*)(void *))startAudioThread, this); 121 pthread_create(&audio_tid, &audio_attr, (void * (*)(void *))startAudioThread, this);
124} 122}
125 123
126 124
127LoopControl::~LoopControl() { 125LoopControl::~LoopControl() {
128 stop(); 126 stop();
@@ -231,28 +229,29 @@ void LoopControl::startAudio() {
231 currentSample = audioSampleCounter + 1; 229 currentSample = audioSampleCounter + 1;
232 230
233 if ( currentSample != audioSampleCounter + 1 ) 231 if ( currentSample != audioSampleCounter + 1 )
234 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter); 232 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter);
235 233
236 long samplesRead = 0; 234 long samplesRead = 0;
237 mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream ); 235 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream );
238 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000; 236 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000;
239 long sampleWaitTime = currentSample - sampleWeShouldBeAt; 237 long sampleWaitTime = currentSample - sampleWeShouldBeAt;
240 238
241 if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) { 239 if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) {
242 usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) ); 240 usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) );
243 } else if ( sampleWaitTime <= -5000 ) { 241 }
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 audioSampleCounter = currentSample + samplesRead - 1; 249 audioSampleCounter = currentSample + samplesRead - 1;
251 250
252 moreAudio = audioSampleCounter <= total_audio_samples; 251 moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
253 252
254 } else { 253 } else {
255 254
256 moreAudio = FALSE; 255 moreAudio = FALSE;
257 256
258 } 257 }
@@ -376,29 +375,29 @@ bool LoopControl::init( const QString& filename ) {
376 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; 375 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;
377 376
378 if ( hasAudioChannel ) { 377 if ( hasAudioChannel ) {
379 int astream = 0; 378 int astream = 0;
380 379
381 channels = mediaPlayerState->curDecoder()->audioChannels( astream ); 380 channels = mediaPlayerState->curDecoder()->audioChannels( astream );
382 DecodeLoopDebug(( "channels = %d\n", channels )); 381 qDebug( "LC- channels = %d", channels );
383 382
384 if ( !total_audio_samples ) 383 if ( !total_audio_samples )
385 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); 384 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
386 385
387 total_audio_samples += 1000; 386// total_audio_samples += 1000;
388 387
389 mediaPlayerState->setLength( total_audio_samples ); 388 mediaPlayerState->setLength( total_audio_samples );
390 389
391 freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); 390 freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
392 DecodeLoopDebug(( "frequency = %d\n", freq )); 391 qDebug( "LC- frequency = %d", freq );
393 392
394 audioSampleCounter = 0; 393 audioSampleCounter = 0;
395 394
396 static const int bytes_per_sample = 2; //16 bit 395 int bits_per_sample = mediaPlayerState->curDecoder()->audioBitsPerSample( astream);
397 396
398 audioDevice = new AudioDevice( freq, channels, bytes_per_sample ); 397 audioDevice = new AudioDevice( freq, channels, bits_per_sample);
399 audioBuffer = new char[ audioDevice->bufferSize() ]; 398 audioBuffer = new char[ audioDevice->bufferSize() ];
400 channels = audioDevice->channels(); 399 channels = audioDevice->channels();
401 400
402 //### must check which frequency is actually used. 401 //### must check which frequency is actually used.
403 static const int size = 1; 402 static const int size = 1;
404 short int buf[size]; 403 short int buf[size];