summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2003-02-25 23:38:02 (UTC)
committer llornkcor <llornkcor>2003-02-25 23:38:02 (UTC)
commit94cb45ce60cc00d719a802baeb8acf74f42150d2 (patch) (unidiff)
tree27f70d60579a5301f04986e56cf4bfa2067dad9c
parentbde9ed97c92b6f7eefa8a66d9f58aa4c78127733 (diff)
downloadopie-94cb45ce60cc00d719a802baeb8acf74f42150d2.zip
opie-94cb45ce60cc00d719a802baeb8acf74f42150d2.tar.gz
opie-94cb45ce60cc00d719a802baeb8acf74f42150d2.tar.bz2
remove libmad depending on libmpeg3, and fix crash when skin not found
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/audiowidget.cpp12
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp20
2 files changed, 18 insertions, 14 deletions
diff --git a/core/multimedia/opieplayer/audiowidget.cpp b/core/multimedia/opieplayer/audiowidget.cpp
index 9a55608..3dfe182 100644
--- a/core/multimedia/opieplayer/audiowidget.cpp
+++ b/core/multimedia/opieplayer/audiowidget.cpp
@@ -1,473 +1,477 @@
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#include <qpe/qpeapplication.h> 20#include <qpe/qpeapplication.h>
21#include <qpe/resource.h> 21#include <qpe/resource.h>
22#include <qpe/config.h> 22#include <qpe/config.h>
23 23
24#include <qwidget.h> 24#include <qwidget.h>
25#include <qpixmap.h> 25#include <qpixmap.h>
26#include <qbutton.h> 26#include <qbutton.h>
27#include <qpainter.h> 27#include <qpainter.h>
28#include <qframe.h> 28#include <qframe.h>
29#include <qlayout.h> 29#include <qlayout.h>
30 30#include <qdir.h>
31#include "audiowidget.h" 31#include "audiowidget.h"
32#include "mediaplayerstate.h" 32#include "mediaplayerstate.h"
33 33
34#include <stdlib.h> 34#include <stdlib.h>
35#include <stdio.h> 35#include <stdio.h>
36 36
37extern MediaPlayerState *mediaPlayerState; 37extern MediaPlayerState *mediaPlayerState;
38 38
39 39
40static const int xo = -2; // movable x offset 40static const int xo = -2; // movable x offset
41static const int yo = 22; // movable y offset 41static const int yo = 22; // movable y offset
42 42
43struct MediaButton { 43struct MediaButton {
44 bool isToggle, isHeld, isDown; 44 bool isToggle, isHeld, isDown;
45}; 45};
46 46
47//Layout information for the audioButtons (and if it is a toggle button or not) 47//Layout information for the audioButtons (and if it is a toggle button or not)
48MediaButton audioButtons[] = { 48MediaButton audioButtons[] = {
49 { TRUE, FALSE, FALSE }, // play 49 { TRUE, FALSE, FALSE }, // play
50 { FALSE, FALSE, FALSE }, // stop 50 { FALSE, FALSE, FALSE }, // stop
51 { FALSE, FALSE, FALSE }, // next 51 { FALSE, FALSE, FALSE }, // next
52 { FALSE, FALSE, FALSE }, // previous 52 { FALSE, FALSE, FALSE }, // previous
53 { FALSE, FALSE, FALSE }, // volume up 53 { FALSE, FALSE, FALSE }, // volume up
54 { FALSE, FALSE, FALSE }, // volume down 54 { FALSE, FALSE, FALSE }, // volume down
55 { TRUE, FALSE, FALSE }, // repeat/loop 55 { TRUE, FALSE, FALSE }, // repeat/loop
56 { FALSE, FALSE, FALSE }, // playlist 56 { FALSE, FALSE, FALSE }, // playlist
57 { FALSE, FALSE, FALSE }, // forward 57 { FALSE, FALSE, FALSE }, // forward
58 { FALSE, FALSE, FALSE } // back 58 { FALSE, FALSE, FALSE } // back
59}; 59};
60 60
61const char *skin_mask_file_names[10] = { 61const char *skin_mask_file_names[10] = {
62 "play", "stop", "next", "prev", "up", 62 "play", "stop", "next", "prev", "up",
63 "down", "loop", "playlist", "forward", "back" 63 "down", "loop", "playlist", "forward", "back"
64}; 64};
65 65
66static void changeTextColor( QWidget *w ) { 66static void changeTextColor( QWidget *w ) {
67 QPalette p = w->palette(); 67 QPalette p = w->palette();
68 p.setBrush( QColorGroup::Background, QColor( 167, 212, 167 ) ); 68 p.setBrush( QColorGroup::Background, QColor( 167, 212, 167 ) );
69 p.setBrush( QColorGroup::Base, QColor( 167, 212, 167 ) ); 69 p.setBrush( QColorGroup::Base, QColor( 167, 212, 167 ) );
70 w->setPalette( p ); 70 w->setPalette( p );
71} 71}
72 72
73static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton)); 73static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton));
74 74
75AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) : 75AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) :
76 QWidget( parent, name, f ), songInfo( this ), slider( Qt::Horizontal, this ), time( this ) 76 QWidget( parent, name, f ), songInfo( this ), slider( Qt::Horizontal, this ), time( this )
77{ 77{
78 setCaption( tr("OpiePlayer") ); 78 setCaption( tr("OpiePlayer") );
79 qDebug("<<<<<audioWidget"); 79 qDebug("<<<<<audioWidget");
80 80
81 Config cfg("OpiePlayer"); 81 Config cfg("OpiePlayer");
82 cfg.setGroup("Options"); 82 cfg.setGroup("Options");
83 skin = cfg.readEntry("Skin","default"); 83 skin = cfg.readEntry("Skin","default");
84 //skin = "scaleTest"; 84 //skin = "scaleTest";
85// color of background, frame, degree of transparency 85// color of background, frame, degree of transparency
86 86
87// QString skinPath = "opieplayer/skins/" + skin; 87// QString skinPath = "opieplayer/skins/" + skin;
88 QString skinPath = "opieplayer2/skins/" + skin; 88 QString skinPath;
89 qDebug("skin path "+skinPath); 89 skinPath = "opieplayer2/skins/" + skin;
90 if(!QDir(skinPath).exists())
91 skinPath = "opieplayer2/skins/default";
92
93 qDebug("skin path " + skinPath);
90 94
91 pixBg = new QPixmap( Resource::loadPixmap( QString("%1/background").arg(skinPath) ) ); 95 pixBg = new QPixmap( Resource::loadPixmap( QString("%1/background").arg(skinPath) ) );
92 imgUp = new QImage( Resource::loadImage( QString("%1/skin_up").arg(skinPath) ) ); 96 imgUp = new QImage( Resource::loadImage( QString("%1/skin_up").arg(skinPath) ) );
93 imgDn = new QImage( Resource::loadImage( QString("%1/skin_down").arg(skinPath) ) ); 97 imgDn = new QImage( Resource::loadImage( QString("%1/skin_down").arg(skinPath) ) );
94 98
95 imgButtonMask = new QImage( imgUp->width(), imgUp->height(), 8, 255 ); 99 imgButtonMask = new QImage( imgUp->width(), imgUp->height(), 8, 255 );
96 imgButtonMask->fill( 0 ); 100 imgButtonMask->fill( 0 );
97 101
98 for ( int i = 0; i < 10; i++ ) { 102 for ( int i = 0; i < 10; i++ ) {
99 QString filename = QString(getenv("OPIEDIR")) + "/pics/" + skinPath + "/skin_mask_" + skin_mask_file_names[i] + ".png"; 103 QString filename = QString(getenv("OPIEDIR")) + "/pics/" + skinPath + "/skin_mask_" + skin_mask_file_names[i] + ".png";
100 masks[i] = new QBitmap( filename ); 104 masks[i] = new QBitmap( filename );
101 105
102 if ( !masks[i]->isNull() ) { 106 if ( !masks[i]->isNull() ) {
103 QImage imgMask = masks[i]->convertToImage(); 107 QImage imgMask = masks[i]->convertToImage();
104 uchar **dest = imgButtonMask->jumpTable(); 108 uchar **dest = imgButtonMask->jumpTable();
105 for ( int y = 0; y < imgUp->height(); y++ ) { 109 for ( int y = 0; y < imgUp->height(); y++ ) {
106 uchar *line = dest[y]; 110 uchar *line = dest[y];
107 for ( int x = 0; x < imgUp->width(); x++ ) 111 for ( int x = 0; x < imgUp->width(); x++ )
108 if ( !qRed( imgMask.pixel( x, y ) ) ) 112 if ( !qRed( imgMask.pixel( x, y ) ) )
109 line[x] = i + 1; 113 line[x] = i + 1;
110 } 114 }
111 } 115 }
112 116
113 } 117 }
114 118
115 for ( int i = 0; i < 11; i++ ) { 119 for ( int i = 0; i < 11; i++ ) {
116 buttonPixUp[i] = NULL; 120 buttonPixUp[i] = NULL;
117 buttonPixDown[i] = NULL; 121 buttonPixDown[i] = NULL;
118 } 122 }
119 123
120 setBackgroundPixmap( *pixBg ); 124 setBackgroundPixmap( *pixBg );
121 125
122 songInfo.setFocusPolicy( QWidget::NoFocus ); 126 songInfo.setFocusPolicy( QWidget::NoFocus );
123 127
124// changeTextColor( &songInfo ); 128// changeTextColor( &songInfo );
125// songInfo.setBackgroundColor( QColor( 167, 212, 167 )); 129// songInfo.setBackgroundColor( QColor( 167, 212, 167 ));
126// songInfo.setFrameStyle( QFrame::NoFrame); 130// songInfo.setFrameStyle( QFrame::NoFrame);
127// songInfo.setFrameStyle( QFrame::WinPanel | QFrame::Sunken ); 131// songInfo.setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
128 //NoFrame 132 //NoFrame
129// songInfo.setForegroundColor(Qt::white); 133// songInfo.setForegroundColor(Qt::white);
130 134
131 slider.setFixedHeight( 20 ); 135 slider.setFixedHeight( 20 );
132 slider.setMinValue( 0 ); 136 slider.setMinValue( 0 );
133 slider.setMaxValue( 1 ); 137 slider.setMaxValue( 1 );
134 slider.setFocusPolicy( QWidget::NoFocus ); 138 slider.setFocusPolicy( QWidget::NoFocus );
135 slider.setBackgroundPixmap( *pixBg ); 139 slider.setBackgroundPixmap( *pixBg );
136 140
137 time.setFocusPolicy( QWidget::NoFocus ); 141 time.setFocusPolicy( QWidget::NoFocus );
138 time.setAlignment( Qt::AlignCenter ); 142 time.setAlignment( Qt::AlignCenter );
139 time.setFrame(FALSE); 143 time.setFrame(FALSE);
140 changeTextColor( &time ); 144 changeTextColor( &time );
141 145
142 resizeEvent( NULL ); 146 resizeEvent( NULL );
143 147
144 connect( &slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); 148 connect( &slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
145 connect( &slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); 149 connect( &slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
146 150
147 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) ); 151 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) );
148 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) ); 152 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) );
149 connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ), this, SLOT( setLooping(bool) ) ); 153 connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ), this, SLOT( setLooping(bool) ) );
150// connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) ); 154// connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) );
151 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) ); 155 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) );
152 156
153 // Intialise state 157 // Intialise state
154 setLength( mediaPlayerState->length() ); 158 setLength( mediaPlayerState->length() );
155 setPosition( mediaPlayerState->position() ); 159 setPosition( mediaPlayerState->position() );
156 setLooping( mediaPlayerState->fullscreen() ); 160 setLooping( mediaPlayerState->fullscreen() );
157// setPaused( mediaPlayerState->paused() ); 161// setPaused( mediaPlayerState->paused() );
158 setPlaying( mediaPlayerState->playing() ); 162 setPlaying( mediaPlayerState->playing() );
159 163
160} 164}
161 165
162 166
163AudioWidget::~AudioWidget() { 167AudioWidget::~AudioWidget() {
164 168
165 for ( int i = 0; i < 10; i++ ) { 169 for ( int i = 0; i < 10; i++ ) {
166 delete buttonPixUp[i]; 170 delete buttonPixUp[i];
167 delete buttonPixDown[i]; 171 delete buttonPixDown[i];
168 } 172 }
169 delete pixBg; 173 delete pixBg;
170 delete imgUp; 174 delete imgUp;
171 delete imgDn; 175 delete imgDn;
172 delete imgButtonMask; 176 delete imgButtonMask;
173 for ( int i = 0; i < 10; i++ ) { 177 for ( int i = 0; i < 10; i++ ) {
174 delete masks[i]; 178 delete masks[i];
175 } 179 }
176} 180}
177 181
178 182
179QPixmap *combineImageWithBackground( QImage img, QPixmap bg, QPoint offset ) { 183QPixmap *combineImageWithBackground( QImage img, QPixmap bg, QPoint offset ) {
180 QPixmap pix( img.width(), img.height() ); 184 QPixmap pix( img.width(), img.height() );
181 QPainter p( &pix ); 185 QPainter p( &pix );
182 p.drawTiledPixmap( pix.rect(), bg, offset ); 186 p.drawTiledPixmap( pix.rect(), bg, offset );
183 p.drawImage( 0, 0, img ); 187 p.drawImage( 0, 0, img );
184 return new QPixmap( pix ); 188 return new QPixmap( pix );
185} 189}
186 190
187 191
188QPixmap *maskPixToMask( QPixmap pix, QBitmap mask ) 192QPixmap *maskPixToMask( QPixmap pix, QBitmap mask )
189{ 193{
190 QPixmap *pixmap = new QPixmap( pix ); 194 QPixmap *pixmap = new QPixmap( pix );
191 pixmap->setMask( mask ); 195 pixmap->setMask( mask );
192 return pixmap; 196 return pixmap;
193} 197}
194 198
195 199
196 200
197void AudioWidget::resizeEvent( QResizeEvent * ) { 201void AudioWidget::resizeEvent( QResizeEvent * ) {
198 int h = height(); 202 int h = height();
199 int w = width(); 203 int w = width();
200 204
201 songInfo.setGeometry( QRect( 2, 10, w - 4, 20 ) ); 205 songInfo.setGeometry( QRect( 2, 10, w - 4, 20 ) );
202 slider.setFixedWidth( w - 110 ); 206 slider.setFixedWidth( w - 110 );
203 slider.setGeometry( QRect( 15, h - 30, w - 90, 20 ) ); 207 slider.setGeometry( QRect( 15, h - 30, w - 90, 20 ) );
204 slider.setBackgroundOrigin( QWidget::ParentOrigin ); 208 slider.setBackgroundOrigin( QWidget::ParentOrigin );
205 time.setGeometry( QRect( w - 85, h - 30, 70, 20 ) ); 209 time.setGeometry( QRect( w - 85, h - 30, 70, 20 ) );
206 210
207 xoff = ( w - imgUp->width() ) / 2; 211 xoff = ( w - imgUp->width() ) / 2;
208 yoff = (( h - imgUp->height() ) / 2) - 10; 212 yoff = (( h - imgUp->height() ) / 2) - 10;
209 QPoint p( xoff, yoff ); 213 QPoint p( xoff, yoff );
210 214
211 QPixmap *pixUp = combineImageWithBackground( *imgUp, *pixBg, p ); 215 QPixmap *pixUp = combineImageWithBackground( *imgUp, *pixBg, p );
212 QPixmap *pixDn = combineImageWithBackground( *imgDn, *pixBg, p ); 216 QPixmap *pixDn = combineImageWithBackground( *imgDn, *pixBg, p );
213 217
214 for ( int i = 0; i < 10; i++ ) { 218 for ( int i = 0; i < 10; i++ ) {
215 if ( !masks[i]->isNull() ) { 219 if ( !masks[i]->isNull() ) {
216 delete buttonPixUp[i]; 220 delete buttonPixUp[i];
217 delete buttonPixDown[i]; 221 delete buttonPixDown[i];
218 buttonPixUp[i] = maskPixToMask( *pixUp, *masks[i] ); 222 buttonPixUp[i] = maskPixToMask( *pixUp, *masks[i] );
219 buttonPixDown[i] = maskPixToMask( *pixDn, *masks[i] ); 223 buttonPixDown[i] = maskPixToMask( *pixDn, *masks[i] );
220 } 224 }
221 } 225 }
222 226
223 delete pixUp; 227 delete pixUp;
224 delete pixDn; 228 delete pixDn;
225} 229}
226 230
227 231
228static bool audioSliderBeingMoved = FALSE; 232static bool audioSliderBeingMoved = FALSE;
229 233
230void AudioWidget::sliderPressed() { 234void AudioWidget::sliderPressed() {
231 audioSliderBeingMoved = TRUE; 235 audioSliderBeingMoved = TRUE;
232} 236}
233 237
234 238
235void AudioWidget::sliderReleased() { 239void AudioWidget::sliderReleased() {
236 audioSliderBeingMoved = FALSE; 240 audioSliderBeingMoved = FALSE;
237 if ( slider.width() == 0 ) 241 if ( slider.width() == 0 )
238 return; 242 return;
239 long val = long((double)slider.value() * mediaPlayerState->length() / slider.width()); 243 long val = long((double)slider.value() * mediaPlayerState->length() / slider.width());
240 mediaPlayerState->setPosition( val ); 244 mediaPlayerState->setPosition( val );
241} 245}
242 246
243 247
244void AudioWidget::setPosition( long i ) { 248void AudioWidget::setPosition( long i ) {
245// qDebug("set position %d",i); 249// qDebug("set position %d",i);
246 long length = mediaPlayerState->length(); 250 long length = mediaPlayerState->length();
247 updateSlider( i, length ); 251 updateSlider( i, length );
248} 252}
249 253
250 254
251void AudioWidget::setLength( long max ) { 255void AudioWidget::setLength( long max ) {
252 updateSlider( mediaPlayerState->position(), max ); 256 updateSlider( mediaPlayerState->position(), max );
253} 257}
254 258
255 259
256void AudioWidget::setView( char view ) { 260void AudioWidget::setView( char view ) {
257 261
258 if (mediaPlayerState->isStreaming) { 262 if (mediaPlayerState->isStreaming) {
259 if( !slider.isHidden()) slider.hide(); 263 if( !slider.isHidden()) slider.hide();
260 disconnect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 264 disconnect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
261 disconnect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); 265 disconnect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
262 } else { 266 } else {
263// this stops the slider from being moved, thus 267// this stops the slider from being moved, thus
264 // does not stop stream when it reaches the end 268 // does not stop stream when it reaches the end
265 slider.show(); 269 slider.show();
266 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 270 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
267 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); 271 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
268 } 272 }
269 273
270 if ( view == 'a' ) { 274 if ( view == 'a' ) {
271 startTimer( 150 ); 275 startTimer( 150 );
272// show(); 276// show();
273 showMaximized(); 277 showMaximized();
274 } else { 278 } else {
275 killTimers(); 279 killTimers();
276 hide(); 280 hide();
277 } 281 }
278} 282}
279 283
280 284
281static QString timeAsString( long length ) { 285static QString timeAsString( long length ) {
282 length /= 44100; 286 length /= 44100;
283 int minutes = length / 60; 287 int minutes = length / 60;
284 int seconds = length % 60; 288 int seconds = length % 60;
285 return QString("%1:%2%3").arg( minutes ).arg( seconds / 10 ).arg( seconds % 10 ); 289 return QString("%1:%2%3").arg( minutes ).arg( seconds / 10 ).arg( seconds % 10 );
286} 290}
287 291
288void AudioWidget::updateSlider( long i, long max ) { 292void AudioWidget::updateSlider( long i, long max ) {
289 time.setText( timeAsString( i ) + " / " + timeAsString( max ) ); 293 time.setText( timeAsString( i ) + " / " + timeAsString( max ) );
290 294
291 if ( max == 0 ) 295 if ( max == 0 )
292 return; 296 return;
293 // Will flicker too much if we don't do this 297 // Will flicker too much if we don't do this
294 // Scale to something reasonable 298 // Scale to something reasonable
295 int width = slider.width(); 299 int width = slider.width();
296 int val = int((double)i * width / max); 300 int val = int((double)i * width / max);
297 if ( !audioSliderBeingMoved ) { 301 if ( !audioSliderBeingMoved ) {
298 if ( slider.value() != val ) 302 if ( slider.value() != val )
299 slider.setValue( val ); 303 slider.setValue( val );
300 if ( slider.maxValue() != width ) 304 if ( slider.maxValue() != width )
301 slider.setMaxValue( width ); 305 slider.setMaxValue( width );
302 } 306 }
303} 307}
304 308
305 309
306void AudioWidget::setToggleButton( int i, bool down ) { 310void AudioWidget::setToggleButton( int i, bool down ) {
307 if ( down != audioButtons[i].isDown ) 311 if ( down != audioButtons[i].isDown )
308 toggleButton( i ); 312 toggleButton( i );
309} 313}
310 314
311 315
312void AudioWidget::toggleButton( int i ) { 316void AudioWidget::toggleButton( int i ) {
313 audioButtons[i].isDown = !audioButtons[i].isDown; 317 audioButtons[i].isDown = !audioButtons[i].isDown;
314 QPainter p(this); 318 QPainter p(this);
315 paintButton ( &p, i ); 319 paintButton ( &p, i );
316} 320}
317 321
318 322
319void AudioWidget::paintButton( QPainter *p, int i ) { 323void AudioWidget::paintButton( QPainter *p, int i ) {
320 if ( audioButtons[i].isDown ) 324 if ( audioButtons[i].isDown )
321 p->drawPixmap( xoff, yoff, *buttonPixDown[i] ); 325 p->drawPixmap( xoff, yoff, *buttonPixDown[i] );
322 else 326 else
323 p->drawPixmap( xoff, yoff, *buttonPixUp[i] ); 327 p->drawPixmap( xoff, yoff, *buttonPixUp[i] );
324} 328}
325 329
326 330
327void AudioWidget::timerEvent( QTimerEvent * ) { 331void AudioWidget::timerEvent( QTimerEvent * ) {
328/* 332/*
329 int x = audioButtons[AudioPlay].xPos; 333 int x = audioButtons[AudioPlay].xPos;
330 int y = audioButtons[AudioPlay].yPos; 334 int y = audioButtons[AudioPlay].yPos;
331 QPainter p( this ); 335 QPainter p( this );
332 // Optimize to only draw the little bit of the changing images which is different 336 // Optimize to only draw the little bit of the changing images which is different
333 p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 ); 337 p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 );
334 p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 ); 338 p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 );
335*/ 339*/
336/* 340/*
337 static int frame = 0; 341 static int frame = 0;
338 if ( !mediaPlayerState->paused() && audioButtons[ AudioPlay ].isDown ) { 342 if ( !mediaPlayerState->paused() && audioButtons[ AudioPlay ].isDown ) {
339 frame = frame >= 7 ? 0 : frame + 1; 343 frame = frame >= 7 ? 0 : frame + 1;
340 } 344 }
341 */ 345 */
342} 346}
343 347
344 348
345void AudioWidget::mouseMoveEvent( QMouseEvent *event ) { 349void AudioWidget::mouseMoveEvent( QMouseEvent *event ) {
346 for ( int i = 0; i < numButtons; i++ ) { 350 for ( int i = 0; i < numButtons; i++ ) {
347 if ( event->state() == QMouseEvent::LeftButton ) { 351 if ( event->state() == QMouseEvent::LeftButton ) {
348 352
349 // The test to see if the mouse click is inside the button or not 353 // The test to see if the mouse click is inside the button or not
350 int x = event->pos().x() - xoff; 354 int x = event->pos().x() - xoff;
351 int y = event->pos().y() - yoff; 355 int y = event->pos().y() - yoff;
352 356
353 bool isOnButton = ( x > 0 && y > 0 && x < imgButtonMask->width() 357 bool isOnButton = ( x > 0 && y > 0 && x < imgButtonMask->width()
354 && y < imgButtonMask->height() && imgButtonMask->pixelIndex( x, y ) == i + 1 ); 358 && y < imgButtonMask->height() && imgButtonMask->pixelIndex( x, y ) == i + 1 );
355 359
356 if ( isOnButton && i == AudioVolumeUp ) 360 if ( isOnButton && i == AudioVolumeUp )
357 qDebug("on up"); 361 qDebug("on up");
358 362
359 if ( isOnButton && !audioButtons[i].isHeld ) { 363 if ( isOnButton && !audioButtons[i].isHeld ) {
360 audioButtons[i].isHeld = TRUE; 364 audioButtons[i].isHeld = TRUE;
361 toggleButton(i); 365 toggleButton(i);
362 switch (i) { 366 switch (i) {
363 case AudioVolumeUp: 367 case AudioVolumeUp:
364 qDebug("more clicked"); 368 qDebug("more clicked");
365 emit moreClicked(); 369 emit moreClicked();
366 return; 370 return;
367 case AudioVolumeDown: 371 case AudioVolumeDown:
368 qDebug("less clicked"); 372 qDebug("less clicked");
369 emit lessClicked(); 373 emit lessClicked();
370 return; 374 return;
371 case AudioForward: 375 case AudioForward:
372 emit forwardClicked(); 376 emit forwardClicked();
373 return; 377 return;
374 case AudioBack: 378 case AudioBack:
375 emit backClicked(); 379 emit backClicked();
376 return; 380 return;
377 } 381 }
378 } else if ( !isOnButton && audioButtons[i].isHeld ) { 382 } else if ( !isOnButton && audioButtons[i].isHeld ) {
379 audioButtons[i].isHeld = FALSE; 383 audioButtons[i].isHeld = FALSE;
380 toggleButton(i); 384 toggleButton(i);
381 } 385 }
382 } else { 386 } else {
383 if ( audioButtons[i].isHeld ) { 387 if ( audioButtons[i].isHeld ) {
384 audioButtons[i].isHeld = FALSE; 388 audioButtons[i].isHeld = FALSE;
385 if ( !audioButtons[i].isToggle ) 389 if ( !audioButtons[i].isToggle )
386 setToggleButton( i, FALSE ); 390 setToggleButton( i, FALSE );
387 switch (i) { 391 switch (i) {
388 case AudioPlay: 392 case AudioPlay:
389 if( mediaPlayerState->isPaused ) { 393 if( mediaPlayerState->isPaused ) {
390 mediaPlayerState->setPaused( FALSE ); 394 mediaPlayerState->setPaused( FALSE );
391 return; 395 return;
392 } else if( !mediaPlayerState->isPaused ) { 396 } else if( !mediaPlayerState->isPaused ) {
393 mediaPlayerState->setPaused( TRUE ); 397 mediaPlayerState->setPaused( TRUE );
394 return; 398 return;
395 } 399 }
396// case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return; 400// case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return;
397 case AudioStop: mediaPlayerState->setPlaying(FALSE); return; 401 case AudioStop: mediaPlayerState->setPlaying(FALSE); return;
398// case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); return; 402// case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); return;
399 case AudioNext: mediaPlayerState->setNext(); return; 403 case AudioNext: mediaPlayerState->setNext(); return;
400 case AudioPrevious: mediaPlayerState->setPrev(); return; 404 case AudioPrevious: mediaPlayerState->setPrev(); return;
401 case AudioLoop: mediaPlayerState->setLooping(audioButtons[i].isDown); return; 405 case AudioLoop: mediaPlayerState->setLooping(audioButtons[i].isDown); return;
402 case AudioVolumeUp: emit moreReleased(); return; 406 case AudioVolumeUp: emit moreReleased(); return;
403 case AudioVolumeDown: emit lessReleased(); return; 407 case AudioVolumeDown: emit lessReleased(); return;
404 case AudioPlayList: mediaPlayerState->setList(); return; 408 case AudioPlayList: mediaPlayerState->setList(); return;
405 } 409 }
406 } 410 }
407 } 411 }
408 } 412 }
409} 413}
410 414
411 415
412 416
413void AudioWidget::mousePressEvent( QMouseEvent *event ) { 417void AudioWidget::mousePressEvent( QMouseEvent *event ) {
414 mouseMoveEvent( event ); 418 mouseMoveEvent( event );
415} 419}
416 420
417 421
418void AudioWidget::mouseReleaseEvent( QMouseEvent *event ) { 422void AudioWidget::mouseReleaseEvent( QMouseEvent *event ) {
419 mouseMoveEvent( event ); 423 mouseMoveEvent( event );
420} 424}
421 425
422 426
423void AudioWidget::showEvent( QShowEvent* ) { 427void AudioWidget::showEvent( QShowEvent* ) {
424 QMouseEvent event( QEvent::MouseMove, QPoint( 0, 0 ), 0, 0 ); 428 QMouseEvent event( QEvent::MouseMove, QPoint( 0, 0 ), 0, 0 );
425 mouseMoveEvent( &event ); 429 mouseMoveEvent( &event );
426} 430}
427 431
428 432
429void AudioWidget::closeEvent( QCloseEvent* ) { 433void AudioWidget::closeEvent( QCloseEvent* ) {
430 mediaPlayerState->setList(); 434 mediaPlayerState->setList();
431} 435}
432 436
433 437
434void AudioWidget::paintEvent( QPaintEvent * pe) { 438void AudioWidget::paintEvent( QPaintEvent * pe) {
435 if ( !pe->erased() ) { 439 if ( !pe->erased() ) {
436 // Combine with background and double buffer 440 // Combine with background and double buffer
437 QPixmap pix( pe->rect().size() ); 441 QPixmap pix( pe->rect().size() );
438 QPainter p( &pix ); 442 QPainter p( &pix );
439 p.translate( -pe->rect().topLeft().x(), -pe->rect().topLeft().y() ); 443 p.translate( -pe->rect().topLeft().x(), -pe->rect().topLeft().y() );
440 p.drawTiledPixmap( pe->rect(), *pixBg, pe->rect().topLeft() ); 444 p.drawTiledPixmap( pe->rect(), *pixBg, pe->rect().topLeft() );
441 for ( int i = 0; i < numButtons; i++ ) 445 for ( int i = 0; i < numButtons; i++ )
442 paintButton( &p, i ); 446 paintButton( &p, i );
443 QPainter p2( this ); 447 QPainter p2( this );
444 p2.drawPixmap( pe->rect().topLeft(), pix ); 448 p2.drawPixmap( pe->rect().topLeft(), pix );
445 } else { 449 } else {
446 QPainter p( this ); 450 QPainter p( this );
447 for ( int i = 0; i < numButtons; i++ ) 451 for ( int i = 0; i < numButtons; i++ )
448 paintButton( &p, i ); 452 paintButton( &p, i );
449 } 453 }
450} 454}
451 455
452void AudioWidget::keyReleaseEvent( QKeyEvent *e) 456void AudioWidget::keyReleaseEvent( QKeyEvent *e)
453{ 457{
454 switch ( e->key() ) { 458 switch ( e->key() ) {
455////////////////////////////// Zaurus keys 459////////////////////////////// Zaurus keys
456 case Key_Home: 460 case Key_Home:
457 break; 461 break;
458 case Key_F9: //activity 462 case Key_F9: //activity
459 hide(); 463 hide();
460// qDebug("Audio F9"); 464// qDebug("Audio F9");
461 break; 465 break;
462 case Key_F10: //contacts 466 case Key_F10: //contacts
463 break; 467 break;
464 case Key_F11: //menu 468 case Key_F11: //menu
465 break; 469 break;
466 case Key_F12: //home 470 case Key_F12: //home
467 break; 471 break;
468 case Key_F13: //mail 472 case Key_F13: //mail
469 break; 473 break;
470 case Key_Space: { 474 case Key_Space: {
471 475
472 if(mediaPlayerState->playing()) { 476 if(mediaPlayerState->playing()) {
473// toggleButton(1); 477// toggleButton(1);
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index ba14882..8cf0a75 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -1,485 +1,485 @@
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"); 103qDebug("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"); 120qDebug("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 ( hasVideoChannel ) { 239 if ( hasVideoChannel ) {
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 249
250 audioDevice->write( audioBuffer, samplesRead * 2 * channels ); 250 audioDevice->write( audioBuffer, samplesRead * 2 * channels );
251 251
252 if( mediaPlayerState->isStreaming == FALSE) 252 if( mediaPlayerState->isStreaming == FALSE)
253 audioSampleCounter = currentSample + samplesRead - 1; 253 audioSampleCounter = currentSample + samplesRead - 1;
254 254
255 moreAudio = readOk && (audioSampleCounter <= total_audio_samples); 255 moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
256 256
257 } else { 257 } else {
258 258
259 moreAudio = FALSE; 259 moreAudio = FALSE;
260 260
261 } 261 }
262 262
263 } 263 }
264 264
265 audioMutex->unlock(); 265 audioMutex->unlock();
266} 266}
267 267
268 268
269void LoopControl::killTimers() { 269void LoopControl::killTimers() {
270 270
271 audioMutex->lock(); 271 audioMutex->lock();
272 272
273 if ( hasVideoChannel ) 273 if ( hasVideoChannel )
274 killTimer( videoId ); 274 killTimer( videoId );
275 killTimer( sliderId ); 275 killTimer( sliderId );
276 threadOkToGo = FALSE; 276 threadOkToGo = FALSE;
277 277
278 audioMutex->unlock(); 278 audioMutex->unlock();
279} 279}
280 280
281 281
282void LoopControl::startTimers() { 282void LoopControl::startTimers() {
283 283
284 audioMutex->lock(); 284 audioMutex->lock();
285 285
286 moreVideo = FALSE; 286 moreVideo = FALSE;
287 moreAudio = FALSE; 287 moreAudio = FALSE;
288 288
289 if ( hasVideoChannel ) { 289 if ( hasVideoChannel ) {
290 moreVideo = TRUE; 290 moreVideo = TRUE;
291 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value 291 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
292 videoId = startTimer( mSecsBetweenFrames ); 292 videoId = startTimer( mSecsBetweenFrames );
293 } 293 }
294 294
295 if ( hasAudioChannel ) { 295 if ( hasAudioChannel ) {
296 moreAudio = TRUE; 296 moreAudio = TRUE;
297 threadOkToGo = TRUE; 297 threadOkToGo = TRUE;
298 } 298 }
299 299
300 sliderId = startTimer( 300 ); // update slider every 1/3 second 300 sliderId = startTimer( 300 ); // update slider every 1/3 second
301 301
302 audioMutex->unlock(); 302 audioMutex->unlock();
303} 303}
304 304
305 305
306void LoopControl::setPaused( bool pause ) { 306void LoopControl::setPaused( bool pause ) {
307 307
308 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) 308 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
309 return; 309 return;
310 310
311 if ( pause ) { 311 if ( pause ) {
312 killTimers(); 312 killTimers();
313 } else { 313 } else {
314 // Force an update of the position 314 // Force an update of the position
315 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 315 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
316 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 316 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
317 // Just like we never stopped 317 // Just like we never stopped
318 startTimers(); 318 startTimers();
319 } 319 }
320} 320}
321 321
322 322
323void LoopControl::stop( bool willPlayAgainShortly ) { 323void LoopControl::stop( bool willPlayAgainShortly ) {
324 324
325#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 325#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
326 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { 326 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) {
327 disabledSuspendScreenSaver = FALSE; 327 disabledSuspendScreenSaver = FALSE;
328 // Re-enable the suspend mode 328 // Re-enable the suspend mode
329 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 329 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
330 } 330 }
331#endif 331#endif
332 332
333 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { 333 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
334 334
335 killTimers(); 335 killTimers();
336 336
337 audioMutex->lock(); 337 audioMutex->lock();
338 338
339 mediaPlayerState->curDecoder()->close(); 339 mediaPlayerState->curDecoder()->close();
340 340
341 if ( audioDevice ) { 341 if ( audioDevice ) {
342 delete audioDevice; 342 delete audioDevice;
343 delete audioBuffer; 343 delete audioBuffer;
344 audioDevice = 0; 344 audioDevice = 0;
345 audioBuffer = 0; 345 audioBuffer = 0;
346 } 346 }
347 347
348 audioMutex->unlock(); 348 audioMutex->unlock();
349 } 349 }
350 audioSampleCounter=0; 350 audioSampleCounter=0;
351 current_frame=0; 351 current_frame=0;
352 total_audio_samples=0; 352 total_audio_samples=0;
353} 353}
354 354
355 355
356bool LoopControl::init( const QString& filename ) { 356bool LoopControl::init( const QString& filename ) {
357 stop(); 357 stop();
358 audioMutex->lock(); 358 audioMutex->lock();
359 359
360 fileName = filename; 360 fileName = filename;
361 stream = 0; // only play stream 0 for now 361 stream = 0; // only play stream 0 for now
362 current_frame = total_video_frames = total_audio_samples = 0; 362 current_frame = total_video_frames = total_audio_samples = 0;
363 363
364 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); 364 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() );
365 365
366 // ### 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
367 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) { 367// if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) {
368 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) { 368// if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) {
369 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); 369// total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 );
370 mediaPlayerState->libMpeg3Decoder()->close(); 370// mediaPlayerState->libMpeg3Decoder()->close();
371 } 371// }
372 } 372// }
373 373
374 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { 374 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) {
375 audioMutex->unlock(); 375 audioMutex->unlock();
376 return FALSE; 376 return FALSE;
377 } 377 }
378 378
379 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; 379 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0;
380 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; 380 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;
381 381
382 if ( hasAudioChannel ) { 382 if ( hasAudioChannel ) {
383 int astream = 0; 383 int astream = 0;
384 384
385 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") ) 385 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") )
386 channels = 2; //dont akx me why, but it needs this hack 386 channels = 2; //dont akx me why, but it needs this hack
387 else 387 else
388 channels = mediaPlayerState->curDecoder()->audioChannels( astream ); 388 channels = mediaPlayerState->curDecoder()->audioChannels( astream );
389 389
390 qDebug( "LC- channels = %d", channels ); 390 qDebug( "LC- channels = %d", channels );
391 391
392 if ( !total_audio_samples ) 392// if ( !total_audio_samples )
393 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); 393 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
394 394
395 total_audio_samples += 1000; 395 total_audio_samples += 1000;
396 396 qDebug("total samples %d", total_audio_samples);
397 mediaPlayerState->setLength( total_audio_samples ); 397 mediaPlayerState->setLength( total_audio_samples );
398 398
399 freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); 399 freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
400 qDebug( "LC- frequency = %d", freq ); 400 qDebug( "LC- frequency = %d", freq );
401 401
402 audioSampleCounter = 0; 402 audioSampleCounter = 0;
403 int bits_per_sample; 403 int bits_per_sample;
404 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { 404 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
405 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); 405 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
406 qDebug("using stupid hack"); 406 qDebug("using stupid hack");
407 } else { 407 } else {
408 bits_per_sample=0; 408 bits_per_sample=0;
409 } 409 }
410 410
411 audioDevice = new AudioDevice( freq, channels, bits_per_sample); 411 audioDevice = new AudioDevice( freq, channels, bits_per_sample);
412 audioBuffer = new char[ audioDevice->bufferSize() ]; 412 audioBuffer = new char[ audioDevice->bufferSize() ];
413 channels = audioDevice->channels(); 413 channels = audioDevice->channels();
414 414
415 //### must check which frequency is actually used. 415 //### must check which frequency is actually used.
416 static const int size = 1; 416 static const int size = 1;
417 short int buf[size]; 417 short int buf[size];
418 long samplesRead = 0; 418 long samplesRead = 0;
419 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); 419 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
420 } 420 }
421 421
422 if ( hasVideoChannel ) { 422 if ( hasVideoChannel ) {
423 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); 423 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
424 424
425 mediaPlayerState->setLength( total_video_frames ); 425 mediaPlayerState->setLength( total_video_frames );
426 426
427 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); 427 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
428 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); 428 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
429 429
430 if ( framerate <= 1.0 ) { 430 if ( framerate <= 1.0 ) {
431 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); 431 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
432 framerate = 25; 432 framerate = 25;
433 } 433 }
434 434
435 if ( total_video_frames == 1 ) { 435 if ( total_video_frames == 1 ) {
436 DecodeLoopDebug(( "Cannot seek to frame" )); 436 DecodeLoopDebug(( "Cannot seek to frame" ));
437 } 437 }
438 438
439 } 439 }
440 440
441 current_frame = 0; 441 current_frame = 0;
442 prev_frame = -1; 442 prev_frame = -1;
443 443
444 connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) ); 444 connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) );
445 connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) ); 445 connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) );
446 446
447 audioMutex->unlock(); 447 audioMutex->unlock();
448 448
449 return TRUE; 449 return TRUE;
450} 450}
451 451
452 452
453void LoopControl::play() { 453void LoopControl::play() {
454 qDebug("LC- play"); 454 qDebug("LC- play");
455 mediaPlayerState->setPosition( 0); //uglyhack 455 mediaPlayerState->setPosition( 0); //uglyhack
456 456
457#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 457#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
458 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { 458 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) {
459 disabledSuspendScreenSaver = TRUE; 459 disabledSuspendScreenSaver = TRUE;
460 previousSuspendMode = hasVideoChannel; 460 previousSuspendMode = hasVideoChannel;
461 // Stop the screen from blanking and power saving state 461 // Stop the screen from blanking and power saving state
462 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) 462 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" )
463 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); 463 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend );
464 } 464 }
465#endif 465#endif
466 466
467 playtime.start(); 467 playtime.start();
468 startTimers(); 468 startTimers();
469} 469}
470 470
471 471
472void LoopControl::setMute( bool on ) { 472void LoopControl::setMute( bool on ) {
473 if ( on != isMuted ) { 473 if ( on != isMuted ) {
474 isMuted = on; 474 isMuted = on;
475 if ( !on ) { 475 if ( !on ) {
476 // Force an update of the position 476 // Force an update of the position
477 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 477 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
478 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 478 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
479 // Resume playing audio 479 // Resume playing audio
480 moreAudio = TRUE; 480 moreAudio = TRUE;
481 } 481 }
482 } 482 }
483} 483}
484 484
485 485