summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/audiodevice.cpp292
-rw-r--r--core/multimedia/opieplayer/audiowidget.cpp2
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp384
-rw-r--r--core/multimedia/opieplayer/mediaplayer.cpp1
-rw-r--r--core/multimedia/opieplayer/mediaplayerstate.cpp80
-rw-r--r--core/multimedia/opieplayer/playlistwidget.cpp43
6 files changed, 406 insertions, 396 deletions
diff --git a/core/multimedia/opieplayer/audiodevice.cpp b/core/multimedia/opieplayer/audiodevice.cpp
index 3262e38..4c5f12d 100644
--- a/core/multimedia/opieplayer/audiodevice.cpp
+++ b/core/multimedia/opieplayer/audiodevice.cpp
@@ -1,22 +1,22 @@
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 better error code Fri 02-15-2002 14:37:47 20// L.J.Potter added better error code Fri 02-15-2002 14:37:47
21 21
22 22
@@ -30,12 +30,11 @@
30#include "qpe/qcopenvelope_qws.h" 30#include "qpe/qcopenvelope_qws.h"
31#endif 31#endif
32 32
33#ifdef Q_WS_WIN 33// #ifdef Q_WS_WIN
34#include <windows.h> 34// #include <windows.h>
35#include <mmsystem.h> 35// #include <mmsystem.h>
36#include <mmreg.h> 36// #include <mmreg.h>
37#endif 37// #endif
38
39#if defined(Q_WS_X11) || defined(Q_WS_QWS) 38#if defined(Q_WS_X11) || defined(Q_WS_QWS)
40#include <fcntl.h> 39#include <fcntl.h>
41#include <sys/ioctl.h> 40#include <sys/ioctl.h>
@@ -46,18 +45,18 @@
46#include <unistd.h> 45#include <unistd.h>
47#endif 46#endif
48 47
49#if defined(Q_OS_WIN32) 48// #if defined(Q_OS_WIN32)
50static const int expectedBytesPerMilliSecond = 2 * 2 * 44000 / 1000; 49// static const int expectedBytesPerMilliSecond = 2 * 2 * 44000 / 1000;
51static const int timerResolutionMilliSeconds = 30; 50// static const int timerResolutionMilliSeconds = 30;
52static const int sound_fragment_bytes = timerResolutionMilliSeconds * expectedBytesPerMilliSecond; 51// static const int sound_fragment_bytes = timerResolutionMilliSeconds * expectedBytesPerMilliSecond;
53#else 52// #else
54# if defined(QT_QWS_IPAQ) 53# if defined(QT_QWS_IPAQ)
55static const int sound_fragment_shift = 14; 54static const int sound_fragment_shift = 14;
56# else 55# else
57static const int sound_fragment_shift = 16; 56static const int sound_fragment_shift = 16;
58# endif 57# endif
59static const int sound_fragment_bytes = (1<<sound_fragment_shift); 58static const int sound_fragment_bytes = (1<<sound_fragment_shift);
60#endif 59//#endif
61 60
62 61
63class AudioDevicePrivate { 62class AudioDevicePrivate {
@@ -67,11 +66,11 @@ public:
67 unsigned int channels; 66 unsigned int channels;
68 unsigned int bytesPerSample; 67 unsigned int bytesPerSample;
69 unsigned int bufferSize; 68 unsigned int bufferSize;
70#ifndef Q_OS_WIN32 69//#ifndef Q_OS_WIN32
71 bool can_GETOSPACE; 70 bool can_GETOSPACE;
72 char* unwrittenBuffer; 71 char* unwrittenBuffer;
73 unsigned int unwritten; 72 unsigned int unwritten;
74#endif 73//#endif
75 74
76 static int dspFd; 75 static int dspFd;
77 static bool muted; 76 static bool muted;
@@ -97,64 +96,64 @@ unsigned int AudioDevicePrivate::rightVolume = 0;
97void AudioDevice::getVolume( unsigned int& leftVolume, unsigned int& rightVolume, bool &muted ) { 96void AudioDevice::getVolume( unsigned int& leftVolume, unsigned int& rightVolume, bool &muted ) {
98 muted = AudioDevicePrivate::muted; 97 muted = AudioDevicePrivate::muted;
99 unsigned int volume; 98 unsigned int volume;
100#ifdef Q_OS_WIN32 99// #ifdef Q_OS_WIN32
101 HWAVEOUT handle; 100// HWAVEOUT handle;
102 WAVEFORMATEX formatData; 101// WAVEFORMATEX formatData;
103 formatData.cbSize = sizeof(WAVEFORMATEX); 102// formatData.cbSize = sizeof(WAVEFORMATEX);
104 formatData.wFormatTag = WAVE_FORMAT_PCM; 103// formatData.wFormatTag = WAVE_FORMAT_PCM;
105 formatData.nAvgBytesPerSec = 4 * 44000; 104// formatData.nAvgBytesPerSec = 4 * 44000;
106 formatData.nBlockAlign = 4; 105// formatData.nBlockAlign = 4;
107 formatData.nChannels = 2; 106// formatData.nChannels = 2;
108 formatData.nSamplesPerSec = 44000; 107// formatData.nSamplesPerSec = 44000;
109 formatData.wBitsPerSample = 16; 108// formatData.wBitsPerSample = 16;
110 waveOutOpen(&handle, WAVE_MAPPER, &formatData, 0L, 0L, CALLBACK_NULL); 109// waveOutOpen(&handle, WAVE_MAPPER, &formatData, 0L, 0L, CALLBACK_NULL);
111 if ( waveOutGetVolume( handle, (LPDWORD)&volume ) ) 110// if ( waveOutGetVolume( handle, (LPDWORD)&volume ) )
112// qDebug( "get volume of audio device failed" ); 111// // qDebug( "get volume of audio device failed" );
113 waveOutClose( handle ); 112// waveOutClose( handle );
114 leftVolume = volume & 0xFFFF; 113// leftVolume = volume & 0xFFFF;
115 rightVolume = volume >> 16; 114// rightVolume = volume >> 16;
116#else 115// #else
117 int mixerHandle = open( "/dev/mixer", O_RDWR ); 116 int mixerHandle = open( "/dev/mixer", O_RDWR );
118 if ( mixerHandle >= 0 ) { 117 if ( mixerHandle >= 0 ) {
119 if(ioctl( mixerHandle, MIXER_READ(0), &volume )==-1) 118 if(ioctl( mixerHandle, MIXER_READ(0), &volume )==-1)
120 perror("ioctl(\"MIXER_READ\")"); 119 perror("ioctl(\"MIXER_READ\")");
121 close( mixerHandle ); 120 close( mixerHandle );
122 } else 121 } else
123 perror("open(\"/dev/mixer\")"); 122 perror("open(\"/dev/mixer\")");
124 leftVolume = ((volume & 0x00FF) << 16) / 101; 123 leftVolume = ((volume & 0x00FF) << 16) / 101;
125 rightVolume = ((volume & 0xFF00) << 8) / 101; 124 rightVolume = ((volume & 0xFF00) << 8) / 101;
126#endif 125//#endif
127} 126}
128 127
129 128
130void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume, bool muted ) { 129void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume, bool muted ) {
131 AudioDevicePrivate::muted = muted; 130 AudioDevicePrivate::muted = muted;
132 if ( muted ) { 131 if ( muted ) {
133 AudioDevicePrivate::leftVolume = leftVolume; 132 AudioDevicePrivate::leftVolume = leftVolume;
134 AudioDevicePrivate::rightVolume = rightVolume; 133 AudioDevicePrivate::rightVolume = rightVolume;
135 leftVolume = 0; 134 leftVolume = 0;
136 rightVolume = 0; 135 rightVolume = 0;
137 } else { 136 } else {
138 leftVolume = ( (int) leftVolume < 0 ) ? 0 : (( leftVolume > 0xFFFF ) ? 0xFFFF : leftVolume ); 137 leftVolume = ( (int) leftVolume < 0 ) ? 0 : (( leftVolume > 0xFFFF ) ? 0xFFFF : leftVolume );
139 rightVolume = ( (int)rightVolume < 0 ) ? 0 : (( rightVolume > 0xFFFF ) ? 0xFFFF : rightVolume ); 138 rightVolume = ( (int)rightVolume < 0 ) ? 0 : (( rightVolume > 0xFFFF ) ? 0xFFFF : rightVolume );
140 } 139 }
141#ifdef Q_OS_WIN32 140// #ifdef Q_OS_WIN32
142 HWAVEOUT handle; 141// HWAVEOUT handle;
143 WAVEFORMATEX formatData; 142// WAVEFORMATEX formatData;
144 formatData.cbSize = sizeof(WAVEFORMATEX); 143// formatData.cbSize = sizeof(WAVEFORMATEX);
145 formatData.wFormatTag = WAVE_FORMAT_PCM; 144// formatData.wFormatTag = WAVE_FORMAT_PCM;
146 formatData.nAvgBytesPerSec = 4 * 44000; 145// formatData.nAvgBytesPerSec = 4 * 44000;
147 formatData.nBlockAlign = 4; 146// formatData.nBlockAlign = 4;
148 formatData.nChannels = 2; 147// formatData.nChannels = 2;
149 formatData.nSamplesPerSec = 44000; 148// formatData.nSamplesPerSec = 44000;
150 formatData.wBitsPerSample = 16; 149// formatData.wBitsPerSample = 16;
151 waveOutOpen(&handle, WAVE_MAPPER, &formatData, 0L, 0L, CALLBACK_NULL); 150// waveOutOpen(&handle, WAVE_MAPPER, &formatData, 0L, 0L, CALLBACK_NULL);
152 unsigned int volume = (rightVolume << 16) | leftVolume; 151// unsigned int volume = (rightVolume << 16) | leftVolume;
153 if ( waveOutSetVolume( handle, volume ) ) 152// if ( waveOutSetVolume( handle, volume ) )
154// qDebug( "set volume of audio device failed" ); 153// // qDebug( "set volume of audio device failed" );
155 waveOutClose( handle ); 154// waveOutClose( handle );
156#else 155// #else
157 // Volume can be from 0 to 100 which is 101 distinct values 156 // Volume can be from 0 to 100 which is 101 distinct values
158 unsigned int rV = (rightVolume * 101) >> 16; 157 unsigned int rV = (rightVolume * 101) >> 16;
159 158
160# if 0 159# if 0
@@ -169,17 +168,17 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume,
169 perror("open(\"/dev/mixer\")"); 168 perror("open(\"/dev/mixer\")");
170 169
171# else 170# else
172 // This is the way this has to be done now I guess, doesn't allow for 171 // This is the way this has to be done now I guess, doesn't allow for
173 // independant right and left channel setting, or setting for different outputs 172 // independant right and left channel setting, or setting for different outputs
174 Config cfg("Sound"); 173 Config cfg("Sound");
175 cfg.setGroup("System"); 174 cfg.setGroup("System");
176 cfg.writeEntry("Volume",(int)rV); 175 cfg.writeEntry("Volume",(int)rV);
177# endif 176# endif
178 177
179#endif 178//#endif
180// qDebug( "setting volume to: 0x%x", volume ); 179// qDebug( "setting volume to: 0x%x", volume );
181#if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) 180#if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP)
182 // Send notification that the volume has changed 181 // Send notification that the volume has changed
183 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << muted; 182 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << muted;
184#endif 183#endif
185} 184}
@@ -188,9 +187,9 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume,
188 187
189 188
190AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) { 189AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
191 qDebug("creating new audio device"); 190 qDebug("creating new audio device");
192 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE; 191 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE;
193 d = new AudioDevicePrivate; 192 d = new AudioDevicePrivate;
194 d->frequency = f; 193 d->frequency = f;
195 d->channels = chs; 194 d->channels = chs;
196 d->bytesPerSample = bps; 195 d->bytesPerSample = bps;
@@ -209,12 +208,12 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
209#ifdef KEEP_DEVICE_OPEN 208#ifdef KEEP_DEVICE_OPEN
210 if ( AudioDevicePrivate::dspFd == 0 ) { 209 if ( AudioDevicePrivate::dspFd == 0 ) {
211#endif 210#endif
212 if ( ( d->handle = ::open( "/dev/dsp", O_WRONLY ) ) < 0 ) { 211 if ( ( d->handle = ::open( "/dev/dsp", O_WRONLY ) ) < 0 ) {
213 perror("open(\"/dev/dsp\") sending to /dev/null instead"); 212 perror("open(\"/dev/dsp\") sending to /dev/null instead");
214 d->handle = ::open( "/dev/null", O_WRONLY ); 213 d->handle = ::open( "/dev/null", O_WRONLY );
215 } 214 }
216#ifdef KEEP_DEVICE_OPEN 215#ifdef KEEP_DEVICE_OPEN
217 AudioDevicePrivate::dspFd = d->handle; 216 AudioDevicePrivate::dspFd = d->handle;
218 } else { 217 } else {
219 d->handle = AudioDevicePrivate::dspFd; 218 d->handle = AudioDevicePrivate::dspFd;
220 } 219 }
@@ -241,12 +240,12 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
241 d->unwritten = 0; 240 d->unwritten = 0;
242 d->can_GETOSPACE = TRUE; // until we find otherwise 241 d->can_GETOSPACE = TRUE; // until we find otherwise
243 242
244 //if ( chs != d->channels ) qDebug( "Wanted %d, got %d channels", chs, d->channels ); 243 //if ( chs != d->channels ) qDebug( "Wanted %d, got %d channels", chs, d->channels );
245 //if ( f != d->frequency ) qDebug( "wanted %dHz, got %dHz", f, d->frequency ); 244 //if ( f != d->frequency ) qDebug( "wanted %dHz, got %dHz", f, d->frequency );
246 //if ( capabilities & DSP_CAP_BATCH ) qDebug( "Sound card has local buffer" ); 245 //if ( capabilities & DSP_CAP_BATCH ) qDebug( "Sound card has local buffer" );
247 //if ( capabilities & DSP_CAP_REALTIME )qDebug( "Sound card has realtime sync" ); 246 //if ( capabilities & DSP_CAP_REALTIME )qDebug( "Sound card has realtime sync" );
248 //if ( capabilities & DSP_CAP_TRIGGER ) qDebug( "Sound card has precise trigger" ); 247 //if ( capabilities & DSP_CAP_TRIGGER ) qDebug( "Sound card has precise trigger" );
249 //if ( capabilities & DSP_CAP_MMAP ) qDebug( "Sound card can mmap" ); 248 //if ( capabilities & DSP_CAP_MMAP ) qDebug( "Sound card can mmap" );
250 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE; 249 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE;
251 250
252} 251}
@@ -254,17 +253,18 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
254 253
255AudioDevice::~AudioDevice() { 254AudioDevice::~AudioDevice() {
256 qDebug("destryo audiodevice"); 255 qDebug("destryo audiodevice");
257 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE; 256 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE;
258 257
259#ifdef Q_OS_WIN32 258// #ifdef Q_OS_WIN32
260 waveOutClose( (HWAVEOUT)d->handle ); 259// waveOutClose( (HWAVEOUT)d->handle );
261#else 260// #else
262# ifndef KEEP_DEVICE_OPEN 261# ifndef KEEP_DEVICE_OPEN
263 close( d->handle ); // Now it should be safe to shut the handle 262 close( d->handle ); // Now it should be safe to shut the handle
264# endif 263# endif
265 delete d->unwrittenBuffer; 264 delete d->unwrittenBuffer;
266 delete d; 265 delete d;
267#endif 266//#endif
267 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE;
268 268
269} 269}
270 270
@@ -277,28 +277,28 @@ void AudioDevice::volumeChanged( bool muted )
277 277
278void AudioDevice::write( char *buffer, unsigned int length ) 278void AudioDevice::write( char *buffer, unsigned int length )
279{ 279{
280#ifdef Q_OS_WIN32 280// #ifdef Q_OS_WIN32
281 // returns immediately and (to be implemented) emits completedIO() when finished writing 281// // returns immediately and (to be implemented) emits completedIO() when finished writing
282 WAVEHDR *lpWaveHdr = (WAVEHDR *)malloc( sizeof(WAVEHDR) ); 282// WAVEHDR *lpWaveHdr = (WAVEHDR *)malloc( sizeof(WAVEHDR) );
283 // maybe the buffer should be copied so that this fool proof, but its a performance hit 283// // maybe the buffer should be copied so that this fool proof, but its a performance hit
284 lpWaveHdr->lpData = buffer; 284// lpWaveHdr->lpData = buffer;
285 lpWaveHdr->dwBufferLength = length; 285// lpWaveHdr->dwBufferLength = length;
286 lpWaveHdr->dwFlags = 0L; 286// lpWaveHdr->dwFlags = 0L;
287 lpWaveHdr->dwLoops = 0L; 287// lpWaveHdr->dwLoops = 0L;
288 waveOutPrepareHeader( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ); 288// waveOutPrepareHeader( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) );
289 // waveOutWrite returns immediately. the data is sent in the background. 289// // waveOutWrite returns immediately. the data is sent in the background.
290 if ( waveOutWrite( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ) ) 290// if ( waveOutWrite( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ) )
291 qDebug( "failed to write block to audio device" ); 291// qDebug( "failed to write block to audio device" );
292 // emit completedIO(); 292// // emit completedIO();
293#else 293// #else
294 int t = ::write( d->handle, buffer, length ); 294 int t = ::write( d->handle, buffer, length );
295 if ( t<0 ) t = 0; 295 if ( t<0 ) t = 0;
296 if ( t != (int)length) { 296 if ( t != (int)length) {
297 qDebug("Ahhh!! memcpys 1"); 297 qDebug("Ahhh!! memcpys 1");
298 memcpy(d->unwrittenBuffer,buffer+t,length-t); 298 memcpy(d->unwrittenBuffer,buffer+t,length-t);
299 d->unwritten = length-t; 299 d->unwritten = length-t;
300 } 300 }
301#endif 301//#endif
302} 302}
303 303
304 304
@@ -327,52 +327,52 @@ unsigned int AudioDevice::bufferSize() const
327 327
328unsigned int AudioDevice::canWrite() const 328unsigned int AudioDevice::canWrite() const
329{ 329{
330#ifdef Q_OS_WIN32 330// #ifdef Q_OS_WIN32
331 return bufferSize(); // Any better? 331// return bufferSize(); // Any better?
332#else 332// #else
333 audio_buf_info info; 333 audio_buf_info info;
334 if ( d->can_GETOSPACE && ioctl(d->handle,SNDCTL_DSP_GETOSPACE,&info) ) { 334 if ( d->can_GETOSPACE && ioctl(d->handle,SNDCTL_DSP_GETOSPACE,&info) ) {
335 d->can_GETOSPACE = FALSE; 335 d->can_GETOSPACE = FALSE;
336 fcntl( d->handle, F_SETFL, O_NONBLOCK ); 336 fcntl( d->handle, F_SETFL, O_NONBLOCK );
337 } 337 }
338 if ( d->can_GETOSPACE ) { 338 if ( d->can_GETOSPACE ) {
339 int t = info.fragments * sound_fragment_bytes; 339 int t = info.fragments * sound_fragment_bytes;
340 return QMIN(t,(int)bufferSize()); 340 return QMIN(t,(int)bufferSize());
341 } else { 341 } else {
342 if ( d->unwritten ) { 342 if ( d->unwritten ) {
343 int t = ::write( d->handle, d->unwrittenBuffer, d->unwritten ); 343 int t = ::write( d->handle, d->unwrittenBuffer, d->unwritten );
344 if ( t<0 ) t = 0; 344 if ( t<0 ) t = 0;
345 if ( (unsigned)t!=d->unwritten ) { 345 if ( (unsigned)t!=d->unwritten ) {
346 memcpy(d->unwrittenBuffer,d->unwrittenBuffer+t,d->unwritten-t); 346 memcpy(d->unwrittenBuffer,d->unwrittenBuffer+t,d->unwritten-t);
347 d->unwritten -= t; 347 d->unwritten -= t;
348 } else { 348 } else {
349 d->unwritten = 0; 349 d->unwritten = 0;
350 } 350 }
351 } 351 }
352 if ( d->unwritten ) 352 if ( d->unwritten )
353 return 0; 353 return 0;
354 else 354 else
355 return d->bufferSize; 355 return d->bufferSize;
356 } 356 }
357#endif 357//#endif
358} 358}
359 359
360 360
361int AudioDevice::bytesWritten() { 361int AudioDevice::bytesWritten() {
362#ifdef Q_OS_WIN32 362// #ifdef Q_OS_WIN32
363 MMTIME pmmt = { TIME_BYTES, 0 }; 363// MMTIME pmmt = { TIME_BYTES, 0 };
364 if ( ( waveOutGetPosition( (HWAVEOUT)d->handle, &pmmt, sizeof(MMTIME) ) != MMSYSERR_NOERROR ) || ( pmmt.wType != TIME_BYTES ) ) { 364// if ( ( waveOutGetPosition( (HWAVEOUT)d->handle, &pmmt, sizeof(MMTIME) ) != MMSYSERR_NOERROR ) || ( pmmt.wType != TIME_BYTES ) ) {
365 qDebug( "failed to get audio device position" ); 365// qDebug( "failed to get audio device position" );
366 return -1; 366// return -1;
367 } 367// }
368 return pmmt.u.cb; 368// return pmmt.u.cb;
369#else 369// #else
370 int buffered = 0; 370 int buffered = 0;
371 if ( ioctl( d->handle, SNDCTL_DSP_GETODELAY, &buffered ) ) { 371 if ( ioctl( d->handle, SNDCTL_DSP_GETODELAY, &buffered ) ) {
372 qDebug( "failed to get audio device position" ); 372 qDebug( "failed to get audio device position" );
373 return -1; 373 return -1;
374 } 374 }
375 return buffered; 375 return buffered;
376#endif 376//#endif
377} 377}
378 378
diff --git a/core/multimedia/opieplayer/audiowidget.cpp b/core/multimedia/opieplayer/audiowidget.cpp
index ac8c935..54e7ceb 100644
--- a/core/multimedia/opieplayer/audiowidget.cpp
+++ b/core/multimedia/opieplayer/audiowidget.cpp
@@ -143,6 +143,7 @@ void AudioWidget::sliderReleased() {
143 143
144 144
145void AudioWidget::setPosition( long i ) { 145void AudioWidget::setPosition( long i ) {
146// qDebug("set position %d",i);
146 updateSlider( i, mediaPlayerState->length() ); 147 updateSlider( i, mediaPlayerState->length() );
147} 148}
148 149
@@ -153,7 +154,6 @@ void AudioWidget::setLength( long max ) {
153 154
154 155
155void AudioWidget::setView( char view ) { 156void AudioWidget::setView( char view ) {
156
157 if (mediaPlayerState->isStreaming) { 157 if (mediaPlayerState->isStreaming) {
158 if( !slider->isHidden()) slider->hide(); 158 if( !slider->isHidden()) slider->hide();
159 disconnect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 159 disconnect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index 3171c4b..70e4a78 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -1,22 +1,22 @@
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>
@@ -59,22 +59,22 @@ bool threadOkToGo = FALSE;
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;
@@ -84,10 +84,10 @@ private:
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}
@@ -97,7 +97,7 @@ Mutex *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");
@@ -106,15 +106,15 @@ LoopControl::LoopControl( QObject *parent, const char *name )
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");
@@ -134,14 +134,14 @@ static int currentSample = 0;
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 ) {
@@ -153,28 +153,28 @@ void LoopControl::timerEvent( QTimerEvent *te ) {
153 153
154void LoopControl::setPosition( long pos ) { 154void LoopControl::setPosition( long pos ) {
155 audioMutex->lock(); 155 audioMutex->lock();
156 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();
@@ -187,32 +187,32 @@ void LoopControl::startVideo() {
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}
@@ -220,44 +220,43 @@ void LoopControl::startVideo() {
220 220
221void LoopControl::startAudio() { 221void LoopControl::startAudio() {
222 222
223//qDebug("start audio");
224 audioMutex->lock(); 223 audioMutex->lock();
225 if ( moreAudio ) { 224 if ( moreAudio ) {
226 225
227 if ( !isMuted && mediaPlayerState->curDecoder() ) { 226 if ( !isMuted && mediaPlayerState->curDecoder() ) {
228 227
229 currentSample = audioSampleCounter + 1; 228 currentSample = audioSampleCounter + 1;
230 229
231 if ( currentSample != audioSampleCounter + 1 ) 230 if ( currentSample != audioSampleCounter + 1 )
232 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter); 231 qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter);
233 232
234 long samplesRead = 0; 233 long samplesRead = 0;
235 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream ); 234 bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream );
236 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000; 235 long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000;
237 long sampleWaitTime = currentSample - sampleWeShouldBeAt; 236 long sampleWaitTime = currentSample - sampleWeShouldBeAt;
238 237
239// this causes drop outs not sure why its even here 238// this causes drop outs not sure why its even here
240 if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) { 239// if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) {
241 usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) ); 240// usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) );
242 } 241// }
243 else if ( sampleWaitTime <= -5000 ) { 242// else if ( sampleWaitTime <= -5000 ) {
244 qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt ); 243// qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt );
245// //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream ); 244// // //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream );
246 currentSample = sampleWeShouldBeAt; 245// currentSample = sampleWeShouldBeAt;
247 } 246// }
248 247
249 audioDevice->write( audioBuffer, samplesRead * 2 * channels ); 248 audioDevice->write( audioBuffer, samplesRead * 2 * channels );
250 249
251 if( mediaPlayerState->isStreaming == FALSE) 250 if( mediaPlayerState->isStreaming == FALSE)
252 audioSampleCounter = currentSample + samplesRead - 1; 251 audioSampleCounter = currentSample + samplesRead - 1;
253 252
254 moreAudio = readOk && (audioSampleCounter <= total_audio_samples); 253 moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
255 254
256 } else { 255 } else {
257 256
258 moreAudio = FALSE; 257 moreAudio = FALSE;
259 258
260 } 259 }
261 260
262 } 261 }
263 262
@@ -270,7 +269,7 @@ void LoopControl::killTimers() {
270 audioMutex->lock(); 269 audioMutex->lock();
271 270
272 if ( hasVideoChannel ) 271 if ( hasVideoChannel )
273 killTimer( videoId ); 272 killTimer( videoId );
274 killTimer( sliderId ); 273 killTimer( sliderId );
275 threadOkToGo = FALSE; 274 threadOkToGo = FALSE;
276 275
@@ -286,14 +285,14 @@ void LoopControl::startTimers() {
286 moreAudio = FALSE; 285 moreAudio = FALSE;
287 286
288 if ( hasVideoChannel ) { 287 if ( hasVideoChannel ) {
289 moreVideo = TRUE; 288 moreVideo = TRUE;
290 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value 289 int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
291 videoId = startTimer( mSecsBetweenFrames ); 290 videoId = startTimer( mSecsBetweenFrames );
292 } 291 }
293 292
294 if ( hasAudioChannel ) { 293 if ( hasAudioChannel ) {
295 moreAudio = TRUE; 294 moreAudio = TRUE;
296 threadOkToGo = TRUE; 295 threadOkToGo = TRUE;
297 } 296 }
298 297
299 sliderId = startTimer( 300 ); // update slider every 1/3 second 298 sliderId = startTimer( 300 ); // update slider every 1/3 second
@@ -305,16 +304,16 @@ void LoopControl::startTimers() {
305void LoopControl::setPaused( bool pause ) { 304void LoopControl::setPaused( bool pause ) {
306 305
307 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) 306 if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
308 return; 307 return;
309 308
310 if ( pause ) { 309 if ( pause ) {
311 killTimers(); 310 killTimers();
312 } else { 311 } else {
313 // Force an update of the position 312 // Force an update of the position
314 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 313 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
315 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 314 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
316 // Just like we never stopped 315 // Just like we never stopped
317 startTimers(); 316 startTimers();
318 } 317 }
319} 318}
320 319
@@ -323,36 +322,37 @@ void LoopControl::stop( bool willPlayAgainShortly ) {
323 322
324#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 323#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
325 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { 324 if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) {
326 disabledSuspendScreenSaver = FALSE; 325 disabledSuspendScreenSaver = FALSE;
327 // Re-enable the suspend mode 326 // Re-enable the suspend mode
328 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 327 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
329 } 328 }
330#endif 329#endif
331 330
332 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { 331 if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
333 332
334 killTimers(); 333 killTimers();
335 334
336 audioMutex->lock(); 335 audioMutex->lock();
337 336
338 mediaPlayerState->curDecoder()->close(); 337 mediaPlayerState->curDecoder()->close();
339 338
340 if ( audioDevice ) { 339 if ( audioDevice ) {
341 delete audioDevice; 340 delete audioDevice;
342 delete audioBuffer; 341 delete audioBuffer;
343 audioDevice = 0; 342 audioDevice = 0;
344 audioBuffer = 0; 343 audioBuffer = 0;
345 } 344 }
346
347 audioMutex->unlock();
348 345
346 audioMutex->unlock();
349 } 347 }
348 audioSampleCounter=0;
349 current_frame=0;
350 total_audio_samples=0;
350} 351}
351 352
352 353
353bool LoopControl::init( const QString& filename ) { 354bool LoopControl::init( const QString& filename ) {
354 stop(); 355 stop();
355
356 audioMutex->lock(); 356 audioMutex->lock();
357 357
358 fileName = filename; 358 fileName = filename;
@@ -361,7 +361,7 @@ bool LoopControl::init( const QString& filename ) {
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 );
@@ -370,69 +370,69 @@ bool LoopControl::init( const QString& filename ) {
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 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") ) 383 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") )
384 channels = 2; //dont akx me why, but it needs this hack 384 channels = 2; //dont akx me why, but it needs this hack
385 else 385 else
386 channels = mediaPlayerState->curDecoder()->audioChannels( astream ); 386 channels = mediaPlayerState->curDecoder()->audioChannels( astream );
387 387
388 qDebug( "LC- channels = %d", channels ); 388 qDebug( "LC- channels = %d", channels );
389 389
390 if ( !total_audio_samples ) 390 if ( !total_audio_samples )
391 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); 391 total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
392 392
393 total_audio_samples += 1000; 393 total_audio_samples += 1000;
394 394
395 mediaPlayerState->setLength( total_audio_samples ); 395 mediaPlayerState->setLength( total_audio_samples );
396 396
397 freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); 397 freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
398 qDebug( "LC- frequency = %d", freq ); 398 qDebug( "LC- frequency = %d", freq );
399 399
400 audioSampleCounter = 0; 400 audioSampleCounter = 0;
401 int bits_per_sample; 401 int bits_per_sample;
402 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { 402 if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
403 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); 403 bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
404 qDebug("using stupid hack"); 404 qDebug("using stupid hack");
405 } else { 405 } else {
406 bits_per_sample=0; 406 bits_per_sample=0;
407 } 407 }
408 408
409 audioDevice = new AudioDevice( freq, channels, bits_per_sample); 409 audioDevice = new AudioDevice( freq, channels, bits_per_sample);
410 audioBuffer = new char[ audioDevice->bufferSize() ]; 410 audioBuffer = new char[ audioDevice->bufferSize() ];
411 channels = audioDevice->channels(); 411 channels = audioDevice->channels();
412 412
413 //### must check which frequency is actually used. 413 //### must check which frequency is actually used.
414 static const int size = 1; 414 static const int size = 1;
415 short int buf[size]; 415 short int buf[size];
416 long samplesRead = 0; 416 long samplesRead = 0;
417 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); 417 mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
418 } 418 }
419 419
420 if ( hasVideoChannel ) { 420 if ( hasVideoChannel ) {
421 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); 421 total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
422 422
423 mediaPlayerState->setLength( total_video_frames ); 423 mediaPlayerState->setLength( total_video_frames );
424 424
425 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); 425 framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
426 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); 426 DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
427 427
428 if ( framerate <= 1.0 ) { 428 if ( framerate <= 1.0 ) {
429 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); 429 DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
430 framerate = 25; 430 framerate = 25;
431 } 431 }
432 432
433 if ( total_video_frames == 1 ) { 433 if ( total_video_frames == 1 ) {
434 DecodeLoopDebug(( "Cannot seek to frame" )); 434 DecodeLoopDebug(( "Cannot seek to frame" ));
435 } 435 }
436 436
437 } 437 }
438 438
@@ -450,13 +450,15 @@ bool LoopControl::init( const QString& filename ) {
450 450
451void LoopControl::play() { 451void LoopControl::play() {
452 qDebug("LC- play"); 452 qDebug("LC- play");
453 mediaPlayerState->setPosition( 0); //uglyhack
454
453#if defined(Q_WS_QWS) && !defined(QT_NO_COP) 455#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
454 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { 456 if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) {
455 disabledSuspendScreenSaver = TRUE; 457 disabledSuspendScreenSaver = TRUE;
456 previousSuspendMode = hasVideoChannel; 458 previousSuspendMode = hasVideoChannel;
457 // Stop the screen from blanking and power saving state 459 // Stop the screen from blanking and power saving state
458 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) 460 QCopEnvelope("QPE/System", "setScreenSaverMode(int)" )
459 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); 461 << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend );
460 } 462 }
461#endif 463#endif
462 464
@@ -467,14 +469,14 @@ void LoopControl::play() {
467 469
468void LoopControl::setMute( bool on ) { 470void LoopControl::setMute( bool on ) {
469 if ( on != isMuted ) { 471 if ( on != isMuted ) {
470 isMuted = on; 472 isMuted = on;
471 if ( !on ) { 473 if ( !on ) {
472 // Force an update of the position 474 // Force an update of the position
473 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); 475 mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
474 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); 476 mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
475 // Resume playing audio 477 // Resume playing audio
476 moreAudio = TRUE; 478 moreAudio = TRUE;
477 } 479 }
478 } 480 }
479} 481}
480 482
diff --git a/core/multimedia/opieplayer/mediaplayer.cpp b/core/multimedia/opieplayer/mediaplayer.cpp
index b9e438b..64fdc01 100644
--- a/core/multimedia/opieplayer/mediaplayer.cpp
+++ b/core/multimedia/opieplayer/mediaplayer.cpp
@@ -62,6 +62,7 @@ MediaPlayer::MediaPlayer( QObject *parent, const char *name )
62 62
63 63
64MediaPlayer::~MediaPlayer() { 64MediaPlayer::~MediaPlayer() {
65
65} 66}
66 67
67 68
diff --git a/core/multimedia/opieplayer/mediaplayerstate.cpp b/core/multimedia/opieplayer/mediaplayerstate.cpp
index 3ac9ac4..cf166d6 100644
--- a/core/multimedia/opieplayer/mediaplayerstate.cpp
+++ b/core/multimedia/opieplayer/mediaplayerstate.cpp
@@ -1,22 +1,22 @@
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/qlibrary.h> 21#include <qpe/qlibrary.h>
22#include <qpe/config.h> 22#include <qpe/config.h>
@@ -41,7 +41,7 @@
41 41
42 42
43MediaPlayerState::MediaPlayerState( QObject *parent, const char *name ) 43MediaPlayerState::MediaPlayerState( QObject *parent, const char *name )
44 : QObject( parent, name ), decoder( NULL ), libmpeg3decoder( NULL ) { 44 : QObject( parent, name ), decoder( NULL ), libmpeg3decoder( NULL ) {
45 Config cfg( "OpiePlayer" ); 45 Config cfg( "OpiePlayer" );
46 readConfig( cfg ); 46 readConfig( cfg );
47 loadPlugins(); 47 loadPlugins();
@@ -106,7 +106,7 @@ MediaPlayerDecoder *MediaPlayerState::newDecoder( const QString& file ) {
106 if(file.left(4)=="http") 106 if(file.left(4)=="http")
107 isStreaming = TRUE; 107 isStreaming = TRUE;
108 else 108 else
109 isStreaming = FALSE; 109 isStreaming = FALSE;
110 return decoder = tmpDecoder; 110 return decoder = tmpDecoder;
111} 111}
112 112
@@ -131,9 +131,9 @@ void MediaPlayerState::loadPlugins() {
131#ifndef QT_NO_COMPONENT 131#ifndef QT_NO_COMPONENT
132 QValueList<MediaPlayerPlugin>::Iterator mit; 132 QValueList<MediaPlayerPlugin>::Iterator mit;
133 for ( mit = pluginList.begin(); mit != pluginList.end(); ++mit ) { 133 for ( mit = pluginList.begin(); mit != pluginList.end(); ++mit ) {
134 (*mit).iface->release(); 134 (*mit).iface->release();
135 (*mit).library->unload(); 135 (*mit).library->unload();
136 delete (*mit).library; 136 delete (*mit).library;
137 } 137 }
138 pluginList.clear(); 138 pluginList.clear();
139 139
@@ -142,28 +142,28 @@ void MediaPlayerState::loadPlugins() {
142 QStringList list = dir.entryList(); 142 QStringList list = dir.entryList();
143 QStringList::Iterator it; 143 QStringList::Iterator it;
144 for ( it = list.begin(); it != list.end(); ++it ) { 144 for ( it = list.begin(); it != list.end(); ++it ) {
145 MediaPlayerPluginInterface *iface = 0; 145 MediaPlayerPluginInterface *iface = 0;
146 QLibrary *lib = new QLibrary( path + "/" + *it ); 146 QLibrary *lib = new QLibrary( path + "/" + *it );
147// qDebug( "querying: %s", QString( path + "/" + *it ).latin1() ); 147// qDebug( "querying: %s", QString( path + "/" + *it ).latin1() );
148 148
149 if ( lib->queryInterface( IID_MediaPlayerPlugin, (QUnknownInterface**)&iface ) == QS_OK ) { 149 if ( lib->queryInterface( IID_MediaPlayerPlugin, (QUnknownInterface**)&iface ) == QS_OK ) {
150 150
151// qDebug( "loading: %s", QString( path + "/" + *it ).latin1() ); 151// qDebug( "loading: %s", QString( path + "/" + *it ).latin1() );
152 152
153 MediaPlayerPlugin plugin; 153 MediaPlayerPlugin plugin;
154 plugin.library = lib; 154 plugin.library = lib;
155 plugin.iface = iface; 155 plugin.iface = iface;
156 plugin.decoder = plugin.iface->decoder(); 156 plugin.decoder = plugin.iface->decoder();
157 plugin.encoder = plugin.iface->encoder(); 157 plugin.encoder = plugin.iface->encoder();
158 pluginList.append( plugin ); 158 pluginList.append( plugin );
159 159
160 // ### hack to get true sample count 160 // ### hack to get true sample count
161 if ( plugin.decoder->pluginName() == QString("LibMpeg3Plugin") ) 161 if ( plugin.decoder->pluginName() == QString("LibMpeg3Plugin") )
162 libmpeg3decoder = plugin.decoder; 162 libmpeg3decoder = plugin.decoder;
163 163
164 } else { 164 } else {
165 delete lib; 165 delete lib;
166 } 166 }
167 } 167 }
168#else 168#else
169 pluginList.clear(); 169 pluginList.clear();
@@ -188,8 +188,8 @@ void MediaPlayerState::loadPlugins() {
188#endif 188#endif
189 189
190 if ( pluginList.count() ) 190 if ( pluginList.count() )
191 MediaPlayerDebug(( "%i decoders found", pluginList.count() )); 191 MediaPlayerDebug(( "%i decoders found", pluginList.count() ));
192 else 192 else
193 MediaPlayerDebug(( "No decoders found" )); 193 MediaPlayerDebug(( "No decoders found" ));
194} 194}
195 195
diff --git a/core/multimedia/opieplayer/playlistwidget.cpp b/core/multimedia/opieplayer/playlistwidget.cpp
index 200ec16..35208e4 100644
--- a/core/multimedia/opieplayer/playlistwidget.cpp
+++ b/core/multimedia/opieplayer/playlistwidget.cpp
@@ -157,7 +157,6 @@ PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
157 tbDeletePlaylist = new QPushButton( Resource::loadIconSet("trash"),"",bar,"close"); 157 tbDeletePlaylist = new QPushButton( Resource::loadIconSet("trash"),"",bar,"close");
158 tbDeletePlaylist->setFlat(TRUE); 158 tbDeletePlaylist->setFlat(TRUE);
159 tbDeletePlaylist->setFixedSize(20,20); 159 tbDeletePlaylist->setFixedSize(20,20);
160 connect(tbDeletePlaylist,(SIGNAL(released())),SLOT( deletePlaylist()));
161 160
162 d->tbAddToList = new ToolButton( bar, tr( "Add to Playlist" ), "opieplayer/add_to_playlist", 161 d->tbAddToList = new ToolButton( bar, tr( "Add to Playlist" ), "opieplayer/add_to_playlist",
163 this , SLOT(addSelected()) ); 162 this , SLOT(addSelected()) );
@@ -190,10 +189,8 @@ PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
190 menu->insertItem( tr( "View" ), pmView ); 189 menu->insertItem( tr( "View" ), pmView );
191 190
192 fullScreenButton = new QAction(tr("Full Screen"), Resource::loadPixmap("fullscreen"), QString::null, 0, this, 0); 191 fullScreenButton = new QAction(tr("Full Screen"), Resource::loadPixmap("fullscreen"), QString::null, 0, this, 0);
193 connect( fullScreenButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleFullscreen()) );
194 fullScreenButton->addTo(pmView); 192 fullScreenButton->addTo(pmView);
195 scaleButton = new QAction(tr("Scale"), Resource::loadPixmap("opieplayer/scale"), QString::null, 0, this, 0); 193 scaleButton = new QAction(tr("Scale"), Resource::loadPixmap("opieplayer/scale"), QString::null, 0, this, 0);
196 connect( scaleButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleScaled()) );
197 scaleButton->addTo(pmView); 194 scaleButton->addTo(pmView);
198 195
199 QVBox *vbox5 = new QVBox( this ); vbox5->setBackgroundMode( PaletteButton ); 196 QVBox *vbox5 = new QVBox( this ); vbox5->setBackgroundMode( PaletteButton );
@@ -224,8 +221,6 @@ PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
224 221
225 QPEApplication::setStylusOperation( d->selectedFiles->viewport(),QPEApplication::RightOnHold); 222 QPEApplication::setStylusOperation( d->selectedFiles->viewport(),QPEApplication::RightOnHold);
226 223
227 connect( d->selectedFiles, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint&, int)),
228 this,SLOT( playlistViewPressed(int, QListViewItem *, const QPoint&, int)) );
229 224
230 225
231 QVBox *stretch1 = new QVBox( vbox1 ); stretch1->setBackgroundMode( PaletteButton ); // add stretch 226 QVBox *stretch1 = new QVBox( vbox1 ); stretch1->setBackgroundMode( PaletteButton ); // add stretch
@@ -251,11 +246,6 @@ PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
251 tabWidget->insertTab(aTab,tr("Audio")); 246 tabWidget->insertTab(aTab,tr("Audio"));
252 247
253 QPEApplication::setStylusOperation( audioView->viewport(),QPEApplication::RightOnHold); 248 QPEApplication::setStylusOperation( audioView->viewport(),QPEApplication::RightOnHold);
254 connect( audioView, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint&, int)),
255 this,SLOT( viewPressed(int, QListViewItem *, const QPoint&, int)) );
256
257 connect( audioView, SIGNAL( returnPressed( QListViewItem *)),
258 this,SLOT( playIt( QListViewItem *)) );
259 249
260// audioView 250// audioView
261// populateAudioView(); 251// populateAudioView();
@@ -277,11 +267,6 @@ PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
277 267
278 QPEApplication::setStylusOperation( videoView->viewport(),QPEApplication::RightOnHold); 268 QPEApplication::setStylusOperation( videoView->viewport(),QPEApplication::RightOnHold);
279 269
280 connect( videoView, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint&, int)),
281 this,SLOT( viewPressed(int, QListViewItem *, const QPoint&, int)) );
282 connect( videoView, SIGNAL( returnPressed( QListViewItem *)),
283 this,SLOT( playIt( QListViewItem *)) );
284
285 tabWidget->insertTab( vTab,tr("Video")); 270 tabWidget->insertTab( vTab,tr("Video"));
286// populateVideoView(); 271// populateVideoView();
287 272
@@ -292,7 +277,6 @@ PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
292 playLists->setMinimumSize(233,260); 277 playLists->setMinimumSize(233,260);
293 tabWidget->insertTab(LTab,tr("Lists")); 278 tabWidget->insertTab(LTab,tr("Lists"));
294 279
295 connect( playLists, SIGNAL( fileSelected( const DocLnk &) ), this, SLOT( loadList( const DocLnk & ) ) );
296// connect( playLists, SIGNAL( newSelected( const DocLnk &) ), this, SLOT( newFile( const DocLnk & ) ) ); 280// connect( playLists, SIGNAL( newSelected( const DocLnk &) ), this, SLOT( newFile( const DocLnk & ) ) );
297 281
298// add the library area 282// add the library area
@@ -305,10 +289,30 @@ PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl )
305// connect( audioView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( fauxPlay( QListViewItem *) ) ); 289// connect( audioView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( fauxPlay( QListViewItem *) ) );
306// connect( videoView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( fauxPlay( QListViewItem *) ) ); 290// connect( videoView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( fauxPlay( QListViewItem *) ) );
307 291
308 connect( audioView, SIGNAL( doubleClicked( QListViewItem *) ), this, SLOT( addToSelection( QListViewItem *) ) ); 292 connect(tbDeletePlaylist,(SIGNAL(released())),SLOT( deletePlaylist()));
293 connect( fullScreenButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleFullscreen()) );
294 connect( scaleButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleScaled()) );
295 connect( d->selectedFiles, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint&, int)),
296 this,SLOT( playlistViewPressed(int, QListViewItem *, const QPoint&, int)) );
297
298 connect( audioView, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint&, int)),
299 this,SLOT( viewPressed(int, QListViewItem *, const QPoint&, int)) );
300
301 connect( audioView, SIGNAL( returnPressed( QListViewItem *)),
302 this,SLOT( playIt( QListViewItem *)) );
303 connect( audioView, SIGNAL( doubleClicked( QListViewItem *) ), this, SLOT( addToSelection( QListViewItem *) ) );
304
305 connect( videoView, SIGNAL( mouseButtonPressed( int, QListViewItem *, const QPoint&, int)),
306 this,SLOT( viewPressed(int, QListViewItem *, const QPoint&, int)) );
307 connect( videoView, SIGNAL( returnPressed( QListViewItem *)),
308 this,SLOT( playIt( QListViewItem *)) );
309 connect( videoView, SIGNAL( doubleClicked( QListViewItem *) ), this, SLOT( addToSelection( QListViewItem *) ) ); 309 connect( videoView, SIGNAL( doubleClicked( QListViewItem *) ), this, SLOT( addToSelection( QListViewItem *) ) );
310 310
311 connect( playLists, SIGNAL( fileSelected( const DocLnk &) ), this, SLOT( loadList( const DocLnk & ) ) );
312
313
311 connect( tabWidget, SIGNAL (currentChanged(QWidget*)),this,SLOT(tabChanged(QWidget*))); 314 connect( tabWidget, SIGNAL (currentChanged(QWidget*)),this,SLOT(tabChanged(QWidget*)));
315
312 connect( mediaPlayerState, SIGNAL( playingToggled( bool ) ), d->tbPlay, SLOT( setOn( bool ) ) ); 316 connect( mediaPlayerState, SIGNAL( playingToggled( bool ) ), d->tbPlay, SLOT( setOn( bool ) ) );
313 connect( mediaPlayerState, SIGNAL( loopingToggled( bool ) ), d->tbLoop, SLOT( setOn( bool ) ) ); 317 connect( mediaPlayerState, SIGNAL( loopingToggled( bool ) ), d->tbLoop, SLOT( setOn( bool ) ) );
314 connect( mediaPlayerState, SIGNAL( shuffledToggled( bool ) ), d->tbShuffle, SLOT( setOn( bool ) ) ); 318 connect( mediaPlayerState, SIGNAL( shuffledToggled( bool ) ), d->tbShuffle, SLOT( setOn( bool ) ) );
@@ -752,7 +756,9 @@ void PlayListWidget::removeSelected() {
752 756
753void PlayListWidget::playIt( QListViewItem *it) { 757void PlayListWidget::playIt( QListViewItem *it) {
754// d->setDocumentUsed = FALSE; 758// d->setDocumentUsed = FALSE;
755 mediaPlayerState->setPlaying(FALSE); 759// mediaPlayerState->curPosition =0;
760 qDebug("playIt");
761 mediaPlayerState->setPlaying(FALSE);
756 mediaPlayerState->setPlaying(TRUE); 762 mediaPlayerState->setPlaying(TRUE);
757 d->selectedFiles->unSelect(); 763 d->selectedFiles->unSelect();
758} 764}
@@ -835,6 +841,7 @@ void PlayListWidget::btnPlay(bool b) {
835 switch ( tabWidget->currentPageIndex()) { 841 switch ( tabWidget->currentPageIndex()) {
836 case 0: 842 case 0:
837 { 843 {
844
838 mediaPlayerState->setPlaying(b); 845 mediaPlayerState->setPlaying(b);
839 } 846 }
840 break; 847 break;