summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2002-04-21 12:59:29 (UTC)
committer llornkcor <llornkcor>2002-04-21 12:59:29 (UTC)
commit1c7b8ce5b548a414845b873428bf5a6b36eebb83 (patch) (unidiff)
treea87a17860a1b0454154bd2c4874cb61c01c7db11
parentc7a23ea04b627db855934fac5061d7e291cdf230 (diff)
downloadopie-1c7b8ce5b548a414845b873428bf5a6b36eebb83.zip
opie-1c7b8ce5b548a414845b873428bf5a6b36eebb83.tar.gz
opie-1c7b8ce5b548a414845b873428bf5a6b36eebb83.tar.bz2
hide slider when streaming
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/audiowidget.cpp3
-rw-r--r--core/multimedia/opieplayer/libmpeg3/libmpeg3.pro2
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp2
-rw-r--r--core/multimedia/opieplayer/wavplugin/wavplugin.pro2
4 files changed, 5 insertions, 4 deletions
diff --git a/core/multimedia/opieplayer/audiowidget.cpp b/core/multimedia/opieplayer/audiowidget.cpp
index 20345b7..b9561d5 100644
--- a/core/multimedia/opieplayer/audiowidget.cpp
+++ b/core/multimedia/opieplayer/audiowidget.cpp
@@ -1,341 +1,342 @@
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 22
23#include <qwidget.h> 23#include <qwidget.h>
24#include <qpixmap.h> 24#include <qpixmap.h>
25#include <qbutton.h> 25#include <qbutton.h>
26#include <qpainter.h> 26#include <qpainter.h>
27#include <qframe.h> 27#include <qframe.h>
28 28
29#include "audiowidget.h" 29#include "audiowidget.h"
30#include "mediaplayerstate.h" 30#include "mediaplayerstate.h"
31 31
32extern MediaPlayerState *mediaPlayerState; 32extern MediaPlayerState *mediaPlayerState;
33 33
34 34
35static const int xo = -2; // movable x offset 35static const int xo = -2; // movable x offset
36static const int yo = 22; // movable y offset 36static const int yo = 22; // movable y offset
37 37
38 38
39struct MediaButton { 39struct MediaButton {
40 int xPos, yPos; 40 int xPos, yPos;
41 int color; 41 int color;
42 bool isToggle, isBig, isHeld, isDown; 42 bool isToggle, isBig, isHeld, isDown;
43}; 43};
44 44
45 45
46// Layout information for the audioButtons (and if it is a toggle button or not) 46// Layout information for the audioButtons (and if it is a toggle button or not)
47MediaButton audioButtons[] = { 47MediaButton audioButtons[] = {
48 { 3*30-15+xo, 3*30-13+yo, 0, TRUE, TRUE, FALSE, FALSE }, // play 48 { 3*30-15+xo, 3*30-13+yo, 0, TRUE, TRUE, FALSE, FALSE }, // play
49 { 1*30+xo, 5*30+yo, 2, FALSE, FALSE, FALSE, FALSE }, // stop 49 { 1*30+xo, 5*30+yo, 2, FALSE, FALSE, FALSE, FALSE }, // stop
50 { 5*30+xo, 5*30+yo, 2, TRUE, FALSE, FALSE, FALSE }, // pause 50 { 5*30+xo, 5*30+yo, 2, TRUE, FALSE, FALSE, FALSE }, // pause
51 { 6*30-5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // next 51 { 6*30-5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // next
52 { 0*30+5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // previous 52 { 0*30+5+xo, 3*30+yo, 1, FALSE, FALSE, FALSE, FALSE }, // previous
53 { 3*30+xo, 0*30+5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume up 53 { 3*30+xo, 0*30+5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume up
54 { 3*30+xo, 6*30-5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume down 54 { 3*30+xo, 6*30-5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume down
55 { 5*30+xo, 1*30+yo, 0, TRUE, FALSE, FALSE, FALSE }, // repeat/loop 55 { 5*30+xo, 1*30+yo, 0, TRUE, FALSE, FALSE, FALSE }, // repeat/loop
56 { 1*30+xo, 1*30+yo, 0, FALSE, FALSE, FALSE, FALSE } // playlist 56 { 1*30+xo, 1*30+yo, 0, FALSE, FALSE, FALSE, FALSE } // playlist
57}; 57};
58 58
59 59
60static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton)); 60static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton));
61 61
62 62
63AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) : 63AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) :
64 QWidget( parent, name, f ) 64 QWidget( parent, name, f )
65{ 65{
66// QPEApplication::grabKeyboard(); 66// QPEApplication::grabKeyboard();
67 setCaption( tr("OpiePlayer") ); 67 setCaption( tr("OpiePlayer") );
68 setBackgroundPixmap( Resource::loadPixmap( "opieplayer/metalFinish" ) ); 68 setBackgroundPixmap( Resource::loadPixmap( "opieplayer/metalFinish" ) );
69 pixmaps[0] = new QPixmap( Resource::loadPixmap( "opieplayer/mediaButtonsAll" ) ); 69 pixmaps[0] = new QPixmap( Resource::loadPixmap( "opieplayer/mediaButtonsAll" ) );
70 pixmaps[1] = new QPixmap( Resource::loadPixmap( "opieplayer/mediaButtonsBig" ) ); 70 pixmaps[1] = new QPixmap( Resource::loadPixmap( "opieplayer/mediaButtonsBig" ) );
71 pixmaps[2] = new QPixmap( Resource::loadPixmap( "opieplayer/mediaControls" ) ); 71 pixmaps[2] = new QPixmap( Resource::loadPixmap( "opieplayer/mediaControls" ) );
72 pixmaps[3] = new QPixmap( Resource::loadPixmap( "opieplayer/animatedButton" ) ); 72 pixmaps[3] = new QPixmap( Resource::loadPixmap( "opieplayer/animatedButton" ) );
73 73
74 songInfo = new Ticker( this ); 74 songInfo = new Ticker( this );
75 songInfo->setFocusPolicy( QWidget::NoFocus ); 75 songInfo->setFocusPolicy( QWidget::NoFocus );
76 songInfo->setGeometry( QRect( 7, 3, 220, 20 ) ); 76 songInfo->setGeometry( QRect( 7, 3, 220, 20 ) );
77 77
78 slider = new QSlider( Qt::Horizontal, this ); 78 slider = new QSlider( Qt::Horizontal, this );
79 slider->setFixedWidth( 220 ); 79 slider->setFixedWidth( 220 );
80 slider->setFixedHeight( 20 ); 80 slider->setFixedHeight( 20 );
81 slider->setMinValue( 0 ); 81 slider->setMinValue( 0 );
82 slider->setMaxValue( 1 ); 82 slider->setMaxValue( 1 );
83 slider->setBackgroundPixmap( Resource::loadPixmap( "opieplayer/metalFinish" ) ); 83 slider->setBackgroundPixmap( Resource::loadPixmap( "opieplayer/metalFinish" ) );
84 slider->setFocusPolicy( QWidget::NoFocus ); 84 slider->setFocusPolicy( QWidget::NoFocus );
85 slider->setGeometry( QRect( 7, 262, 220, 20 ) ); 85 slider->setGeometry( QRect( 7, 262, 220, 20 ) );
86 86
87 connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); 87 connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
88 connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); 88 connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
89 89
90 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) ); 90 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) );
91 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) ); 91 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) );
92 connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ), this, SLOT( setLooping(bool) ) ); 92 connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ), this, SLOT( setLooping(bool) ) );
93 connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) ); 93 connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) );
94 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) ); 94 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) );
95 95
96 if( !mediaPlayerState->isStreaming) { // this stops the slider from being moved, thus 96 if( !mediaPlayerState->isStreaming) { // this stops the slider from being moved, thus
97 // does not stop stream when it reaches the end 97 // does not stop stream when it reaches the end
98 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 98 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
99 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); 99 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
100 } 100 }
101 // Intialise state 101 // Intialise state
102 setLength( mediaPlayerState->length() ); 102 setLength( mediaPlayerState->length() );
103 setPosition( mediaPlayerState->position() ); 103 setPosition( mediaPlayerState->position() );
104 setLooping( mediaPlayerState->fullscreen() ); 104 setLooping( mediaPlayerState->fullscreen() );
105 setPaused( mediaPlayerState->paused() ); 105 setPaused( mediaPlayerState->paused() );
106 setPlaying( mediaPlayerState->playing() ); 106 setPlaying( mediaPlayerState->playing() );
107 107 if (mediaPlayerState->isStreaming) slider->hide();
108
108} 109}
109 110
110 111
111AudioWidget::~AudioWidget() { 112AudioWidget::~AudioWidget() {
112 for ( int i = 0; i < 4; i++ ) 113 for ( int i = 0; i < 4; i++ )
113 delete pixmaps[i]; 114 delete pixmaps[i];
114} 115}
115 116
116 117
117static bool audioSliderBeingMoved = FALSE; 118static bool audioSliderBeingMoved = FALSE;
118 119
119 120
120void AudioWidget::sliderPressed() { 121void AudioWidget::sliderPressed() {
121 audioSliderBeingMoved = TRUE; 122 audioSliderBeingMoved = TRUE;
122} 123}
123 124
124 125
125void AudioWidget::sliderReleased() { 126void AudioWidget::sliderReleased() {
126 audioSliderBeingMoved = FALSE; 127 audioSliderBeingMoved = FALSE;
127 if ( slider->width() == 0 ) 128 if ( slider->width() == 0 )
128 return; 129 return;
129 long val = long((double)slider->value() * mediaPlayerState->length() / slider->width()); 130 long val = long((double)slider->value() * mediaPlayerState->length() / slider->width());
130 mediaPlayerState->setPosition( val ); 131 mediaPlayerState->setPosition( val );
131} 132}
132 133
133 134
134void AudioWidget::setPosition( long i ) { 135void AudioWidget::setPosition( long i ) {
135 updateSlider( i, mediaPlayerState->length() ); 136 updateSlider( i, mediaPlayerState->length() );
136} 137}
137 138
138 139
139void AudioWidget::setLength( long max ) { 140void AudioWidget::setLength( long max ) {
140 updateSlider( mediaPlayerState->position(), max ); 141 updateSlider( mediaPlayerState->position(), max );
141} 142}
142 143
143 144
144void AudioWidget::setView( char view ) { 145void AudioWidget::setView( char view ) {
145 if ( view == 'a' ) { 146 if ( view == 'a' ) {
146 startTimer( 150 ); 147 startTimer( 150 );
147 showMaximized(); 148 showMaximized();
148 } else { 149 } else {
149 killTimers(); 150 killTimers();
150 hide(); 151 hide();
151 } 152 }
152} 153}
153 154
154 155
155void AudioWidget::updateSlider( long i, long max ) { 156void AudioWidget::updateSlider( long i, long max ) {
156 if ( max == 0 ) 157 if ( max == 0 )
157 return; 158 return;
158 // Will flicker too much if we don't do this 159 // Will flicker too much if we don't do this
159 // Scale to something reasonable 160 // Scale to something reasonable
160 int width = slider->width(); 161 int width = slider->width();
161 int val = int((double)i * width / max); 162 int val = int((double)i * width / max);
162 if ( !audioSliderBeingMoved ) { 163 if ( !audioSliderBeingMoved ) {
163 if ( slider->value() != val ) 164 if ( slider->value() != val )
164 slider->setValue( val ); 165 slider->setValue( val );
165 if ( slider->maxValue() != width ) 166 if ( slider->maxValue() != width )
166 slider->setMaxValue( width ); 167 slider->setMaxValue( width );
167 } 168 }
168} 169}
169 170
170 171
171void AudioWidget::setToggleButton( int i, bool down ) { 172void AudioWidget::setToggleButton( int i, bool down ) {
172 if ( down != audioButtons[i].isDown ) 173 if ( down != audioButtons[i].isDown )
173 toggleButton( i ); 174 toggleButton( i );
174} 175}
175 176
176 177
177void AudioWidget::toggleButton( int i ) { 178void AudioWidget::toggleButton( int i ) {
178 audioButtons[i].isDown = !audioButtons[i].isDown; 179 audioButtons[i].isDown = !audioButtons[i].isDown;
179 QPainter p(this); 180 QPainter p(this);
180 paintButton ( &p, i ); 181 paintButton ( &p, i );
181} 182}
182 183
183 184
184void AudioWidget::paintButton( QPainter *p, int i ) { 185void AudioWidget::paintButton( QPainter *p, int i ) {
185 int x = audioButtons[i].xPos; 186 int x = audioButtons[i].xPos;
186 int y = audioButtons[i].yPos; 187 int y = audioButtons[i].yPos;
187 int offset = 22 + 14 * audioButtons[i].isBig + audioButtons[i].isDown; 188 int offset = 22 + 14 * audioButtons[i].isBig + audioButtons[i].isDown;
188 int buttonSize = 64 + audioButtons[i].isBig * (90 - 64); 189 int buttonSize = 64 + audioButtons[i].isBig * (90 - 64);
189 p->drawPixmap( x, y, *pixmaps[audioButtons[i].isBig], buttonSize * (audioButtons[i].isDown + 2 * audioButtons[i].color), 0, buttonSize, buttonSize ); 190 p->drawPixmap( x, y, *pixmaps[audioButtons[i].isBig], buttonSize * (audioButtons[i].isDown + 2 * audioButtons[i].color), 0, buttonSize, buttonSize );
190 p->drawPixmap( x + offset, y + offset, *pixmaps[2], 18 * i, 0, 18, 18 ); 191 p->drawPixmap( x + offset, y + offset, *pixmaps[2], 18 * i, 0, 18, 18 );
191} 192}
192 193
193 194
194void AudioWidget::timerEvent( QTimerEvent * ) { 195void AudioWidget::timerEvent( QTimerEvent * ) {
195 static int frame = 0; 196 static int frame = 0;
196 if ( !mediaPlayerState->paused() && audioButtons[ AudioPlay ].isDown ) { 197 if ( !mediaPlayerState->paused() && audioButtons[ AudioPlay ].isDown ) {
197 frame = frame >= 7 ? 0 : frame + 1; 198 frame = frame >= 7 ? 0 : frame + 1;
198 int x = audioButtons[AudioPlay].xPos; 199 int x = audioButtons[AudioPlay].xPos;
199 int y = audioButtons[AudioPlay].yPos; 200 int y = audioButtons[AudioPlay].yPos;
200 QPainter p( this ); 201 QPainter p( this );
201 // Optimize to only draw the little bit of the changing images which is different 202 // Optimize to only draw the little bit of the changing images which is different
202 p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 ); 203 p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 );
203 p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 ); 204 p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 );
204 } 205 }
205} 206}
206 207
207 208
208void AudioWidget::mouseMoveEvent( QMouseEvent *event ) { 209void AudioWidget::mouseMoveEvent( QMouseEvent *event ) {
209 for ( int i = 0; i < numButtons; i++ ) { 210 for ( int i = 0; i < numButtons; i++ ) {
210 int size = audioButtons[i].isBig; 211 int size = audioButtons[i].isBig;
211 int x = audioButtons[i].xPos; 212 int x = audioButtons[i].xPos;
212 int y = audioButtons[i].yPos; 213 int y = audioButtons[i].yPos;
213 if ( event->state() == QMouseEvent::LeftButton ) { 214 if ( event->state() == QMouseEvent::LeftButton ) {
214 // The test to see if the mouse click is inside the circular button or not 215 // The test to see if the mouse click is inside the circular button or not
215 // (compared with the radius squared to avoid a square-root of our distance) 216 // (compared with the radius squared to avoid a square-root of our distance)
216 int radius = 32 + 13 * size; 217 int radius = 32 + 13 * size;
217 QPoint center = QPoint( x + radius, y + radius ); 218 QPoint center = QPoint( x + radius, y + radius );
218 QPoint dXY = center - event->pos(); 219 QPoint dXY = center - event->pos();
219 int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); 220 int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y();
220 bool isOnButton = dist <= (radius * radius); 221 bool isOnButton = dist <= (radius * radius);
221// QRect r( x, y, 64 + 22*size, 64 + 22*size ); 222// QRect r( x, y, 64 + 22*size, 64 + 22*size );
222// bool isOnButton = r.contains( event->pos() ); // Rectangular Button code 223// bool isOnButton = r.contains( event->pos() ); // Rectangular Button code
223 if ( isOnButton && !audioButtons[i].isHeld ) { 224 if ( isOnButton && !audioButtons[i].isHeld ) {
224 audioButtons[i].isHeld = TRUE; 225 audioButtons[i].isHeld = TRUE;
225 toggleButton(i); 226 toggleButton(i);
226 qDebug("button toggled1 %d",i); 227 qDebug("button toggled1 %d",i);
227 switch (i) { 228 switch (i) {
228 case AudioVolumeUp: emit moreClicked(); return; 229 case AudioVolumeUp: emit moreClicked(); return;
229 case AudioVolumeDown: emit lessClicked(); return; 230 case AudioVolumeDown: emit lessClicked(); return;
230 } 231 }
231 } else if ( !isOnButton && audioButtons[i].isHeld ) { 232 } else if ( !isOnButton && audioButtons[i].isHeld ) {
232 audioButtons[i].isHeld = FALSE; 233 audioButtons[i].isHeld = FALSE;
233 toggleButton(i); 234 toggleButton(i);
234 qDebug("button toggled2 %d",i); 235 qDebug("button toggled2 %d",i);
235 } 236 }
236 } else { 237 } else {
237 if ( audioButtons[i].isHeld ) { 238 if ( audioButtons[i].isHeld ) {
238 audioButtons[i].isHeld = FALSE; 239 audioButtons[i].isHeld = FALSE;
239 if ( !audioButtons[i].isToggle ) 240 if ( !audioButtons[i].isToggle )
240 setToggleButton( i, FALSE ); 241 setToggleButton( i, FALSE );
241 qDebug("button toggled3 %d",i); 242 qDebug("button toggled3 %d",i);
242 switch (i) { 243 switch (i) {
243 case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return; 244 case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return;
244 case AudioStop: mediaPlayerState->setPlaying(FALSE); return; 245 case AudioStop: mediaPlayerState->setPlaying(FALSE); return;
245 case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); return; 246 case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); return;
246 case AudioNext: mediaPlayerState->setNext(); return; 247 case AudioNext: mediaPlayerState->setNext(); return;
247 case AudioPrevious: mediaPlayerState->setPrev(); return; 248 case AudioPrevious: mediaPlayerState->setPrev(); return;
248 case AudioLoop: mediaPlayerState->setLooping(audioButtons[i].isDown); return; 249 case AudioLoop: mediaPlayerState->setLooping(audioButtons[i].isDown); return;
249 case AudioVolumeUp: emit moreReleased(); return; 250 case AudioVolumeUp: emit moreReleased(); return;
250 case AudioVolumeDown: emit lessReleased(); return; 251 case AudioVolumeDown: emit lessReleased(); return;
251 case AudioPlayList: mediaPlayerState->setList(); return; 252 case AudioPlayList: mediaPlayerState->setList(); return;
252 } 253 }
253 } 254 }
254 } 255 }
255 } 256 }
256} 257}
257 258
258 259
259void AudioWidget::mousePressEvent( QMouseEvent *event ) { 260void AudioWidget::mousePressEvent( QMouseEvent *event ) {
260 mouseMoveEvent( event ); 261 mouseMoveEvent( event );
261} 262}
262 263
263 264
264void AudioWidget::mouseReleaseEvent( QMouseEvent *event ) { 265void AudioWidget::mouseReleaseEvent( QMouseEvent *event ) {
265 mouseMoveEvent( event ); 266 mouseMoveEvent( event );
266} 267}
267 268
268 269
269void AudioWidget::showEvent( QShowEvent* ) { 270void AudioWidget::showEvent( QShowEvent* ) {
270 QMouseEvent event( QEvent::MouseMove, QPoint( 0, 0 ), 0, 0 ); 271 QMouseEvent event( QEvent::MouseMove, QPoint( 0, 0 ), 0, 0 );
271 mouseMoveEvent( &event ); 272 mouseMoveEvent( &event );
272} 273}
273 274
274 275
275void AudioWidget::closeEvent( QCloseEvent* ) { 276void AudioWidget::closeEvent( QCloseEvent* ) {
276 mediaPlayerState->setList(); 277 mediaPlayerState->setList();
277} 278}
278 279
279 280
280void AudioWidget::paintEvent( QPaintEvent * ) { 281void AudioWidget::paintEvent( QPaintEvent * ) {
281 QPainter p( this ); 282 QPainter p( this );
282 for ( int i = 0; i < numButtons; i++ ) 283 for ( int i = 0; i < numButtons; i++ )
283 paintButton( &p, i ); 284 paintButton( &p, i );
284} 285}
285 286
286 287
287void AudioWidget::keyReleaseEvent( QKeyEvent *e) 288void AudioWidget::keyReleaseEvent( QKeyEvent *e)
288{ 289{
289 switch ( e->key() ) { 290 switch ( e->key() ) {
290////////////////////////////// Zaurus keys 291////////////////////////////// Zaurus keys
291 case Key_Home: 292 case Key_Home:
292 break; 293 break;
293 case Key_F9: //activity 294 case Key_F9: //activity
294 break; 295 break;
295 case Key_F10: //contacts 296 case Key_F10: //contacts
296 break; 297 break;
297 case Key_F11: //menu 298 case Key_F11: //menu
298 break; 299 break;
299 case Key_F12: //home 300 case Key_F12: //home
300 break; 301 break;
301 case Key_F13: //mail 302 case Key_F13: //mail
302 break; 303 break;
303 case Key_Space: { 304 case Key_Space: {
304 if(mediaPlayerState->playing()) { 305 if(mediaPlayerState->playing()) {
305// toggleButton(1); 306// toggleButton(1);
306 mediaPlayerState->setPlaying(FALSE); 307 mediaPlayerState->setPlaying(FALSE);
307// toggleButton(1); 308// toggleButton(1);
308 } else { 309 } else {
309// toggleButton(0); 310// toggleButton(0);
310 mediaPlayerState->setPlaying(TRUE); 311 mediaPlayerState->setPlaying(TRUE);
311// toggleButton(0); 312// toggleButton(0);
312 } 313 }
313 } 314 }
314 break; 315 break;
315 case Key_Down: 316 case Key_Down:
316 toggleButton(6); 317 toggleButton(6);
317 emit lessClicked(); 318 emit lessClicked();
318 emit lessReleased(); 319 emit lessReleased();
319 toggleButton(6); 320 toggleButton(6);
320 break; 321 break;
321 case Key_Up: 322 case Key_Up:
322 toggleButton(5); 323 toggleButton(5);
323 emit moreClicked(); 324 emit moreClicked();
324 emit moreReleased(); 325 emit moreReleased();
325 toggleButton(5); 326 toggleButton(5);
326 break; 327 break;
327 case Key_Right: 328 case Key_Right:
328// toggleButton(3); 329// toggleButton(3);
329 mediaPlayerState->setNext(); 330 mediaPlayerState->setNext();
330// toggleButton(3); 331// toggleButton(3);
331 break; 332 break;
332 case Key_Left: 333 case Key_Left:
333// toggleButton(4); 334// toggleButton(4);
334 mediaPlayerState->setPrev(); 335 mediaPlayerState->setPrev();
335// toggleButton(4); 336// toggleButton(4);
336 break; 337 break;
337 case Key_Escape: 338 case Key_Escape:
338 break; 339 break;
339 340
340 }; 341 };
341} 342}
diff --git a/core/multimedia/opieplayer/libmpeg3/libmpeg3.pro b/core/multimedia/opieplayer/libmpeg3/libmpeg3.pro
index e50aa4e..f5e5954 100644
--- a/core/multimedia/opieplayer/libmpeg3/libmpeg3.pro
+++ b/core/multimedia/opieplayer/libmpeg3/libmpeg3.pro
@@ -1,43 +1,43 @@
1TEMPLATE = lib 1TEMPLATE = lib
2CONFIG += qt warn_on release 2CONFIG += qt warn_on release
3HEADERS = libmpeg3plugin.h libmpeg3pluginimpl.h 3HEADERS = libmpeg3plugin.h libmpeg3pluginimpl.h
4SOURCES = libmpeg3plugin.cpp libmpeg3pluginimpl.cpp \ 4SOURCES = libmpeg3plugin.cpp libmpeg3pluginimpl.cpp \
5 bitstream.c \ 5 bitstream.c \
6 libmpeg3.c \ 6 libmpeg3.c \
7 mpeg3atrack.c \ 7 mpeg3atrack.c \
8 mpeg3css.c \ 8 mpeg3css.c \
9 mpeg3demux.c \ 9 mpeg3demux.c \
10 mpeg3io.c \ 10 mpeg3io.c \
11 mpeg3title.c \ 11 mpeg3title.c \
12 mpeg3vtrack.c \ 12 mpeg3vtrack.c \
13 audio/ac3.c \ 13 audio/ac3.c \
14 audio/bit_allocation.c \ 14 audio/bit_allocation.c \
15 audio/dct.c \ 15 audio/dct.c \
16 audio/exponents.c \ 16 audio/exponents.c \
17 audio/header.c \ 17 audio/header.c \
18 audio/layer2.c \ 18 audio/layer2.c \
19 audio/layer3.c \ 19 audio/layer3.c \
20 audio/mantissa.c \ 20 audio/mantissa.c \
21 audio/mpeg3audio.c \ 21 audio/mpeg3audio.c \
22 audio/pcm.c \ 22 audio/pcm.c \
23 audio/synthesizers.c \ 23 audio/synthesizers.c \
24 audio/tables.c \ 24 audio/tables.c \
25 video/getpicture.c \ 25 video/getpicture.c \
26 video/headers.c \ 26 video/headers.c \
27 video/idct.c \ 27 video/idct.c \
28 video/macroblocks.c \ 28 video/macroblocks.c \
29 video/mmxtest.c \ 29 video/mmxtest.c \
30 video/motion.c \ 30 video/motion.c \
31 video/mpeg3video.c \ 31 video/mpeg3video.c \
32 video/output.c \ 32 video/output.c \
33 video/reconstruct.c \ 33 video/reconstruct.c \
34 video/seek.c \ 34 video/seek.c \
35 video/slice.c \ 35 video/slice.c \
36 video/vlc.c 36 video/vlc.c
37TARGET = mpeg3plugin 37TARGET = mpeg3plugin
38TMAKE_CC=g++ 38TMAKE_CC=g++
39DESTDIR = ../../plugins/codecs 39DESTDIR = $(OPIEDIR)/plugins/codecs
40INCLUDEPATH += $(OPIEDIR)/include .. 40INCLUDEPATH += $(OPIEDIR)/include ..
41DEPENDPATH += ../$(OPIEDIR)/include .. 41DEPENDPATH += ../$(OPIEDIR)/include ..
42LIBS += -lqpe -lpthread -lm 42LIBS += -lqpe -lpthread -lm
43VERSION = 1.0.0 43VERSION = 1.0.0
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index 15175d0..01596a0 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -1,480 +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
251// if( mediaPlayerState->isStreaming == FALSE)
252 audioSampleCounter = currentSample + samplesRead - 1; 252 audioSampleCounter = currentSample + samplesRead - 1;
253 253
254 moreAudio = readOk && (audioSampleCounter <= total_audio_samples); 254 moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
255 255
256 } else { 256 } else {
257 257
258 moreAudio = FALSE; 258 moreAudio = FALSE;
259 259
260 } 260 }
261 261
262 } 262 }
263 263
264 audioMutex->unlock(); 264 audioMutex->unlock();
265} 265}
266 266
267 267
268void LoopControl::killTimers() { 268void LoopControl::killTimers() {
269 269
270 audioMutex->lock(); 270 audioMutex->lock();
271 271
272 if ( hasVideoChannel ) 272 if ( hasVideoChannel )
273 killTimer( videoId ); 273 killTimer( videoId );
274 killTimer( sliderId ); 274 killTimer( sliderId );
275 threadOkToGo = FALSE; 275 threadOkToGo = FALSE;
276 276
277 audioMutex->unlock(); 277 audioMutex->unlock();
278} 278}
279 279
280 280
281void LoopControl::startTimers() { 281void LoopControl::startTimers() {
282 282
283 audioMutex->lock(); 283 audioMutex->lock();
284 284
285 moreVideo = FALSE; 285 moreVideo = FALSE;
286 moreAudio = FALSE; 286 moreAudio = FALSE;
287 287
288 if ( hasVideoChannel ) { 288 if ( hasVideoChannel ) {
289 moreVideo = TRUE; 289 moreVideo = TRUE;
290 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value 290 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
291 videoId = startTimer( mSecsBetweenFrames ); 291 videoId = startTimer( mSecsBetweenFrames );
292 } 292 }
293 293
294 if ( hasAudioChannel ) { 294 if ( hasAudioChannel ) {
295 moreAudio = TRUE; 295 moreAudio = TRUE;
296 threadOkToGo = TRUE; 296 threadOkToGo = TRUE;
297 } 297 }
298 298
299 sliderId = startTimer( 300 ); // update slider every 1/3 second 299 sliderId = startTimer( 300 ); // update slider every 1/3 second
300 300
301 audioMutex->unlock(); 301 audioMutex->unlock();
302} 302}
303 303
304 304
305void LoopControl::setPaused( bool pause ) { 305void LoopControl::setPaused( bool pause ) {
306 306
307 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) 307 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
308 return; 308 return;
309 309
310 if ( pause ) { 310 if ( pause ) {
311 killTimers(); 311 killTimers();
312 } else { 312 } else {
313 // Force an update of the position 313 // Force an update of the position
314 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 314 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
315 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 315 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
316 // Just like we never stopped 316 // Just like we never stopped
317 startTimers(); 317 startTimers();
318 } 318 }
319} 319}
320 320
321 321
322void LoopControl::stop( bool willPlayAgainShortly ) { 322void LoopControl::stop( bool willPlayAgainShortly ) {
323 323
324#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 324#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
325 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { 325 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) {
326 disabledSuspendScreenSaver = FALSE; 326 disabledSuspendScreenSaver = FALSE;
327 // Re-enable the suspend mode 327 // Re-enable the suspend mode
328 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 328 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
329 } 329 }
330#endif 330#endif
331 331
332 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { 332 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
333 333
334 killTimers(); 334 killTimers();
335 335
336 audioMutex->lock(); 336 audioMutex->lock();
337 337
338 mediaPlayerState->curDecoder()->close(); 338 mediaPlayerState->curDecoder()->close();
339 339
340 if ( audioDevice ) { 340 if ( audioDevice ) {
341 delete audioDevice; 341 delete audioDevice;
342 delete audioBuffer; 342 delete audioBuffer;
343 audioDevice = 0; 343 audioDevice = 0;
344 audioBuffer = 0; 344 audioBuffer = 0;
345 } 345 }
346 346
347 audioMutex->unlock(); 347 audioMutex->unlock();
348 348
349 } 349 }
350} 350}
351 351
352 352
353bool LoopControl::init( const QString& filename ) { 353bool LoopControl::init( const QString& filename ) {
354 stop(); 354 stop();
355 355
356 audioMutex->lock(); 356 audioMutex->lock();
357 357
358 fileName = filename; 358 fileName = filename;
359 stream = 0; // only play stream 0 for now 359 stream = 0; // only play stream 0 for now
360 current_frame = total_video_frames = total_audio_samples = 0; 360 current_frame = total_video_frames = total_audio_samples = 0;
361 361
362 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); 362 qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() );
363 363
364 // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin 364 // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin
365 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) { 365 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) {
366 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename ) ) { 366 if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename ) ) {
367 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); 367 total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 );
368 mediaPlayerState->libMpeg3Decoder()->close(); 368 mediaPlayerState->libMpeg3Decoder()->close();
369 } 369 }
370 } 370 }
371 371
372 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { 372 if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) {
373 audioMutex->unlock(); 373 audioMutex->unlock();
374 return FALSE; 374 return FALSE;
375 } 375 }
376 376
377 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; 377 hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0;
378 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; 378 hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;
379 379
380 if ( hasAudioChannel ) { 380 if ( hasAudioChannel ) {
381 int astream = 0; 381 int astream = 0;
382 382
383 channels = mediaPlayerState->curDecoder()->audioChannels( astream ); 383 channels = mediaPlayerState->curDecoder()->audioChannels( astream );
384 qDebug( "LC- channels = %d", channels ); 384 qDebug( "LC- channels = %d", channels );
385 385
386 if ( !total_audio_samples ) 386 if ( !total_audio_samples )
387 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); 387 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
388 388
389// total_audio_samples += 1000; 389// total_audio_samples += 1000;
390 390
391 mediaPlayerState->setLength( total_audio_samples ); 391 mediaPlayerState->setLength( total_audio_samples );
392 392
393 freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); 393 freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
394 qDebug( "LC- frequency = %d", freq ); 394 qDebug( "LC- frequency = %d", freq );
395 395
396 audioSampleCounter = 0; 396 audioSampleCounter = 0;
397 int bits_per_sample; 397 int bits_per_sample;
398 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { 398 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
399 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); 399 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
400 qDebug("using stupid hack"); 400 qDebug("using stupid hack");
401 } else { 401 } else {
402 bits_per_sample=0; 402 bits_per_sample=0;
403 } 403 }
404 404
405 audioDevice = new AudioDevice( freq, channels, bits_per_sample); 405 audioDevice = new AudioDevice( freq, channels, bits_per_sample);
406 audioBuffer = new char[ audioDevice->bufferSize() ]; 406 audioBuffer = new char[ audioDevice->bufferSize() ];
407 channels = audioDevice->channels(); 407 channels = audioDevice->channels();
408 408
409 //### must check which frequency is actually used. 409 //### must check which frequency is actually used.
410 static const int size = 1; 410 static const int size = 1;
411 short int buf[size]; 411 short int buf[size];
412 long samplesRead = 0; 412 long samplesRead = 0;
413 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); 413 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
414 } 414 }
415 415
416 if ( hasVideoChannel ) { 416 if ( hasVideoChannel ) {
417 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); 417 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
418 418
419 mediaPlayerState->setLength( total_video_frames ); 419 mediaPlayerState->setLength( total_video_frames );
420 420
421 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); 421 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
422 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); 422 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
423 423
424 if ( framerate <= 1.0 ) { 424 if ( framerate <= 1.0 ) {
425 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); 425 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
426 framerate = 25; 426 framerate = 25;
427 } 427 }
428 428
429 if ( total_video_frames == 1 ) { 429 if ( total_video_frames == 1 ) {
430 DecodeLoopDebug(( "Cannot seek to frame" )); 430 DecodeLoopDebug(( "Cannot seek to frame" ));
431 } 431 }
432 432
433 } 433 }
434 434
435 current_frame = 0; 435 current_frame = 0;
436 prev_frame = -1; 436 prev_frame = -1;
437 437
438 if( fileName.left(7) == "http://") 438 if( fileName.left(7) == "http://")
439 mediaPlayerState->isStreaming = TRUE; 439 mediaPlayerState->isStreaming = TRUE;
440 440
441 connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) ); 441 connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) );
442 connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) ); 442 connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) );
443 443
444 audioMutex->unlock(); 444 audioMutex->unlock();
445 445
446 return TRUE; 446 return TRUE;
447} 447}
448 448
449 449
450void LoopControl::play() { 450void LoopControl::play() {
451 qDebug("LC- play"); 451 qDebug("LC- play");
452#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 452#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
453 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { 453 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) {
454 disabledSuspendScreenSaver = TRUE; 454 disabledSuspendScreenSaver = TRUE;
455 previousSuspendMode = hasVideoChannel; 455 previousSuspendMode = hasVideoChannel;
456 // Stop the screen from blanking and power saving state 456 // Stop the screen from blanking and power saving state
457 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) 457 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" )
458 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); 458 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend );
459 } 459 }
460#endif 460#endif
461 461
462 playtime.start(); 462 playtime.start();
463 startTimers(); 463 startTimers();
464} 464}
465 465
466 466
467void LoopControl::setMute( bool on ) { 467void LoopControl::setMute( bool on ) {
468 if ( on != isMuted ) { 468 if ( on != isMuted ) {
469 isMuted = on; 469 isMuted = on;
470 if ( !on ) { 470 if ( !on ) {
471 // Force an update of the position 471 // Force an update of the position
472 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 472 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
473 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 473 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
474 // Resume playing audio 474 // Resume playing audio
475 moreAudio = TRUE; 475 moreAudio = TRUE;
476 } 476 }
477 } 477 }
478} 478}
479 479
480 480
diff --git a/core/multimedia/opieplayer/wavplugin/wavplugin.pro b/core/multimedia/opieplayer/wavplugin/wavplugin.pro
index 2160431..f0834de 100644
--- a/core/multimedia/opieplayer/wavplugin/wavplugin.pro
+++ b/core/multimedia/opieplayer/wavplugin/wavplugin.pro
@@ -1,10 +1,10 @@
1 TEMPLATE= lib 1 TEMPLATE= lib
2 CONFIG += qt warn_on release 2 CONFIG += qt warn_on release
3 HEADERS = wavplugin.h wavpluginimpl.h 3 HEADERS = wavplugin.h wavpluginimpl.h
4 SOURCES = wavplugin.cpp wavpluginimpl.cpp 4 SOURCES = wavplugin.cpp wavpluginimpl.cpp
5 TARGET = wavplugin 5 TARGET = wavplugin
6 DESTDIR = ../../plugins/codecs 6 DESTDIR = $(OPIEDIR)/plugins/codecs
7INCLUDEPATH += $(OPIEDIR)/include .. 7INCLUDEPATH += $(OPIEDIR)/include ..
8DEPENDPATH += ../$(OPIEDIR)/include .. 8DEPENDPATH += ../$(OPIEDIR)/include ..
9LIBS += -lqpe 9LIBS += -lqpe
10 VERSION = 1.0.0 10 VERSION = 1.0.0