author | llornkcor <llornkcor> | 2002-02-24 21:51:51 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-02-24 21:51:51 (UTC) |
commit | 36b768c465c6ecddceb57ff1d7a5087e9848c897 (patch) (side-by-side diff) | |
tree | 4ddde589e2393ca136e24cda4fc456612149ae72 | |
parent | ade25ac278169f0e0c9ee0771e754adb46cf7ce2 (diff) | |
download | opie-36b768c465c6ecddceb57ff1d7a5087e9848c897.zip opie-36b768c465c6ecddceb57ff1d7a5087e9848c897.tar.gz opie-36b768c465c6ecddceb57ff1d7a5087e9848c897.tar.bz2 |
changed mediaplayerplugininterface.h location
29 files changed, 1229 insertions, 893 deletions
diff --git a/core/multimedia/opieplayer/Makefile.in b/core/multimedia/opieplayer/Makefile.in index 1b0307a..8d33fb4 100644 --- a/core/multimedia/opieplayer/Makefile.in +++ b/core/multimedia/opieplayer/Makefile.in @@ -127,110 +127,123 @@ REQUIRES= ####### Sub-libraries ###### Combined headers ####### Compile main.o: main.cpp \ $(OPIEDIR)/include/qpe/qpeapplication.h \ + $(OPIEDIR)/include/qpedecoration_qws.h \ + $(OPIEDIR)/include/timestring.h \ mediaplayerstate.h \ playlistwidget.h \ $(OPIEDIR)/include/qpe/applnk.h \ audiowidget.h \ videowidget.h \ loopcontrol.h \ mediaplayer.h \ $(OPIEDIR)/include/qpe/qlibrary.h \ $(OPIEDIR)/include/qpe/qcom.h \ $(OPIEDIR)/include/qpe/quuid.h \ - $(OPIEDIR)/include/qpe/mediaplayerplugininterface.h + mediaplayerplugininterface.h loopcontrol.o: loopcontrol.cpp \ $(OPIEDIR)/include/qpe/qpeapplication.h \ - $(OPIEDIR)/include/qpe/qcopenvelope_qws.h \ + $(OPIEDIR)/include/qpedecoration_qws.h \ + $(OPIEDIR)/include/timestring.h \ loopcontrol.h \ videowidget.h \ audiodevice.h \ mediaplayerplugininterface.h \ $(OPIEDIR)/include/qpe/qcom.h \ $(OPIEDIR)/include/qpe/quuid.h \ mediaplayerstate.h playlistselection.o: playlistselection.cpp \ $(OPIEDIR)/include/qpe/applnk.h \ $(OPIEDIR)/include/qpe/resource.h \ playlistselection.h mediaplayerstate.o: mediaplayerstate.cpp \ $(OPIEDIR)/include/qpe/qpeapplication.h \ + $(OPIEDIR)/include/qpedecoration_qws.h \ + $(OPIEDIR)/include/timestring.h \ $(OPIEDIR)/include/qpe/qlibrary.h \ $(OPIEDIR)/include/qpe/qcom.h \ $(OPIEDIR)/include/qpe/quuid.h \ - $(OPIEDIR)/include/qpe/mediaplayerplugininterface.h \ $(OPIEDIR)/include/qpe/config.h \ + mediaplayerplugininterface.h \ mediaplayerstate.h \ libmad/libmadpluginimpl.h \ libmpeg3/libmpeg3pluginimpl.h \ wavplugin/wavpluginimpl.h videowidget.o: videowidget.cpp \ $(OPIEDIR)/include/qpe/resource.h \ - $(OPIEDIR)/include/qpe/mediaplayerplugininterface.h \ + mediaplayerplugininterface.h \ $(OPIEDIR)/include/qpe/qcom.h \ $(OPIEDIR)/include/qpe/quuid.h \ videowidget.h \ mediaplayerstate.h audiowidget.o: audiowidget.cpp \ $(OPIEDIR)/include/qpe/resource.h \ audiowidget.h \ mediaplayerstate.h playlistwidget.o: playlistwidget.cpp \ $(OPIEDIR)/include/qpe/qpemenubar.h \ $(OPIEDIR)/include/qpe/qpetoolbar.h \ $(OPIEDIR)/include/qpe/fileselector.h \ + $(OPIEDIR)/include/filemanager.h \ + $(OPIEDIR)/include/applnk.h \ + $(OPIEDIR)/include/qpe/qpeapplication.h \ + $(OPIEDIR)/include/qpedecoration_qws.h \ + $(OPIEDIR)/include/timestring.h \ $(OPIEDIR)/include/qpe/applnk.h \ $(OPIEDIR)/include/qpe/config.h \ $(OPIEDIR)/include/qpe/global.h \ $(OPIEDIR)/include/qpe/resource.h \ playlistselection.h \ playlistwidget.h \ mediaplayerstate.h mediaplayer.o: mediaplayer.cpp \ $(OPIEDIR)/include/qpe/qpeapplication.h \ + $(OPIEDIR)/include/qpedecoration_qws.h \ + $(OPIEDIR)/include/timestring.h \ $(OPIEDIR)/include/qpe/qlibrary.h \ $(OPIEDIR)/include/qpe/qcom.h \ $(OPIEDIR)/include/qpe/quuid.h \ $(OPIEDIR)/include/qpe/resource.h \ $(OPIEDIR)/include/qpe/config.h \ mediaplayer.h \ - $(OPIEDIR)/include/qpe/mediaplayerplugininterface.h \ + mediaplayerplugininterface.h \ playlistwidget.h \ $(OPIEDIR)/include/qpe/applnk.h \ audiowidget.h \ loopcontrol.h \ audiodevice.h \ mediaplayerstate.h audiodevice.o: audiodevice.cpp \ $(OPIEDIR)/include/qpe/qpeapplication.h \ + $(OPIEDIR)/include/qpedecoration_qws.h \ + $(OPIEDIR)/include/timestring.h \ $(OPIEDIR)/include/qpe/config.h \ - audiodevice.h \ - $(OPIEDIR)/include/qpe/qcopenvelope_qws.h + audiodevice.h moc_loopcontrol.o: moc_loopcontrol.cpp \ loopcontrol.h moc_playlistselection.o: moc_playlistselection.cpp \ playlistselection.h \ $(OPIEDIR)/include/qpe/applnk.h moc_mediaplayerstate.o: moc_mediaplayerstate.cpp \ mediaplayerstate.h moc_videowidget.o: moc_videowidget.cpp \ @@ -239,25 +252,25 @@ moc_videowidget.o: moc_videowidget.cpp \ moc_audiowidget.o: moc_audiowidget.cpp \ audiowidget.h moc_playlistwidget.o: moc_playlistwidget.cpp \ playlistwidget.h \ $(OPIEDIR)/include/qpe/applnk.h moc_mediaplayer.o: moc_mediaplayer.cpp \ mediaplayer.h \ $(OPIEDIR)/include/qpe/qlibrary.h \ $(OPIEDIR)/include/qpe/qcom.h \ $(OPIEDIR)/include/qpe/quuid.h \ - $(OPIEDIR)/include/qpe/mediaplayerplugininterface.h + mediaplayerplugininterface.h moc_audiodevice.o: moc_audiodevice.cpp \ audiodevice.h moc_loopcontrol.cpp: loopcontrol.h $(MOC) loopcontrol.h -o moc_loopcontrol.cpp moc_playlistselection.cpp: playlistselection.h $(MOC) playlistselection.h -o moc_playlistselection.cpp moc_mediaplayerstate.cpp: mediaplayerstate.h $(MOC) mediaplayerstate.h -o moc_mediaplayerstate.cpp diff --git a/core/multimedia/opieplayer/audiodevice.cpp b/core/multimedia/opieplayer/audiodevice.cpp index 8861015..59136af 100644 --- a/core/multimedia/opieplayer/audiodevice.cpp +++ b/core/multimedia/opieplayer/audiodevice.cpp @@ -8,25 +8,29 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +// L.J.Potter added better error code Fri 02-15-2002 14:37:47 + + #include <stdlib.h> +#include <stdio.h> #include <qpe/qpeapplication.h> #include <qpe/config.h> #include "audiodevice.h" #if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) #include "qpe/qcopenvelope_qws.h" #endif #ifdef Q_WS_WIN #include <windows.h> #include <mmsystem.h> #include <mmreg.h> @@ -96,189 +100,170 @@ void AudioDevice::getVolume( unsigned int& leftVolume, unsigned int& rightVolume #ifdef Q_OS_WIN32 HWAVEOUT handle; WAVEFORMATEX formatData; formatData.cbSize = sizeof(WAVEFORMATEX); formatData.wFormatTag = WAVE_FORMAT_PCM; formatData.nAvgBytesPerSec = 4 * 44000; formatData.nBlockAlign = 4; formatData.nChannels = 2; formatData.nSamplesPerSec = 44000; formatData.wBitsPerSample = 16; waveOutOpen(&handle, WAVE_MAPPER, &formatData, 0L, 0L, CALLBACK_NULL); if ( waveOutGetVolume( handle, (LPDWORD)&volume ) ) - qDebug( "get volume of audio device failed" ); + qDebug( "get volume of audio device failed" ); waveOutClose( handle ); leftVolume = volume & 0xFFFF; rightVolume = volume >> 16; #else int mixerHandle = open( "/dev/mixer", O_RDWR ); if ( mixerHandle >= 0 ) { - ioctl( mixerHandle, MIXER_READ(0), &volume ); + if(ioctl( mixerHandle, MIXER_READ(0), &volume )==-1) + perror("ioctl(\"MIXER_READ\")"); close( mixerHandle ); } else - qDebug( "get volume of audio device failed" ); + perror("open(\"/dev/mixer\")"); leftVolume = ((volume & 0x00FF) << 16) / 101; rightVolume = ((volume & 0xFF00) << 8) / 101; #endif } void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume, bool muted ) { AudioDevicePrivate::muted = muted; if ( muted ) { - AudioDevicePrivate::leftVolume = leftVolume; - AudioDevicePrivate::rightVolume = rightVolume; - leftVolume = 0; - rightVolume = 0; + AudioDevicePrivate::leftVolume = leftVolume; + AudioDevicePrivate::rightVolume = rightVolume; + leftVolume = 0; + rightVolume = 0; } else { leftVolume = ( (int) leftVolume < 0 ) ? 0 : (( leftVolume > 0xFFFF ) ? 0xFFFF : leftVolume ); - rightVolume = ( (int)rightVolume < 0 ) ? 0 : (( rightVolume > 0xFFFF ) ? 0xFFFF : rightVolume ); + rightVolume = ( (int)rightVolume < 0 ) ? 0 : (( rightVolume > 0xFFFF ) ? 0xFFFF : rightVolume ); } #ifdef Q_OS_WIN32 HWAVEOUT handle; WAVEFORMATEX formatData; formatData.cbSize = sizeof(WAVEFORMATEX); formatData.wFormatTag = WAVE_FORMAT_PCM; formatData.nAvgBytesPerSec = 4 * 44000; formatData.nBlockAlign = 4; formatData.nChannels = 2; formatData.nSamplesPerSec = 44000; formatData.wBitsPerSample = 16; waveOutOpen(&handle, WAVE_MAPPER, &formatData, 0L, 0L, CALLBACK_NULL); unsigned int volume = (rightVolume << 16) | leftVolume; if ( waveOutSetVolume( handle, volume ) ) - qDebug( "set volume of audio device failed" ); + qDebug( "set volume of audio device failed" ); waveOutClose( handle ); #else // Volume can be from 0 to 100 which is 101 distinct values unsigned int rV = (rightVolume * 101) >> 16; # if 0 unsigned int lV = (leftVolume * 101) >> 16; unsigned int volume = ((rV << 8) & 0xFF00) | (lV & 0x00FF); int mixerHandle = 0; if ( ( mixerHandle = open( "/dev/mixer", O_RDWR ) ) >= 0 ) { - ioctl( mixerHandle, MIXER_WRITE(0), &volume ); + if(ioctl( mixerHandle, MIXER_WRITE(0), &volume ) ==-1) + perror("ioctl(\"MIXER_WRITE\")"); close( mixerHandle ); } else - qDebug( "set volume of audio device failed" ); + perror("open(\"/dev/mixer\")"); + # else // This is the way this has to be done now I guess, doesn't allow for // independant right and left channel setting, or setting for different outputs Config cfg("Sound"); cfg.setGroup("System"); cfg.writeEntry("Volume",(int)rV); # endif #endif // qDebug( "setting volume to: 0x%x", volume ); #if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) // Send notification that the volume has changed QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << muted; #endif } AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) { d = new AudioDevicePrivate; d->frequency = f; d->channels = chs; d->bytesPerSample = bps; + qDebug("%d",bps); + int format=0; + if( bps == 8) format = AFMT_U8; + else if( bps <= 0) format = AFMT_S16_LE; + else format = AFMT_S16_LE; + qDebug("AD- freq %d, channels %d, b/sample %d, bitrate %d",f,chs,bps,format); connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( volumeChanged(bool) ) ); -#ifdef Q_OS_WIN32 - UINT result; - WAVEFORMATEX formatData; - formatData.cbSize = sizeof(WAVEFORMATEX); -/* - // Other possible formats windows supports - formatData.wFormatTag = WAVE_FORMAT_MPEG; - formatData.wFormatTag = WAVE_FORMAT_MPEGLAYER3; - formatData.wFormatTag = WAVE_FORMAT_ADPCM; -*/ - formatData.wFormatTag = WAVE_FORMAT_PCM; - formatData.nAvgBytesPerSec = bps * chs * f; - formatData.nBlockAlign = bps * chs; - formatData.nChannels = chs; - formatData.nSamplesPerSec = f; - formatData.wBitsPerSample = bps * 8; - // Open a waveform device for output - if (result = waveOutOpen((LPHWAVEOUT)&d->handle, WAVE_MAPPER, &formatData, 0L, 0L, CALLBACK_NULL)) { - QString errorMsg = "error opening audio device.\nReason: %i - "; - switch (result) { - case MMSYSERR_ALLOCATED: errorMsg += "Specified resource is already allocated."; break; - case MMSYSERR_BADDEVICEID: errorMsg += "Specified device identifier is out of range."; break; - case MMSYSERR_NODRIVER: errorMsg += "No device driver is present."; break; - case MMSYSERR_NOMEM: errorMsg += "Unable to allocate or lock memory."; break; - case WAVERR_BADFORMAT: errorMsg += "Attempted to open with an unsupported waveform-audio format."; break; - case WAVERR_SYNC: errorMsg += "The device is synchronous but waveOutOpen was called without using the WAVE_ALLOWSYNC flag."; break; - default: errorMsg += "Undefined error"; break; - } - qDebug( errorMsg, result ); - } - - d->bufferSize = sound_fragment_bytes; -#else int fragments = 0x10000 * 8 + sound_fragment_shift; - int format = AFMT_S16_LE; int capabilities = 0; #ifdef KEEP_DEVICE_OPEN if ( AudioDevicePrivate::dspFd == 0 ) { #endif if ( ( d->handle = ::open( "/dev/dsp", O_WRONLY ) ) < 0 ) { - qDebug( "error opening audio device /dev/dsp, sending data to /dev/null instead" ); - d->handle = ::open( "/dev/null", O_WRONLY ); + perror("open(\"/dev/dsp\") sending to /dev/null instead"); + d->handle = ::open( "/dev/null", O_WRONLY ); } #ifdef KEEP_DEVICE_OPEN - AudioDevicePrivate::dspFd = d->handle; + AudioDevicePrivate::dspFd = d->handle; } else { d->handle = AudioDevicePrivate::dspFd; } #endif - ioctl( d->handle, SNDCTL_DSP_GETCAPS, &capabilities ); - ioctl( d->handle, SNDCTL_DSP_SETFRAGMENT, &fragments ); - ioctl( d->handle, SNDCTL_DSP_SETFMT, &format ); - ioctl( d->handle, SNDCTL_DSP_SPEED, &d->frequency ); + if(ioctl( d->handle, SNDCTL_DSP_GETCAPS, &capabilities )==-1) + perror("ioctl(\"SNDCTL_DSP_GETCAPS\")"); + if(ioctl( d->handle, SNDCTL_DSP_SETFRAGMENT, &fragments )==-1) + perror("ioctl(\"SNDCTL_DSP_SETFRAGMENT\")"); + if(ioctl( d->handle, SNDCTL_DSP_SETFMT, & format )==-1) + perror("ioctl(\"SNDCTL_DSP_SETFMT\")"); + qDebug("freq %d", d->frequency); + if(ioctl( d->handle, SNDCTL_DSP_SPEED, &d->frequency )==-1) + perror("ioctl(\"SNDCTL_DSP_SPEED\")"); + qDebug("channels %d",d->channels); if ( ioctl( d->handle, SNDCTL_DSP_CHANNELS, &d->channels ) == -1 ) { - d->channels = ( d->channels == 1 ) ? 2 : d->channels; - ioctl( d->handle, SNDCTL_DSP_CHANNELS, &d->channels ); + d->channels = ( d->channels == 1 ) ? 2 : d->channels; + if(ioctl( d->handle, SNDCTL_DSP_CHANNELS, &d->channels )==-1) + perror("ioctl(\"SNDCTL_DSP_CHANNELS\")"); } d->bufferSize = sound_fragment_bytes; d->unwrittenBuffer = new char[d->bufferSize]; d->unwritten = 0; d->can_GETOSPACE = TRUE; // until we find otherwise - //if ( chs != d->channels ) qDebug( "Wanted %d, got %d channels", chs, d->channels ); - //if ( f != d->frequency ) qDebug( "wanted %dHz, got %dHz", f, d->frequency ); + //if ( chs != d->channels ) qDebug( "Wanted %d, got %d channels", chs, d->channels ); + //if ( f != d->frequency ) qDebug( "wanted %dHz, got %dHz", f, d->frequency ); //if ( capabilities & DSP_CAP_BATCH ) qDebug( "Sound card has local buffer" ); //if ( capabilities & DSP_CAP_REALTIME )qDebug( "Sound card has realtime sync" ); //if ( capabilities & DSP_CAP_TRIGGER ) qDebug( "Sound card has precise trigger" ); //if ( capabilities & DSP_CAP_MMAP ) qDebug( "Sound card can mmap" ); -#endif } AudioDevice::~AudioDevice() { #ifdef Q_OS_WIN32 waveOutClose( (HWAVEOUT)d->handle ); #else # ifndef KEEP_DEVICE_OPEN - close( d->handle ); // Now it should be safe to shut the handle + close( d->handle ); // Now it should be safe to shut the handle # endif delete d->unwrittenBuffer; delete d; #endif } void AudioDevice::volumeChanged( bool muted ) { AudioDevicePrivate::muted = muted; } @@ -287,33 +272,33 @@ void AudioDevice::write( char *buffer, unsigned int length ) { #ifdef Q_OS_WIN32 // returns immediately and (to be implemented) emits completedIO() when finished writing WAVEHDR *lpWaveHdr = (WAVEHDR *)malloc( sizeof(WAVEHDR) ); // maybe the buffer should be copied so that this fool proof, but its a performance hit lpWaveHdr->lpData = buffer; lpWaveHdr->dwBufferLength = length; lpWaveHdr->dwFlags = 0L; lpWaveHdr->dwLoops = 0L; waveOutPrepareHeader( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ); // waveOutWrite returns immediately. the data is sent in the background. if ( waveOutWrite( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ) ) - qDebug( "failed to write block to audio device" ); + qDebug( "failed to write block to audio device" ); // emit completedIO(); #else int t = ::write( d->handle, buffer, length ); if ( t<0 ) t = 0; if ( t != (int)length) { - qDebug("Ahhh!! memcpys 1"); - memcpy(d->unwrittenBuffer,buffer+t,length-t); - d->unwritten = length-t; + qDebug("Ahhh!! memcpys 1"); + memcpy(d->unwrittenBuffer,buffer+t,length-t); + d->unwritten = length-t; } #endif } unsigned int AudioDevice::channels() const { return d->channels; } unsigned int AudioDevice::frequency() const @@ -331,56 +316,56 @@ unsigned int AudioDevice::bytesPerSample() const unsigned int AudioDevice::bufferSize() const { return d->bufferSize; } unsigned int AudioDevice::canWrite() const { #ifdef Q_OS_WIN32 return bufferSize(); // Any better? #else audio_buf_info info; if ( d->can_GETOSPACE && ioctl(d->handle,SNDCTL_DSP_GETOSPACE,&info) ) { - d->can_GETOSPACE = FALSE; - fcntl( d->handle, F_SETFL, O_NONBLOCK ); + d->can_GETOSPACE = FALSE; + fcntl( d->handle, F_SETFL, O_NONBLOCK ); } if ( d->can_GETOSPACE ) { - int t = info.fragments * sound_fragment_bytes; - return QMIN(t,(int)bufferSize()); + int t = info.fragments * sound_fragment_bytes; + return QMIN(t,(int)bufferSize()); } else { - if ( d->unwritten ) { - int t = ::write( d->handle, d->unwrittenBuffer, d->unwritten ); - if ( t<0 ) t = 0; - if ( (unsigned)t!=d->unwritten ) { - memcpy(d->unwrittenBuffer,d->unwrittenBuffer+t,d->unwritten-t); - d->unwritten -= t; - } else { - d->unwritten = 0; - } - } - if ( d->unwritten ) - return 0; - else - return d->bufferSize; + if ( d->unwritten ) { + int t = ::write( d->handle, d->unwrittenBuffer, d->unwritten ); + if ( t<0 ) t = 0; + if ( (unsigned)t!=d->unwritten ) { + memcpy(d->unwrittenBuffer,d->unwrittenBuffer+t,d->unwritten-t); + d->unwritten -= t; + } else { + d->unwritten = 0; + } + } + if ( d->unwritten ) + return 0; + else + return d->bufferSize; } #endif } int AudioDevice::bytesWritten() { #ifdef Q_OS_WIN32 MMTIME pmmt = { TIME_BYTES, 0 }; if ( ( waveOutGetPosition( (HWAVEOUT)d->handle, &pmmt, sizeof(MMTIME) ) != MMSYSERR_NOERROR ) || ( pmmt.wType != TIME_BYTES ) ) { - qDebug( "failed to get audio device position" ); - return -1; + qDebug( "failed to get audio device position" ); + return -1; } return pmmt.u.cb; #else int buffered = 0; if ( ioctl( d->handle, SNDCTL_DSP_GETODELAY, &buffered ) ) { - qDebug( "failed to get audio device position" ); - return -1; + qDebug( "failed to get audio device position" ); + return -1; } return buffered; #endif } diff --git a/core/multimedia/opieplayer/audiodevice.h b/core/multimedia/opieplayer/audiodevice.h index 928f134..dcd79fe 100644 --- a/core/multimedia/opieplayer/audiodevice.h +++ b/core/multimedia/opieplayer/audiodevice.h @@ -8,38 +8,42 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +// L.J.Potter added changes Fri 02-15-2002 + + #ifndef AUDIODEVICE_H #define AUDIODEVICE_H #include <qobject.h> +#include <sys/soundcard.h> class AudioDevicePrivate; class AudioDevice : public QObject { Q_OBJECT public: - AudioDevice( unsigned int freq = 44000, unsigned int channels = 2, unsigned int bytesPerSample = 2 ); + AudioDevice( unsigned int freq = 44000, unsigned int channels = 2, unsigned int bytesPerSample = AFMT_S16_LE ); ~AudioDevice(); unsigned int canWrite() const; void write( char *buffer, unsigned int length ); int bytesWritten(); unsigned int channels() const; unsigned int frequency() const; unsigned int bytesPerSample() const; unsigned int bufferSize() const; // Each volume level is from 0 to 0xFFFF diff --git a/core/multimedia/opieplayer/audiowidget.cpp b/core/multimedia/opieplayer/audiowidget.cpp index 243c58c..0d88591 100644 --- a/core/multimedia/opieplayer/audiowidget.cpp +++ b/core/multimedia/opieplayer/audiowidget.cpp @@ -52,25 +52,25 @@ MediaButton audioButtons[] = { { 3*30+xo, 6*30-5+yo, 3, FALSE, FALSE, FALSE, FALSE }, // volume down { 5*30+xo, 1*30+yo, 0, TRUE, FALSE, FALSE, FALSE }, // repeat/loop { 1*30+xo, 1*30+yo, 0, FALSE, FALSE, FALSE, FALSE } // playlist }; static const int numButtons = (sizeof(audioButtons)/sizeof(MediaButton)); AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) : QWidget( parent, name, f ) { - setCaption( tr("MediaPlayer") ); + setCaption( tr("OpiePlayer") ); setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); pixmaps[0] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButtonsAll" ) ); pixmaps[1] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButtonsBig" ) ); pixmaps[2] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaControls" ) ); pixmaps[3] = new QPixmap( Resource::loadPixmap( "mpegplayer/animatedButton" ) ); songInfo = new Ticker( this ); songInfo->setFocusPolicy( QWidget::NoFocus ); songInfo->setGeometry( QRect( 7, 3, 220, 20 ) ); slider = new QSlider( Qt::Horizontal, this ); slider->setFixedWidth( 220 ); @@ -95,163 +95,163 @@ AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) : // Intialise state setLength( mediaPlayerState->length() ); setPosition( mediaPlayerState->position() ); setLooping( mediaPlayerState->fullscreen() ); setPaused( mediaPlayerState->paused() ); setPlaying( mediaPlayerState->playing() ); } AudioWidget::~AudioWidget() { for ( int i = 0; i < 4; i++ ) - delete pixmaps[i]; + delete pixmaps[i]; } static bool audioSliderBeingMoved = FALSE; void AudioWidget::sliderPressed() { audioSliderBeingMoved = TRUE; } void AudioWidget::sliderReleased() { audioSliderBeingMoved = FALSE; if ( slider->width() == 0 ) - return; + return; long val = long((double)slider->value() * mediaPlayerState->length() / slider->width()); mediaPlayerState->setPosition( val ); } void AudioWidget::setPosition( long i ) { updateSlider( i, mediaPlayerState->length() ); } void AudioWidget::setLength( long max ) { updateSlider( mediaPlayerState->position(), max ); } void AudioWidget::setView( char view ) { if ( view == 'a' ) { - startTimer( 150 ); - showMaximized(); + startTimer( 150 ); + showMaximized(); } else { - killTimers(); - hide(); + killTimers(); + hide(); } } void AudioWidget::updateSlider( long i, long max ) { if ( max == 0 ) - return; + return; // Will flicker too much if we don't do this // Scale to something reasonable int width = slider->width(); int val = int((double)i * width / max); if ( !audioSliderBeingMoved ) { - if ( slider->value() != val ) - slider->setValue( val ); - if ( slider->maxValue() != width ) - slider->setMaxValue( width ); + if ( slider->value() != val ) + slider->setValue( val ); + if ( slider->maxValue() != width ) + slider->setMaxValue( width ); } } void AudioWidget::setToggleButton( int i, bool down ) { if ( down != audioButtons[i].isDown ) - toggleButton( i ); + toggleButton( i ); } void AudioWidget::toggleButton( int i ) { audioButtons[i].isDown = !audioButtons[i].isDown; QPainter p(this); paintButton ( &p, i ); } void AudioWidget::paintButton( QPainter *p, int i ) { int x = audioButtons[i].xPos; int y = audioButtons[i].yPos; int offset = 22 + 14 * audioButtons[i].isBig + audioButtons[i].isDown; int buttonSize = 64 + audioButtons[i].isBig * (90 - 64); p->drawPixmap( x, y, *pixmaps[audioButtons[i].isBig], buttonSize * (audioButtons[i].isDown + 2 * audioButtons[i].color), 0, buttonSize, buttonSize ); p->drawPixmap( x + offset, y + offset, *pixmaps[2], 18 * i, 0, 18, 18 ); } void AudioWidget::timerEvent( QTimerEvent * ) { static int frame = 0; if ( !mediaPlayerState->paused() && audioButtons[ AudioPlay ].isDown ) { - frame = frame >= 7 ? 0 : frame + 1; - int x = audioButtons[AudioPlay].xPos; - int y = audioButtons[AudioPlay].yPos; - QPainter p( this ); - // Optimize to only draw the little bit of the changing images which is different - p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 ); - p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 ); + frame = frame >= 7 ? 0 : frame + 1; + int x = audioButtons[AudioPlay].xPos; + int y = audioButtons[AudioPlay].yPos; + QPainter p( this ); + // Optimize to only draw the little bit of the changing images which is different + p.drawPixmap( x + 14, y + 8, *pixmaps[3], 32 * frame, 0, 32, 32 ); + p.drawPixmap( x + 37, y + 37, *pixmaps[2], 18 * AudioPlay, 0, 6, 3 ); } } void AudioWidget::mouseMoveEvent( QMouseEvent *event ) { for ( int i = 0; i < numButtons; i++ ) { - int size = audioButtons[i].isBig; - int x = audioButtons[i].xPos; - int y = audioButtons[i].yPos; - if ( event->state() == QMouseEvent::LeftButton ) { - // The test to see if the mouse click is inside the circular button or not - // (compared with the radius squared to avoid a square-root of our distance) - int radius = 32 + 13 * size; - QPoint center = QPoint( x + radius, y + radius ); - QPoint dXY = center - event->pos(); - int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); - bool isOnButton = dist <= (radius * radius); -// QRect r( x, y, 64 + 22*size, 64 + 22*size ); -// bool isOnButton = r.contains( event->pos() ); // Rectangular Button code - if ( isOnButton && !audioButtons[i].isHeld ) { - audioButtons[i].isHeld = TRUE; - toggleButton(i); - switch (i) { + int size = audioButtons[i].isBig; + int x = audioButtons[i].xPos; + int y = audioButtons[i].yPos; + if ( event->state() == QMouseEvent::LeftButton ) { + // The test to see if the mouse click is inside the circular button or not + // (compared with the radius squared to avoid a square-root of our distance) + int radius = 32 + 13 * size; + QPoint center = QPoint( x + radius, y + radius ); + QPoint dXY = center - event->pos(); + int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); + bool isOnButton = dist <= (radius * radius); +// QRect r( x, y, 64 + 22*size, 64 + 22*size ); +// bool isOnButton = r.contains( event->pos() ); // Rectangular Button code + if ( isOnButton && !audioButtons[i].isHeld ) { + audioButtons[i].isHeld = TRUE; + toggleButton(i); + switch (i) { case AudioVolumeUp: emit moreClicked(); return; case AudioVolumeDown: emit lessClicked(); return; - } - } else if ( !isOnButton && audioButtons[i].isHeld ) { - audioButtons[i].isHeld = FALSE; - toggleButton(i); - } - } else { - if ( audioButtons[i].isHeld ) { - audioButtons[i].isHeld = FALSE; - if ( !audioButtons[i].isToggle ) - setToggleButton( i, FALSE ); - switch (i) { - case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return; - case AudioStop: mediaPlayerState->setPlaying(FALSE); return; - case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); return; - case AudioNext: mediaPlayerState->setNext(); return; - case AudioPrevious: mediaPlayerState->setPrev(); return; - case AudioLoop: mediaPlayerState->setLooping(audioButtons[i].isDown); return; - case AudioVolumeUp: emit moreReleased(); return; - case AudioVolumeDown: emit lessReleased(); return; - case AudioPlayList: mediaPlayerState->setList(); return; - } - } - } + } + } else if ( !isOnButton && audioButtons[i].isHeld ) { + audioButtons[i].isHeld = FALSE; + toggleButton(i); + } + } else { + if ( audioButtons[i].isHeld ) { + audioButtons[i].isHeld = FALSE; + if ( !audioButtons[i].isToggle ) + setToggleButton( i, FALSE ); + switch (i) { + case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return; + case AudioStop: mediaPlayerState->setPlaying(FALSE); return; + case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); return; + case AudioNext: mediaPlayerState->setNext(); return; + case AudioPrevious: mediaPlayerState->setPrev(); return; + case AudioLoop: mediaPlayerState->setLooping(audioButtons[i].isDown); return; + case AudioVolumeUp: emit moreReleased(); return; + case AudioVolumeDown: emit lessReleased(); return; + case AudioPlayList: mediaPlayerState->setList(); return; + } + } + } } } void AudioWidget::mousePressEvent( QMouseEvent *event ) { mouseMoveEvent( event ); } void AudioWidget::mouseReleaseEvent( QMouseEvent *event ) { mouseMoveEvent( event ); } @@ -262,16 +262,16 @@ void AudioWidget::showEvent( QShowEvent* ) { mouseMoveEvent( &event ); } void AudioWidget::closeEvent( QCloseEvent* ) { mediaPlayerState->setList(); } void AudioWidget::paintEvent( QPaintEvent * ) { QPainter p( this ); for ( int i = 0; i < numButtons; i++ ) - paintButton( &p, i ); + paintButton( &p, i ); } diff --git a/core/multimedia/opieplayer/libflash/libflashplugin.h b/core/multimedia/opieplayer/libflash/libflashplugin.h index 532bca2..a2f1c42 100644 --- a/core/multimedia/opieplayer/libflash/libflashplugin.h +++ b/core/multimedia/opieplayer/libflash/libflashplugin.h @@ -15,48 +15,50 @@ ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef LIBFLASH_PLUGIN_H #define LIBFLASH_PLUGIN_H #include <qstring.h> #include <qapplication.h> #include "flash.h" -#include "mediaplayerplugininterface.h" +//#include <qpe/mediaplayerplugininterface.h> +#include "../mediaplayerplugininterface.h" class LibFlashPlugin : public MediaPlayerDecoder { public: LibFlashPlugin(); ~LibFlashPlugin() { close(); } const char *pluginName() { return "LibFlashPlugin: " PLUGIN_NAME " " FLASH_VERSION_STRING; } const char *pluginComment() { return "This is the libflash library: " PLUGIN_NAME " " FLASH_VERSION_STRING; } double pluginVersion() { return 1.0; } bool isFileSupported( const QString& fileName ) { return fileName.right(4) == ".swf"; } bool open( const QString& fileName ); bool close() { FlashClose( file ); file = NULL; return TRUE; } bool isOpen() { return file != NULL; } const QString &fileInfo() { return strInfo = qApp->translate( "MediaPlayer", "No Information Available", "media plugin text" ); } // If decoder doesn't support audio then return 0 here int audioStreams() { return 1; } int audioChannels( int /*stream*/ ) { return 2; } int audioFrequency( int /*stream*/ ) { return 44100; } int audioSamples( int /*stream*/ ) { return 1000000; } +int audioBitsPerSample(int) { return 0;} bool audioSetSample( long sample, int stream ); long audioGetSample( int stream ); //bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream ); //bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream ); bool audioReadSamples( short *output, int channels, long samples, long& samplesRead, int stream ); //bool audioReadSamples( short *output, int channel, long samples, int stream ); //bool audioReReadSamples( short *output, int channel, long samples, int stream ); // If decoder doesn't support video then return 0 here int videoStreams(); int videoWidth( int stream ); int videoHeight( int stream ); diff --git a/core/multimedia/opieplayer/libflash/libflashpluginimpl.h b/core/multimedia/opieplayer/libflash/libflashpluginimpl.h index b5cc869..cb8d959 100644 --- a/core/multimedia/opieplayer/libflash/libflashpluginimpl.h +++ b/core/multimedia/opieplayer/libflash/libflashpluginimpl.h @@ -12,24 +12,25 @@ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef LIBFLASH_PLUGIN_IMPL_H #define LIBFLASH_PLUGIN_IMPL_H +//#include <qpe/mediaplayerplugininterface.h> #include "../mediaplayerplugininterface.h" class LibFlashPlugin; class LibFlashPluginImpl : public MediaPlayerPluginInterface { public: LibFlashPluginImpl(); virtual ~LibFlashPluginImpl(); diff --git a/core/multimedia/opieplayer/libflash/swf.h b/core/multimedia/opieplayer/libflash/swf.h index 5f5e4f7..48986cc 100644 --- a/core/multimedia/opieplayer/libflash/swf.h +++ b/core/multimedia/opieplayer/libflash/swf.h @@ -199,25 +199,25 @@ enum extern int shape_size,shape_nb,shaperecord_size,shaperecord_nb,style_size,style_nb; typedef void (*ScanLineFunc)(void *id, long y, long start, long end); class Bitmap; struct FlashMovie; extern "C" { #include "jpeglib.h" }; extern "C" { //#include "zlib.h" -#include "../src/3rdparty/zlib/zlib.h" +#include "/opt/qt-2.3.2-embedded/src/3rdparty/zlib/zlib.h" }; #include "graphic.h" #include "character.h" #include "bitmap.h" #include "shape.h" #include "displaylist.h" #include "sound.h" #include "button.h" #include "font.h" #include "text.h" #include "adpcm.h" diff --git a/core/multimedia/opieplayer/libmad/Makefile.in b/core/multimedia/opieplayer/libmad/Makefile.in index e9f74e7..552043c 100644 --- a/core/multimedia/opieplayer/libmad/Makefile.in +++ b/core/multimedia/opieplayer/libmad/Makefile.in @@ -205,19 +205,21 @@ layer3.o: layer3.c \ timer.h \ huffman.h \ layer3.h \ rq_table.dat \ imdct_s.dat huffman.o: huffman.c \ libmad_global.h \ huffman.h libmadplugin.o: libmadplugin.cpp \ libmadplugin.h \ + ../mediaplayerplugininterface.h \ mad.h libmadpluginimpl.o: libmadpluginimpl.cpp \ libmadplugin.h \ + ../mediaplayerplugininterface.h \ libmadpluginimpl.h diff --git a/core/multimedia/opieplayer/libmad/libmad.pro b/core/multimedia/opieplayer/libmad/libmad.pro index 6c40a15..b54ca6b 100644 --- a/core/multimedia/opieplayer/libmad/libmad.pro +++ b/core/multimedia/opieplayer/libmad/libmad.pro @@ -1,12 +1,14 @@ -TEMPLATE = lib -CONFIG += qt warn_on release -HEADERS = libmad_version.h fixed.h bit.h timer.h stream.h frame.h synth.h decoder.h \ - layer12.h layer3.h huffman.h libmad_global.h mad.h libmadplugin.h libmadpluginimpl.h -SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c synth.c decoder.c \ - layer12.c layer3.c huffman.c libmadplugin.cpp libmadpluginimpl.cpp -TARGET = madplugin -DESTDIR = ../../plugins/codecs +TEMPLATE = lib +CONFIG += qt warn_on release +HEADERS = libmad_version.h fixed.h bit.h timer.h stream.h frame.h synth.h decoder.h \ + layer12.h layer3.h huffman.h libmad_global.h mad.h libmadplugin.h libmadpluginimpl.h +SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c synth.c decoder.c \ + layer12.c layer3.c huffman.c libmadplugin.cpp libmadpluginimpl.cpp +TARGET = madplugin +DESTDIR = ../../plugins/codecs INCLUDEPATH += $(OPIEDIR)/include .. DEPENDPATH += ../$(OPIEDIR)/include .. +TMAKE_CFLAGS += -DFPM_64BIT +TMAKE_CXXFLAGS += -DFPM_64BIT LIBS += -lqpe -lm -VERSION = 1.0.0 +VERSION = 1.0.0 diff --git a/core/multimedia/opieplayer/libmad/libmadplugin.h b/core/multimedia/opieplayer/libmad/libmadplugin.h index 88647ae..ff84c27 100644 --- a/core/multimedia/opieplayer/libmad/libmadplugin.h +++ b/core/multimedia/opieplayer/libmad/libmadplugin.h @@ -13,25 +13,29 @@ ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef LIBMAD_PLUGIN_H #define LIBMAD_PLUGIN_H #include <qstring.h> -#include "mediaplayerplugininterface.h" +//#include <qpe/mediaplayerplugininterface.h> +#include "../mediaplayerplugininterface.h" + + +// #define OLD_MEDIAPLAYER_API class LibMadPluginData; class LibMadPlugin : public MediaPlayerDecoder { public: LibMadPlugin(); ~LibMadPlugin(); const char *pluginName() { return "LibMadPlugin"; } @@ -41,30 +45,34 @@ public: bool isFileSupported( const QString& ); bool open( const QString& ); bool close(); bool isOpen(); const QString &fileInfo() { return info; } // If decoder doesn't support audio then return 0 here int audioStreams(); int audioChannels( int stream ); int audioFrequency( int stream ); int audioSamples( int stream ); bool audioSetSample( long sample, int stream ); + int audioBitsPerSample(int) {return 0;} long audioGetSample( int stream ); -// bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream ); -// bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream ); +#ifdef OLD_MEDIAPLAYER_API + bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream ); + bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream ); + bool audioReadSamples( short *output, int channel, long samples, int stream ); + bool audioReReadSamples( short *output, int channel, long samples, int stream ); +#else bool audioReadSamples( short *output, int channels, long samples, long& samplesRead, int stream ); -// bool audioReadSamples( short *output, int channel, long samples, int stream ); -// bool audioReReadSamples( short *output, int channel, long samples, int stream ); +#endif bool read(); bool decode( short *output, long samples, long& samplesRead ); void printID3Tags(); // If decoder doesn't support video then return 0 here int videoStreams() { return 0; } int videoWidth( int ) { return 0; } int videoHeight( int ) { return 0; } double videoFrameRate( int ) { return 0.0; } @@ -82,20 +90,22 @@ public: bool setSMP( int ) { return FALSE; } bool setMMX( bool ) { return FALSE; } // Capabilities bool supportsAudio() { return TRUE; } bool supportsVideo() { return FALSE; } bool supportsYUV() { return FALSE; } bool supportsMMX() { return TRUE; } bool supportsSMP() { return FALSE; } bool supportsStereo() { return TRUE; } bool supportsScaling() { return FALSE; } + long getPlayTime() { return -1; } + private: LibMadPluginData *d; QString info; }; #endif diff --git a/core/multimedia/opieplayer/libmad/libmadpluginimpl.h b/core/multimedia/opieplayer/libmad/libmadpluginimpl.h index a26b421..8ad4956 100644 --- a/core/multimedia/opieplayer/libmad/libmadpluginimpl.h +++ b/core/multimedia/opieplayer/libmad/libmadpluginimpl.h @@ -12,42 +12,42 @@ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef LIBMAD_PLUGIN_IMPL_H #define LIBMAD_PLUGIN_IMPL_H +//#include <qpe/mediaplayerplugininterface.h> #include "../mediaplayerplugininterface.h" class LibMadPlugin; class LibMadPluginImpl : public MediaPlayerPluginInterface { public: LibMadPluginImpl(); virtual ~LibMadPluginImpl(); #ifndef QT_NO_COMPONENT QRESULT queryInterface( const QUuid&, QUnknownInterface** ); Q_REFCOUNT #endif virtual MediaPlayerDecoder *decoder(); virtual MediaPlayerEncoder *encoder(); - private: LibMadPlugin *libmadplugin; ulong ref; }; #endif diff --git a/core/multimedia/opieplayer/libmad/version.c b/core/multimedia/opieplayer/libmad/version.c index 413d54b..1baba26 100644 --- a/core/multimedia/opieplayer/libmad/version.c +++ b/core/multimedia/opieplayer/libmad/version.c @@ -79,13 +79,13 @@ char const mad_build[] = "OPT_STRICT " # endif # if defined(EXPERIMENTAL) "EXPERIMENTAL " # endif # if defined(DEBUG) "DEBUG " # elif defined(NDEBUG) "NDEBUG " # endif -; +;
\ No newline at end of file diff --git a/core/multimedia/opieplayer/libmpeg3/Makefile.in b/core/multimedia/opieplayer/libmpeg3/Makefile.in index 154f85d..d255e4f 100644 --- a/core/multimedia/opieplayer/libmpeg3/Makefile.in +++ b/core/multimedia/opieplayer/libmpeg3/Makefile.in @@ -167,40 +167,42 @@ libmpeg3plugin.o: libmpeg3plugin.cpp \ libmpeg3plugin.h \ libmpeg3.h \ mpeg3private.h \ mpeg3atrack.h \ mpeg3demux.h \ mpeg3title.h \ mpeg3io.h \ mpeg3css.h \ mpeg3private.inc \ audio/mpeg3audio.h \ mpeg3vtrack.h \ video/mpeg3video.h \ - mpeg3protos.h + mpeg3protos.h \ + ../mediaplayerplugininterface.h libmpeg3pluginimpl.o: libmpeg3pluginimpl.cpp \ libmpeg3plugin.h \ libmpeg3.h \ mpeg3private.h \ mpeg3atrack.h \ mpeg3demux.h \ mpeg3title.h \ mpeg3io.h \ mpeg3css.h \ mpeg3private.inc \ audio/mpeg3audio.h \ mpeg3vtrack.h \ video/mpeg3video.h \ mpeg3protos.h \ + ../mediaplayerplugininterface.h \ libmpeg3pluginimpl.h bitstream.o: bitstream.c \ mpeg3private.h \ mpeg3atrack.h \ mpeg3demux.h \ mpeg3title.h \ mpeg3io.h \ mpeg3css.h \ mpeg3private.inc \ audio/mpeg3audio.h \ mpeg3vtrack.h \ @@ -405,25 +407,25 @@ audio/layer2.o: audio/layer2.c \ mpeg3css.h \ mpeg3private.inc \ audio/../libmpeg3.h \ mpeg3private.h \ mpeg3atrack.h \ audio/mpeg3audio.h \ mpeg3vtrack.h \ video/mpeg3video.h \ audio/../mpeg3protos.h \ audio/tables.h audio/layer3.o: audio/layer3.c \ - audio/huffman.h \ + huffman.h \ audio/mpeg3audio.h \ audio/ac3.h \ audio/mpeg3real.h \ audio/../bitstream.h \ mpeg3demux.h \ mpeg3title.h \ mpeg3io.h \ mpeg3css.h \ mpeg3private.inc \ audio/../libmpeg3.h \ mpeg3private.h \ mpeg3atrack.h \ diff --git a/core/multimedia/opieplayer/libmpeg3/libmpeg3plugin.h b/core/multimedia/opieplayer/libmpeg3/libmpeg3plugin.h index 0a06264..54f259b 100644 --- a/core/multimedia/opieplayer/libmpeg3/libmpeg3plugin.h +++ b/core/multimedia/opieplayer/libmpeg3/libmpeg3plugin.h @@ -16,55 +16,63 @@ ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef LIBMPEG3_PLUGIN_H #define LIBMPEG3_PLUGIN_H #include <qstring.h> #include <qapplication.h> #include "libmpeg3.h" #include "mpeg3protos.h" -#include "mediaplayerplugininterface.h" +//#include <qpe/mediaplayerplugininterface.h> +#include "../mediaplayerplugininterface.h" + + +// #define OLD_MEDIAPLAYER_API class LibMpeg3Plugin : public MediaPlayerDecoder { public: LibMpeg3Plugin() { file = NULL; } ~LibMpeg3Plugin() { close(); } const char *pluginName() { return "LibMpeg3Plugin"; } const char *pluginComment() { return "This is the libmpeg3 library writen by ... which has been modified by trolltech to use fixed point maths"; } double pluginVersion() { return 1.0; } bool isFileSupported( const QString& fileName ) { return mpeg3_check_sig( (char *)fileName.latin1() ) == 1; } bool open( const QString& fileName ) { file = mpeg3_open( (char *)fileName.latin1() ); return file != NULL; } bool close() { if ( file ) { int r = mpeg3_close( file ); file = NULL; return r == 1; } return FALSE; } bool isOpen() { return file != NULL; } - const QString &fileInfo() { return strInfo = QString( "" ); } + const QString &fileInfo() { return strInfo = ""; } // If decoder doesn't support audio then return 0 here int audioStreams() { return file ? mpeg3_total_astreams( file ) : 0; } int audioChannels( int stream ) { return file ? mpeg3_audio_channels( file, stream ) : 0; } int audioFrequency( int stream ) { return file ? mpeg3_sample_rate( file, stream ) : 0; } + int audioBitsPerSample(int) { return 0;} int audioSamples( int stream ) { return file ? mpeg3_audio_samples( file, stream ) : 0; } bool audioSetSample( long sample, int stream ) { return file ? mpeg3_set_sample( file, sample, stream) == 1 : FALSE; } long audioGetSample( int stream ) { return file ? mpeg3_get_sample( file, stream ) : 0; } -// bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream ); -// bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream ); +#ifdef OLD_MEDIAPLAYER_API + bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream ); + bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream ); + bool audioReadSamples( short *output, int channel, long samples, int stream ); + bool audioReReadSamples( short *output, int channel, long samples, int stream ); +#else bool audioReadSamples( short *output, int channels, long samples, long& samplesRead, int stream ); -// bool audioReadSamples( short *output, int channel, long samples, int stream ); -// bool audioReReadSamples( short *output, int channel, long samples, int stream ); +#endif // If decoder doesn't support video then return 0 here int videoStreams() { return file ? mpeg3_total_vstreams( file ) : 0; } int videoWidth( int stream ) { return file ? mpeg3_video_width( file, stream ) : 0; } int videoHeight( int stream ) { return file ? mpeg3_video_height( file, stream ) : 0; } double videoFrameRate( int stream ) { return file ? mpeg3_frame_rate( file, stream ) : 0.0; } int videoFrames( int stream ) { return file ? mpeg3_video_frames( file, stream ) : 0; } /* { if ( file ) { int frames = mpeg3_video_frames( file, stream ); @@ -93,21 +101,23 @@ public: bool setSMP( int cpus ) { return file ? mpeg3_set_cpus( file, cpus ) == 1 : FALSE; } bool setMMX( bool useMMX ) { return file ? mpeg3_set_mmx( file, useMMX ) == 1 : FALSE; } // Capabilities bool supportsAudio() { return TRUE; } bool supportsVideo() { return TRUE; } bool supportsYUV() { return TRUE; } bool supportsMMX() { return TRUE; } bool supportsSMP() { return TRUE; } bool supportsStereo() { return TRUE; } bool supportsScaling() { return TRUE; } + long getPlayTime() { return -1; } + private: mpeg3_t *file; QString strInfo; }; #endif diff --git a/core/multimedia/opieplayer/libmpeg3/libmpeg3pluginimpl.h b/core/multimedia/opieplayer/libmpeg3/libmpeg3pluginimpl.h index 29ec6ba..89abf97 100644 --- a/core/multimedia/opieplayer/libmpeg3/libmpeg3pluginimpl.h +++ b/core/multimedia/opieplayer/libmpeg3/libmpeg3pluginimpl.h @@ -12,24 +12,25 @@ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef LIBMPEG3_PLUGIN_IMPL_H #define LIBMPEG3_PLUGIN_IMPL_H +//#include <qpe/mediaplayerplugininterface.h> #include "../mediaplayerplugininterface.h" class LibMpeg3Plugin; class LibMpeg3PluginImpl : public MediaPlayerPluginInterface { public: LibMpeg3PluginImpl(); virtual ~LibMpeg3PluginImpl(); diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp index 6dfd057..859a67a 100644 --- a/core/multimedia/opieplayer/loopcontrol.cpp +++ b/core/multimedia/opieplayer/loopcontrol.cpp @@ -8,457 +8,461 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +// L.J.Potter added changes Fri 02-15-2002 + #include <qpe/qpeapplication.h> + #ifdef Q_WS_QWS #include <qpe/qcopenvelope_qws.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <errno.h> #include <unistd.h> #include "loopcontrol.h" #include "videowidget.h" #include "audiodevice.h" #include "mediaplayerplugininterface.h" #include "mediaplayerstate.h" extern VideoWidget *videoUI; // now only needed to tell it to play a frame extern MediaPlayerState *mediaPlayerState; //#define DecodeLoopDebug(x) qDebug x #define DecodeLoopDebug(x) -static char *audioBuffer = NULL; +static char *audioBuffer = NULL; static AudioDevice *audioDevice = NULL; -static bool disabledSuspendScreenSaver = FALSE; -static bool previousSuspendMode = FALSE; +static bool disabledSuspendScreenSaver = FALSE; +static bool previousSuspendMode = FALSE; -pthread_t audio_tid; +pthread_t audio_tid; pthread_attr_t audio_attr; bool threadOkToGo = FALSE; class Mutex { public: Mutex() { - pthread_mutexattr_t attr; - pthread_mutexattr_init( &attr ); - pthread_mutex_init( &mutex, &attr ); - pthread_mutexattr_destroy( &attr ); + pthread_mutexattr_t attr; + pthread_mutexattr_init( &attr ); + pthread_mutex_init( &mutex, &attr ); + pthread_mutexattr_destroy( &attr ); } ~Mutex() { - pthread_mutex_destroy( &mutex ); + pthread_mutex_destroy( &mutex ); } void lock() { - pthread_mutex_lock( &mutex ); + pthread_mutex_lock( &mutex ); } void unlock() { - pthread_mutex_unlock( &mutex ); + pthread_mutex_unlock( &mutex ); } private: pthread_mutex_t mutex; }; void *startAudioThread( void *ptr ) { LoopControl *mpegView = (LoopControl *)ptr; while ( TRUE ) { - if ( threadOkToGo && mpegView->moreAudio ) - mpegView->startAudio(); - else - usleep( 10000 ); // Semi-buzy-wait till we are playing again + if ( threadOkToGo && mpegView->moreAudio ) + mpegView->startAudio(); + else + usleep( 10000 ); // Semi-buzy-wait till we are playing again } return 0; } Mutex *audioMutex; LoopControl::LoopControl( QObject *parent, const char *name ) : QObject( parent, name ) { isMuted = FALSE; connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( setMute(bool) ) ); audioMutex = new Mutex; pthread_attr_init(&audio_attr); #define USE_REALTIME_AUDIO_THREAD #ifdef USE_REALTIME_AUDIO_THREAD // Attempt to set it to real-time round robin if ( pthread_attr_setschedpolicy( &audio_attr, SCHED_RR ) == 0 ) { - sched_param params; - params.sched_priority = 50; - pthread_attr_setschedparam(&audio_attr,¶ms); + sched_param params; + params.sched_priority = 50; + pthread_attr_setschedparam(&audio_attr,¶ms); } else { - qDebug( "Error setting up a realtime thread, reverting to using a normal thread." ); - pthread_attr_destroy(&audio_attr); - pthread_attr_init(&audio_attr); + qDebug( "Error setting up a realtime thread, reverting to using a normal thread." ); + pthread_attr_destroy(&audio_attr); + pthread_attr_init(&audio_attr); } #endif pthread_create(&audio_tid, &audio_attr, (void * (*)(void *))startAudioThread, this); } LoopControl::~LoopControl() { stop(); } static long prev_frame = 0; static int currentSample = 0; void LoopControl::timerEvent( QTimerEvent *te ) { if ( te->timerId() == videoId ) - startVideo(); + startVideo(); if ( te->timerId() == sliderId ) { - if ( hasAudioChannel && !hasVideoChannel && moreAudio ) { - mediaPlayerState->updatePosition( audioSampleCounter ); - } else if ( hasVideoChannel && moreVideo ) { - mediaPlayerState->updatePosition( current_frame ); - } + if ( hasAudioChannel && !hasVideoChannel && moreAudio ) { + mediaPlayerState->updatePosition( audioSampleCounter ); + } else if ( hasVideoChannel && moreVideo ) { + mediaPlayerState->updatePosition( current_frame ); + } } if ( !moreVideo && !moreAudio ) { mediaPlayerState->setPlaying( FALSE ); mediaPlayerState->setNext(); } } void LoopControl::setPosition( long pos ) { audioMutex->lock(); if ( hasVideoChannel && hasAudioChannel ) { - playtime.restart(); - playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) ); - current_frame = pos + 1; - mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); - prev_frame = current_frame - 1; - currentSample = (int)( (double)current_frame * freq / framerate ); - mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream ); - audioSampleCounter = currentSample - 1; + playtime.restart(); + playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) ); + current_frame = pos + 1; + mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); + prev_frame = current_frame - 1; + currentSample = (int)( (double)current_frame * freq / framerate ); + mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream ); + audioSampleCounter = currentSample - 1; } else if ( hasVideoChannel ) { - playtime.restart(); - playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) ); - current_frame = pos + 1; - mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); - prev_frame = current_frame - 1; + playtime.restart(); + playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) ); + current_frame = pos + 1; + mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); + prev_frame = current_frame - 1; } else if ( hasAudioChannel ) { - playtime.restart(); - playtime = playtime.addMSecs( long((double)-pos * 1000.0 / freq) ); - currentSample = pos + 1; - mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream ); - audioSampleCounter = currentSample - 1; + playtime.restart(); + playtime = playtime.addMSecs( long((double)-pos * 1000.0 / freq) ); + currentSample = pos + 1; + mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream ); + audioSampleCounter = currentSample - 1; } audioMutex->unlock(); } void LoopControl::startVideo() { if ( moreVideo ) { if ( mediaPlayerState->curDecoder() ) { - if ( hasAudioChannel && !isMuted ) { + if ( hasAudioChannel && !isMuted ) { - current_frame = long( playtime.elapsed() * framerate / 1000 ); + current_frame = long( playtime.elapsed() * framerate / 1000 ); - if ( prev_frame != -1 && current_frame <= prev_frame ) - return; + if ( prev_frame != -1 && current_frame <= prev_frame ) + return; - } else { - // Don't skip - current_frame++; - } + } else { + // Don't skip + current_frame++; + } - if ( prev_frame == -1 || current_frame > prev_frame ) { - if ( current_frame > prev_frame + 1 ) { - mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); - } - moreVideo = videoUI->playVideo(); - prev_frame = current_frame; - } + if ( prev_frame == -1 || current_frame > prev_frame ) { + if ( current_frame > prev_frame + 1 ) { + mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream ); + } + moreVideo = videoUI->playVideo(); + prev_frame = current_frame; + } - } else { + } else { - moreVideo = FALSE; - killTimer( videoId ); + moreVideo = FALSE; + killTimer( videoId ); - } + } } } void LoopControl::startAudio() { audioMutex->lock(); if ( moreAudio ) { - if ( !isMuted && mediaPlayerState->curDecoder() ) { + if ( !isMuted && mediaPlayerState->curDecoder() ) { - currentSample = audioSampleCounter + 1; + currentSample = audioSampleCounter + 1; - if ( currentSample != audioSampleCounter + 1 ) - qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter); + if ( currentSample != audioSampleCounter + 1 ) + qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter); - long samplesRead = 0; - bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream ); - long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000; - long sampleWaitTime = currentSample - sampleWeShouldBeAt; + long samplesRead = 0; + bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream ); + long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000; + long sampleWaitTime = currentSample - sampleWeShouldBeAt; - if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) { - usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) ); - } else if ( sampleWaitTime <= -5000 ) { - qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt ); - //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream ); - currentSample = sampleWeShouldBeAt; - } +// if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 5000 ) ) { +// usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) ); +// } +// else if ( sampleWaitTime <= -5000 ) { +// qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt ); +// //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream ); +// currentSample = sampleWeShouldBeAt; +// } - audioDevice->write( audioBuffer, samplesRead * 2 * channels ); - audioSampleCounter = currentSample + samplesRead - 1; + audioDevice->write( audioBuffer, samplesRead * 2 * channels ); + audioSampleCounter = currentSample + samplesRead - 1; - moreAudio = readOk && (audioSampleCounter <= total_audio_samples); + moreAudio = readOk && (audioSampleCounter <= total_audio_samples); - } else { + } else { - moreAudio = FALSE; + moreAudio = FALSE; - } + } } audioMutex->unlock(); } void LoopControl::killTimers() { audioMutex->lock(); if ( hasVideoChannel ) - killTimer( videoId ); + killTimer( videoId ); killTimer( sliderId ); threadOkToGo = FALSE; audioMutex->unlock(); } void LoopControl::startTimers() { audioMutex->lock(); moreVideo = FALSE; moreAudio = FALSE; if ( hasVideoChannel ) { - moreVideo = TRUE; - int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value - videoId = startTimer( mSecsBetweenFrames ); + moreVideo = TRUE; + int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value + videoId = startTimer( mSecsBetweenFrames ); } if ( hasAudioChannel ) { - moreAudio = TRUE; - threadOkToGo = TRUE; + moreAudio = TRUE; + threadOkToGo = TRUE; } sliderId = startTimer( 300 ); // update slider every 1/3 second audioMutex->unlock(); } void LoopControl::setPaused( bool pause ) { if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) - return; + return; if ( pause ) { - killTimers(); + killTimers(); } else { - // Force an update of the position - mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); - mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); - // Just like we never stopped - startTimers(); + // Force an update of the position + mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); + mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); + // Just like we never stopped + startTimers(); } } void LoopControl::stop( bool willPlayAgainShortly ) { #if defined(Q_WS_QWS) && !defined(QT_NO_COP) if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { - disabledSuspendScreenSaver = FALSE; - // Re-enable the suspend mode - QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; + disabledSuspendScreenSaver = FALSE; + // Re-enable the suspend mode + QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; } #endif if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { - killTimers(); + killTimers(); - audioMutex->lock(); + audioMutex->lock(); - mediaPlayerState->curDecoder()->close(); + mediaPlayerState->curDecoder()->close(); - if ( audioDevice ) { - delete audioDevice; - delete audioBuffer; - audioDevice = 0; - audioBuffer = 0; - } + if ( audioDevice ) { + delete audioDevice; + delete audioBuffer; + audioDevice = 0; + audioBuffer = 0; + } - audioMutex->unlock(); + audioMutex->unlock(); } } bool LoopControl::init( const QString& filename ) { stop(); audioMutex->lock(); fileName = filename; stream = 0; // only play stream 0 for now current_frame = total_video_frames = total_audio_samples = 0; qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) { - if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename ) ) { - total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); - mediaPlayerState->libMpeg3Decoder()->close(); - } + if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename ) ) { + total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); + mediaPlayerState->libMpeg3Decoder()->close(); + } } - + if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { - audioMutex->unlock(); - return FALSE; + audioMutex->unlock(); + return FALSE; } hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; if ( hasAudioChannel ) { - int astream = 0; + int astream = 0; - channels = mediaPlayerState->curDecoder()->audioChannels( astream ); - DecodeLoopDebug(( "channels = %d\n", channels )); - - if ( !total_audio_samples ) - total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); + channels = mediaPlayerState->curDecoder()->audioChannels( astream ); + qDebug( "LC- channels = %d", channels ); + + if ( !total_audio_samples ) + total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); - total_audio_samples += 1000; +// total_audio_samples += 1000; - mediaPlayerState->setLength( total_audio_samples ); - - freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); - DecodeLoopDebug(( "frequency = %d\n", freq )); + mediaPlayerState->setLength( total_audio_samples ); + + freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); + qDebug( "LC- frequency = %d", freq ); - audioSampleCounter = 0; + audioSampleCounter = 0; - static const int bytes_per_sample = 2; //16 bit + int bits_per_sample = mediaPlayerState->curDecoder()->audioBitsPerSample( astream); - audioDevice = new AudioDevice( freq, channels, bytes_per_sample ); - audioBuffer = new char[ audioDevice->bufferSize() ]; - channels = audioDevice->channels(); + audioDevice = new AudioDevice( freq, channels, bits_per_sample); + audioBuffer = new char[ audioDevice->bufferSize() ]; + channels = audioDevice->channels(); - //### must check which frequency is actually used. - static const int size = 1; - short int buf[size]; - long samplesRead = 0; - mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); + //### must check which frequency is actually used. + static const int size = 1; + short int buf[size]; + long samplesRead = 0; + mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); } if ( hasVideoChannel ) { - total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); + total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); - mediaPlayerState->setLength( total_video_frames ); + mediaPlayerState->setLength( total_video_frames ); - framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); - DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); + framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); + DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); - if ( framerate <= 1.0 ) { - DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); - framerate = 25; - } + if ( framerate <= 1.0 ) { + DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); + framerate = 25; + } - if ( total_video_frames == 1 ) { - DecodeLoopDebug(( "Cannot seek to frame" )); - } + if ( total_video_frames == 1 ) { + DecodeLoopDebug(( "Cannot seek to frame" )); + } } current_frame = 0; prev_frame = -1; connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) ); connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) ); audioMutex->unlock(); return TRUE; } void LoopControl::play() { #if defined(Q_WS_QWS) && !defined(QT_NO_COP) if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { - disabledSuspendScreenSaver = TRUE; - previousSuspendMode = hasVideoChannel; + disabledSuspendScreenSaver = TRUE; + previousSuspendMode = hasVideoChannel; // Stop the screen from blanking and power saving state - QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) - << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); + QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) + << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); } #endif playtime.start(); startTimers(); } void LoopControl::setMute( bool on ) { if ( on != isMuted ) { - isMuted = on; - if ( !on ) { - // Force an update of the position - mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); - mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); - // Resume playing audio - moreAudio = TRUE; - } + isMuted = on; + if ( !on ) { + // Force an update of the position + mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); + mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); + // Resume playing audio + moreAudio = TRUE; + } } } diff --git a/core/multimedia/opieplayer/loopcontrol.h b/core/multimedia/opieplayer/loopcontrol.h index 967ee25..fc7d316 100644 --- a/core/multimedia/opieplayer/loopcontrol.h +++ b/core/multimedia/opieplayer/loopcontrol.h @@ -8,24 +8,26 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +// L.J.Potter added changes Fri 02-15-2002 + #ifndef MPEGVIEW_H #define MPEGVIEW_H #include <qwidget.h> #include <qdatetime.h> class LoopControl : public QObject { Q_OBJECT public: LoopControl( QObject *parent, const char *name ); diff --git a/core/multimedia/opieplayer/loopcontrol_threaded.cpp b/core/multimedia/opieplayer/loopcontrol_threaded.cpp index 2ec4a48..2e49bb7 100644 --- a/core/multimedia/opieplayer/loopcontrol_threaded.cpp +++ b/core/multimedia/opieplayer/loopcontrol_threaded.cpp @@ -17,35 +17,35 @@ ** not clear to you. ** **********************************************************************/ #define _REENTRANT #include <qpe/qpeapplication.h> #include <qimage.h> #include <qpainter.h> #ifdef Q_WS_QWS #include <qpe/qcopenvelope_qws.h> #endif +#include "mediaplayerplugininterface.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include <pthread.h> #include "loopcontrol.h" #include "audiodevice.h" #include "videowidget.h" #include "audiowidget.h" -#include "mediaplayerplugininterface.h" #include "mediaplayerstate.h" #if defined(QT_QWS_CUSTOM) || defined(QT_QWS_IPAQ) #define USE_REALTIME_AUDIO_THREAD #endif extern VideoWidget *videoUI; // now only needed to tell it to play a frame extern MediaPlayerState *mediaPlayerState; diff --git a/core/multimedia/opieplayer/main.cpp b/core/multimedia/opieplayer/main.cpp index 5246e40..9f7ef73 100644 --- a/core/multimedia/opieplayer/main.cpp +++ b/core/multimedia/opieplayer/main.cpp @@ -39,19 +39,19 @@ int main(int argc, char **argv) { MediaPlayerState st( 0, "mediaPlayerState" ); mediaPlayerState = &st; PlayListWidget pl( 0, "playList" ); playList = &pl; AudioWidget aw( 0, "audioUI" ); audioUI = &aw; VideoWidget vw( 0, "videoUI" ); videoUI = &vw; LoopControl lc( 0, "loopControl" ); loopControl = &lc; MediaPlayer mp( 0, "mediaPlayer" ); - pl.setCaption( MediaPlayer::tr("Media Player") ); + pl.setCaption( MediaPlayer::tr("Opie Player") ); a.showMainDocumentWidget(&pl); return a.exec(); } diff --git a/core/multimedia/opieplayer/mediaplayerplugininterface.h b/core/multimedia/opieplayer/mediaplayerplugininterface.h index 24d5a80..339b2e4 100644 --- a/core/multimedia/opieplayer/mediaplayerplugininterface.h +++ b/core/multimedia/opieplayer/mediaplayerplugininterface.h @@ -52,30 +52,25 @@ public: virtual bool open( const QString& file ) = 0; virtual bool close() = 0; virtual bool isOpen() = 0; virtual const QString &fileInfo() = 0; // If decoder doesn't support audio then return 0 here virtual int audioStreams() = 0; virtual int audioChannels( int stream ) = 0; virtual int audioFrequency( int stream ) = 0; virtual int audioSamples( int stream ) = 0; virtual bool audioSetSample( long sample, int stream ) = 0; virtual long audioGetSample( int stream ) = 0; -// virtual bool audioReadMonoSamples( short *samples, long samples, long& samplesRead, int stream ) = 0; -// virtual bool audioReadStereoSamples( short *samples, long samples, long& samplesRead, int stream ) = 0; virtual bool audioReadSamples( short *samples, int channels, long samples, long& samplesRead, int stream ) = 0; - // Libmpeg3 functions, perhaps good for reading an audio file with 5 channels or something! -// virtual bool audioReadSamples( short *samples, int channel, long samples, int stream ) = 0; -// virtual bool audioReReadSamples( short *samples, int channel, long samples, int stream ) = 0; // If decoder doesn't support video then return 0 here virtual int videoStreams() = 0; virtual int videoWidth( int stream ) = 0; virtual int videoHeight( int stream ) = 0; virtual double videoFrameRate( int stream ) = 0; // frames per second (this may change to frames/1000secs) virtual int videoFrames( int stream ) = 0; virtual bool videoSetFrame( long sample, int stream ) = 0; virtual long videoGetFrame( int stream ) = 0; virtual bool videoReadFrame( unsigned char **output_rows, int in_x, int in_y, int in_w, int in_h, ColorFormat color_model, int stream ) = 0; virtual bool videoReadScaledFrame( unsigned char **output_rows, int in_x, int in_y, int in_w, int in_h, int out_w, int out_h, ColorFormat color_model, int stream ) = 0; virtual bool videoReadYUVFrame( char *y_output, char *u_output, char *v_output, int in_x, int in_y, int in_w, int in_h, int stream ) = 0; @@ -87,24 +82,27 @@ public: virtual bool setSMP( int cpus ) = 0; virtual bool setMMX( bool useMMX ) = 0; // Capabilities virtual bool supportsAudio() = 0; virtual bool supportsVideo() = 0; virtual bool supportsYUV() = 0; virtual bool supportsMMX() = 0; virtual bool supportsSMP() = 0; virtual bool supportsStereo() = 0; virtual bool supportsScaling() = 0; + // File Properies + virtual long getPlayTime() { return -1; } + virtual int audioBitsPerSample( int stream ) = 0; }; class MediaPlayerEncoder; struct MediaPlayerPluginInterface : public QUnknownInterface { virtual MediaPlayerDecoder *decoder() = 0; virtual MediaPlayerEncoder *encoder() = 0; }; diff --git a/core/multimedia/opieplayer/mediaplayerstate.cpp b/core/multimedia/opieplayer/mediaplayerstate.cpp index 9b9d133..2a6bca3 100644 --- a/core/multimedia/opieplayer/mediaplayerstate.cpp +++ b/core/multimedia/opieplayer/mediaplayerstate.cpp @@ -17,33 +17,35 @@ ** not clear to you. ** **********************************************************************/ #include <qpe/qpeapplication.h> #include <qpe/qlibrary.h> #include <qpe/config.h> #include <qvaluelist.h> #include <qobject.h> #include <qdir.h> #include "mediaplayerplugininterface.h" #include "mediaplayerstate.h" + + #ifdef QT_NO_COMPONENT // Plugins which are compiled in when no plugin architecture available #include "libmad/libmadpluginimpl.h" #include "libmpeg3/libmpeg3pluginimpl.h" #include "wavplugin/wavpluginimpl.h" #endif -//#define MediaPlayerDebug(x) qDebug x +//#define MediaPlayerDebug(x) qDebug x #define MediaPlayerDebug(x) MediaPlayerState::MediaPlayerState( QObject *parent, const char *name ) : QObject( parent, name ), decoder( NULL ), libmpeg3decoder( NULL ) { Config cfg( "MediaPlayer" ); readConfig( cfg ); loadPlugins(); } MediaPlayerState::~MediaPlayerState() { @@ -86,100 +88,104 @@ struct MediaPlayerPlugin { MediaPlayerEncoder *encoder; }; static QValueList<MediaPlayerPlugin> pluginList; // Find the first decoder which supports this type of file MediaPlayerDecoder *MediaPlayerState::newDecoder( const QString& file ) { MediaPlayerDecoder *tmpDecoder = NULL; QValueList<MediaPlayerPlugin>::Iterator it; for ( it = pluginList.begin(); it != pluginList.end(); ++it ) { - if ( (*it).decoder->isFileSupported( file ) ) { - tmpDecoder = (*it).decoder; - break; - } + if ( (*it).decoder->isFileSupported( file ) ) { + tmpDecoder = (*it).decoder; + break; + } } return decoder = tmpDecoder; } MediaPlayerDecoder *MediaPlayerState::curDecoder() { return decoder; } // ### hack to get true sample count MediaPlayerDecoder *MediaPlayerState::libMpeg3Decoder() { return libmpeg3decoder; } +// ### hack to get true sample count +// MediaPlayerDecoder *MediaPlayerState::libWavDecoder() { +// return libwavdecoder; +// } void MediaPlayerState::loadPlugins() { #ifndef QT_NO_COMPONENT QValueList<MediaPlayerPlugin>::Iterator mit; for ( mit = pluginList.begin(); mit != pluginList.end(); ++mit ) { - (*mit).iface->release(); - (*mit).library->unload(); - delete (*mit).library; + (*mit).iface->release(); + (*mit).library->unload(); + delete (*mit).library; } pluginList.clear(); QString path = QPEApplication::qpeDir() + "/plugins/codecs"; QDir dir( path, "lib*.so" ); QStringList list = dir.entryList(); QStringList::Iterator it; for ( it = list.begin(); it != list.end(); ++it ) { - MediaPlayerPluginInterface *iface = 0; - QLibrary *lib = new QLibrary( path + "/" + *it ); + MediaPlayerPluginInterface *iface = 0; + QLibrary *lib = new QLibrary( path + "/" + *it ); - MediaPlayerDebug(( "querying: %s", QString( path + "/" + *it ).latin1() )); + MediaPlayerDebug(( "querying: %s", QString( path + "/" + *it ).latin1() )); - if ( lib->queryInterface( IID_MediaPlayerPlugin, (QUnknownInterface**)&iface ) == QS_OK ) { + if ( lib->queryInterface( IID_MediaPlayerPlugin, (QUnknownInterface**)&iface ) == QS_OK ) { - MediaPlayerDebug(( "loading: %s", QString( path + "/" + *it ).latin1() )); + MediaPlayerDebug(( "loading: %s", QString( path + "/" + *it ).latin1() )); - MediaPlayerPlugin plugin; - plugin.library = lib; - plugin.iface = iface; - plugin.decoder = plugin.iface->decoder(); - plugin.encoder = plugin.iface->encoder(); - pluginList.append( plugin ); + MediaPlayerPlugin plugin; + plugin.library = lib; + plugin.iface = iface; + plugin.decoder = plugin.iface->decoder(); + plugin.encoder = plugin.iface->encoder(); + pluginList.append( plugin ); - // ### hack to get true sample count - if ( plugin.decoder->pluginName() == QString("LibMpeg3Plugin") ) - libmpeg3decoder = plugin.decoder; + // ### hack to get true sample count + if ( plugin.decoder->pluginName() == QString("LibMpeg3Plugin") ) + libmpeg3decoder = plugin.decoder; - } else { - delete lib; - } + } else { + delete lib; + } } #else pluginList.clear(); MediaPlayerPlugin plugin0; plugin0.iface = new LibMpeg3PluginImpl; plugin0.decoder = plugin0.iface->decoder(); plugin0.encoder = plugin0.iface->encoder(); pluginList.append( plugin0 ); MediaPlayerPlugin plugin1; plugin1.iface = new LibMadPluginImpl; plugin1.decoder = plugin1.iface->decoder(); plugin1.encoder = plugin1.iface->encoder(); pluginList.append( plugin1 ); MediaPlayerPlugin plugin2; plugin2.iface = new WavPluginImpl; plugin2.decoder = plugin2.iface->decoder(); plugin2.encoder = plugin2.iface->encoder(); pluginList.append( plugin2 ); #endif if ( pluginList.count() ) - MediaPlayerDebug(( "%i decoders found", pluginList.count() )); + MediaPlayerDebug(( "%i decoders found", pluginList.count() )); else - MediaPlayerDebug(( "No decoders found" )); + MediaPlayerDebug(( "No decoders found" )); } diff --git a/core/multimedia/opieplayer/mediaplayerstate.h b/core/multimedia/opieplayer/mediaplayerstate.h index 5d95b92..1a23742 100644 --- a/core/multimedia/opieplayer/mediaplayerstate.h +++ b/core/multimedia/opieplayer/mediaplayerstate.h @@ -25,65 +25,65 @@ class MediaPlayerDecoder; class Config; class MediaPlayerState : public QObject { Q_OBJECT public: MediaPlayerState( QObject *parent, const char *name ); ~MediaPlayerState(); - bool fullscreen() { return isFullscreen; } - bool scaled() { return isScaled; } - bool looping() { return isLooping; } - bool shuffled() { return isShuffled; } - bool playlist() { return usePlaylist; } - bool paused() { return isPaused; } - bool playing() { return isPlaying; } - long position() { return curPosition; } - long length() { return curLength; } - char view() { return curView; } + bool fullscreen() { return isFullscreen; } + bool scaled() { return isScaled; } + bool looping() { return isLooping; } + bool shuffled() { return isShuffled; } + bool playlist() { return usePlaylist; } + bool paused() { return isPaused; } + bool playing() { return isPlaying; } + long position() { return curPosition; } + long length() { return curLength; } + char view() { return curView; } MediaPlayerDecoder *newDecoder( const QString& file ); MediaPlayerDecoder *curDecoder(); MediaPlayerDecoder *libMpeg3Decoder(); // ### Yucky hack needed to use libmpeg3plugin to get the - // number of audio samples if we are using the libmad plugin + // number of audio samples if we are using the libmad plugin public slots: void setFullscreen( bool b ) { if ( isFullscreen == b ) return; isFullscreen = b; emit fullscreenToggled(b); } void setScaled( bool b ) { if ( isScaled == b ) return; isScaled = b; emit scaledToggled(b); } void setLooping( bool b ) { if ( isLooping == b ) return; isLooping = b; emit loopingToggled(b); } void setShuffled( bool b ) { if ( isShuffled == b ) return; isShuffled = b; emit shuffledToggled(b); } void setPlaylist( bool b ) { if ( usePlaylist == b ) return; usePlaylist = b; emit playlistToggled(b); } - void setPaused( bool b ) { if ( isPaused == b ) return; isPaused = b; emit pausedToggled(b); } - void setPlaying( bool b ) { if ( isPlaying == b ) return; isPlaying = b; emit playingToggled(b); } + void setPaused( bool b ) { if ( isPaused == b ) return; isPaused = b; emit pausedToggled(b); } + void setPlaying( bool b ) { if ( isPlaying == b ) return; isPlaying = b; emit playingToggled(b); } void setPosition( long p ) { if ( curPosition == p ) return; curPosition = p; emit positionChanged(p); } void updatePosition( long p ){ if ( curPosition == p ) return; curPosition = p; emit positionUpdated(p); } - void setLength( long l ) { if ( curLength == l ) return; curLength = l; emit lengthChanged(l); } - void setView( char v ) { if ( curView == v ) return; curView = v; emit viewChanged(v); } - - void setPrev() { emit prev(); } - void setNext() { emit next(); } - void setList() { setPlaying( FALSE ); setView('l'); } - void setVideo() { setView('v'); } - void setAudio() { setView('a'); } - - void toggleFullscreen() { setFullscreen( !isFullscreen ); } - void toggleScaled() { setScaled( !isScaled); } - void toggleLooping() { setLooping( !isLooping); } - void toggleShuffled() { setShuffled( !isShuffled); } - void togglePlaylist() { setPlaylist( !usePlaylist); } - void togglePaused() { setPaused( !isPaused); } - void togglePlaying() { setPlaying( !isPlaying); } + void setLength( long l ) { if ( curLength == l ) return; curLength = l; emit lengthChanged(l); } + void setView( char v ) { if ( curView == v ) return; curView = v; emit viewChanged(v); } + + void setPrev() { emit prev(); } + void setNext() { emit next(); } + void setList() { setPlaying( FALSE ); setView('l'); } + void setVideo() { setView('v'); } + void setAudio() { setView('a'); } + + void toggleFullscreen() { setFullscreen( !isFullscreen ); } + void toggleScaled() { setScaled( !isScaled); } + void toggleLooping() { setLooping( !isLooping); } + void toggleShuffled() { setShuffled( !isShuffled); } + void togglePlaylist() { setPlaylist( !usePlaylist); } + void togglePaused() { setPaused( !isPaused); } + void togglePlaying() { setPlaying( !isPlaying); } signals: void fullscreenToggled( bool ); void scaledToggled( bool ); void loopingToggled( bool ); void shuffledToggled( bool ); void playlistToggled( bool ); void pausedToggled( bool ); void playingToggled( bool ); void positionChanged( long ); // When the slider is moved void positionUpdated( long ); // When the media file progresses void lengthChanged( long ); @@ -97,21 +97,22 @@ private: bool isScaled; bool isLooping; bool isShuffled; bool usePlaylist; bool isPaused; bool isPlaying; long curPosition; long curLength; char curView; MediaPlayerDecoder *decoder; MediaPlayerDecoder *libmpeg3decoder; +// MediaPlayerDecoder *libwavdecoder; void loadPlugins(); void readConfig( Config& cfg ); void writeConfig( Config& cfg ) const; }; #endif // MEDIA_PLAYER_STATE_H diff --git a/core/multimedia/opieplayer/playlistselection.cpp b/core/multimedia/opieplayer/playlistselection.cpp index fbfb946..f17ab6f 100644 --- a/core/multimedia/opieplayer/playlistselection.cpp +++ b/core/multimedia/opieplayer/playlistselection.cpp @@ -25,26 +25,26 @@ #include <qlistview.h> #include <qlist.h> #include <qpixmap.h> #include "playlistselection.h" #include <stdlib.h> class PlayListSelectionItem : public QListViewItem { public: PlayListSelectionItem( QListView *parent, const DocLnk *f ) : QListViewItem( parent ), fl( f ) { - setText( 0, f->name() ); - setPixmap( 0, f->pixmap() ); + setText( 0, f->name() ); + setPixmap( 0, f->pixmap() ); } ~PlayListSelectionItem() { }; const DocLnk *file() const { return fl; } private: const DocLnk *fl; }; @@ -62,118 +62,118 @@ PlayListSelection::PlayListSelection( QWidget *parent, const char *name ) } PlayListSelection::~PlayListSelection() { } #ifdef USE_PLAYLIST_BACKGROUND void PlayListSelection::drawBackground( QPainter *p, const QRect &r ) { p->fillRect( r, QBrush( white ) ); QImage logo = Resource::loadImage( "mpegplayer/background" ); if ( !logo.isNull() ) - p->drawImage( (width() - logo.width()) / 2, (height() - logo.height()) / 2, logo ); + p->drawImage( (width() - logo.width()) / 2, (height() - logo.height()) / 2, logo ); } #endif void PlayListSelection::contentsMouseMoveEvent( QMouseEvent *event ) { if ( event->state() == QMouseEvent::LeftButton ) { - QListViewItem *currentItem = selectedItem(); - QListViewItem *itemUnder = itemAt( QPoint( event->pos().x(), event->pos().y() - contentsY() ) ); - if ( currentItem && currentItem->itemAbove() == itemUnder ) - moveSelectedUp(); - else if ( currentItem && currentItem->itemBelow() == itemUnder ) - moveSelectedDown(); + QListViewItem *currentItem = selectedItem(); + QListViewItem *itemUnder = itemAt( QPoint( event->pos().x(), event->pos().y() - contentsY() ) ); + if ( currentItem && currentItem->itemAbove() == itemUnder ) + moveSelectedUp(); + else if ( currentItem && currentItem->itemBelow() == itemUnder ) + moveSelectedDown(); } } const DocLnk *PlayListSelection::current() { PlayListSelectionItem *item = (PlayListSelectionItem *)selectedItem(); if ( item ) - return item->file(); + return item->file(); return NULL; } void PlayListSelection::addToSelection( const DocLnk &lnk ) { - PlayListSelectionItem *item = new PlayListSelectionItem( this, new DocLnk( lnk ) ); + PlayListSelectionItem *item = new PlayListSelectionItem( this, new DocLnk( lnk ) ); QListViewItem *current = selectedItem(); if ( current ) item->moveItem( current ); setSelected( item, TRUE ); ensureItemVisible( selectedItem() ); } void PlayListSelection::removeSelected() { QListViewItem *item = selectedItem(); if ( item ) - delete item; + delete item; setSelected( currentItem(), TRUE ); ensureItemVisible( selectedItem() ); } void PlayListSelection::moveSelectedUp() { QListViewItem *item = selectedItem(); if ( item && item->itemAbove() ) - item->itemAbove()->moveItem( item ); + item->itemAbove()->moveItem( item ); ensureItemVisible( selectedItem() ); } void PlayListSelection::moveSelectedDown() { QListViewItem *item = selectedItem(); if ( item && item->itemBelow() ) item->moveItem( item->itemBelow() ); ensureItemVisible( selectedItem() ); } bool PlayListSelection::prev() { QListViewItem *item = selectedItem(); if ( item && item->itemAbove() ) setSelected( item->itemAbove(), TRUE ); else - return FALSE; + return FALSE; ensureItemVisible( selectedItem() ); return TRUE; } bool PlayListSelection::next() { QListViewItem *item = selectedItem(); if ( item && item->itemBelow() ) setSelected( item->itemBelow(), TRUE ); else - return FALSE; + return FALSE; ensureItemVisible( selectedItem() ); return TRUE; } bool PlayListSelection::first() { QListViewItem *item = firstChild(); if ( item ) setSelected( item, TRUE ); else - return FALSE; + return FALSE; ensureItemVisible( selectedItem() ); return TRUE; } bool PlayListSelection::last() { QListViewItem *prevItem = NULL; QListViewItem *item = firstChild(); while ( ( item = item->nextSibling() ) ) - prevItem = item; + prevItem = item; if ( prevItem ) setSelected( prevItem, TRUE ); else - return FALSE; + return FALSE; ensureItemVisible( selectedItem() ); return TRUE; } diff --git a/core/multimedia/opieplayer/playlistwidget.cpp b/core/multimedia/opieplayer/playlistwidget.cpp index 969fc4b..4e1543e 100644 --- a/core/multimedia/opieplayer/playlistwidget.cpp +++ b/core/multimedia/opieplayer/playlistwidget.cpp @@ -11,281 +11,384 @@ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qpe/qpemenubar.h> #include <qpe/qpetoolbar.h> #include <qpe/fileselector.h> +#include <qpe/qpeapplication.h> + #include <qpe/applnk.h> #include <qpe/config.h> #include <qpe/global.h> #include <qpe/resource.h> #include <qaction.h> #include <qimage.h> #include <qfile.h> #include <qlayout.h> #include <qlabel.h> #include <qlist.h> #include <qlistbox.h> #include <qmainwindow.h> #include <qmessagebox.h> #include <qtoolbutton.h> +#include <qtabwidget.h> +#include <qlistview.h> +#include <qpoint.h> +#include <qtimer.h> #include "playlistselection.h" #include "playlistwidget.h" #include "mediaplayerstate.h" #include <stdlib.h> +#define BUTTONS_ON_TOOLBAR +#define SIDE_BUTTONS +#define CAN_SAVE_LOAD_PLAYLISTS extern MediaPlayerState *mediaPlayerState; +// class myFileSelector { +// }; class PlayListWidgetPrivate { public: - QToolButton *tbPlay; - QToolButton *tbFull; - QToolButton *tbLoop; - QToolButton *tbScale; - QToolButton *tbShuffle; - + QToolButton *tbPlay, *tbFull, *tbLoop, *tbScale, *tbShuffle, *tbAddToList, *tbRemoveFromList, *tbMoveUp, *tbMoveDown, *tbRemove; QFrame *playListFrame; FileSelector *files; PlayListSelection *selectedFiles; bool setDocumentUsed; DocLnk *current; }; class ToolButton : public QToolButton { public: ToolButton( QWidget *parent, const char *name, const QString& icon, QObject *handler, const QString& slot, bool t = FALSE ) - : QToolButton( parent, name ) { - setTextLabel( name ); - setPixmap( Resource::loadPixmap( icon ) ); - setAutoRaise( TRUE ); - setFocusPolicy( QWidget::NoFocus ); - setToggleButton( t ); - connect( this, t ? SIGNAL( toggled(bool) ) : SIGNAL( clicked() ), handler, slot ); - QPEMenuToolFocusManager::manager()->addWidget( this ); + : QToolButton( parent, name ) { + setTextLabel( name ); + setPixmap( Resource::loadPixmap( icon ) ); + setAutoRaise( TRUE ); + setFocusPolicy( QWidget::NoFocus ); + setToggleButton( t ); + connect( this, t ? SIGNAL( toggled(bool) ) : SIGNAL( clicked() ), handler, slot ); + QPEMenuToolFocusManager::manager()->addWidget( this ); } }; class MenuItem : public QAction { public: MenuItem( QWidget *parent, const QString& text, QObject *handler, const QString& slot ) - : QAction( text, QString::null, 0, 0 ) { - connect( this, SIGNAL( activated() ), handler, slot ); - addTo( parent ); + : QAction( text, QString::null, 0, 0 ) { + connect( this, SIGNAL( activated() ), handler, slot ); + addTo( parent ); } }; PlayListWidget::PlayListWidget( QWidget* parent, const char* name, WFlags fl ) : QMainWindow( parent, name, fl ) { d = new PlayListWidgetPrivate; d->setDocumentUsed = FALSE; d->current = NULL; + menuTimer = new QTimer( this ,"menu timer"), + connect( menuTimer, SIGNAL( timeout() ), SLOT( addSelected() ) ); setBackgroundMode( PaletteButton ); - setCaption( tr("MediaPlayer") ); + setCaption( tr("OpiePlayer") ); setIcon( Resource::loadPixmap( "MPEGPlayer" ) ); setToolBarsMovable( FALSE ); // Create Toolbar QPEToolBar *toolbar = new QPEToolBar( this ); toolbar->setHorizontalStretchable( TRUE ); // Create Menubar QPEMenuBar *menu = new QPEMenuBar( toolbar ); menu->setMargin( 0 ); QPEToolBar *bar = new QPEToolBar( this ); bar->setLabel( tr( "Play Operations" ) ); -#ifdef BUTTONS_ON_TOOLBAR - d->tbPlay = new ToolButton( bar, tr( "Play" ), "mpegplayer/play", mediaPlayerState, SLOT(setPlaying(bool)), TRUE ); - d->tbShuffle = new ToolButton( bar, tr( "Randomize" ), "mpegplayer/shuffle", mediaPlayerState, SLOT(setShuffled(bool)), TRUE ); -#endif - d->tbLoop = new ToolButton( bar, tr( "Loop" ), "mpegplayer/loop", mediaPlayerState, SLOT(setLooping(bool)), TRUE ); - d->tbFull = new ToolButton( bar, tr( "Fullscreen" ), "fullscreen", mediaPlayerState, SLOT(setFullscreen(bool)), TRUE ); - d->tbScale = new ToolButton( bar, tr( "Scale" ), "mpegplayer/scale", mediaPlayerState, SLOT(setScaled(bool)), TRUE ); + d->tbAddToList = new ToolButton( bar, tr( "Add to Playlist" ), "mpegplayer/add_to_playlist", + this , SLOT(addSelected()) ); + d->tbRemoveFromList = new ToolButton( bar, tr( "Remove from Playlist" ), "mpegplayer/remove_from_playlist", + this , SLOT(removeSelected()) ); + d->tbPlay = new ToolButton( bar, tr( "Play" ), "mpegplayer/play", + mediaPlayerState, SLOT(setPlaying(bool)), TRUE ); + + d->tbShuffle = new ToolButton( bar, tr( "Randomize" ), "mpegplayer/shuffle", + mediaPlayerState, SLOT(setShuffled(bool)), TRUE ); + d->tbLoop = new ToolButton( bar, tr( "Loop" ), "mpegplayer/loop", + mediaPlayerState, SLOT(setLooping(bool)), TRUE ); + +// d->tbFull = new ToolButton( bar, tr( "Fullscreen" ), "fullscreen", mediaPlayerState, SLOT(setFullscreen(bool)), TRUE ); +// d->tbScale = new ToolButton( bar, tr( "Scale" ), "mpegplayer/scale", mediaPlayerState, SLOT(setScaled(bool)), TRUE ); QPopupMenu *pmPlayList = new QPopupMenu( this ); - menu->insertItem( tr( "PlayList" ), pmPlayList ); - new MenuItem( pmPlayList, tr( "Toggle PlayList" ), mediaPlayerState, SLOT( togglePlaylist() ) ); + menu->insertItem( tr( "File" ), pmPlayList ); new MenuItem( pmPlayList, tr( "Clear List" ), this, SLOT( clearList() ) ); - new MenuItem( pmPlayList, tr( "Add all music files" ), this, SLOT( addAllMusicToList() ) ); + new MenuItem( pmPlayList, tr( "Add all audio files" ), this, SLOT( addAllMusicToList() ) ); new MenuItem( pmPlayList, tr( "Add all video files" ), this, SLOT( addAllVideoToList() ) ); new MenuItem( pmPlayList, tr( "Add all files" ), this, SLOT( addAllToList() ) ); -#ifdef CAN_SAVE_LOAD_PLAYLISTS new MenuItem( pmPlayList, tr( "Save PlayList" ), this, SLOT( saveList() ) ); new MenuItem( pmPlayList, tr( "Load PlayList" ), this, SLOT( loadList() ) ); -#endif + + QPopupMenu *pmView = new QPopupMenu( this ); + menu->insertItem( tr( "View" ), pmView ); + + fullScreenButton = new QAction(tr("Full Screen"), Resource::loadPixmap("fullscreen"), QString::null, 0, this, 0); + connect( fullScreenButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleFullscreen()) ); + fullScreenButton->addTo(pmView); + scaleButton = new QAction(tr("Scale"), Resource::loadPixmap("mpegplayer/scale"), QString::null, 0, this, 0); + connect( scaleButton, SIGNAL(activated()), mediaPlayerState, SLOT(toggleScaled()) ); + scaleButton->addTo(pmView); QVBox *vbox5 = new QVBox( this ); vbox5->setBackgroundMode( PaletteButton ); + QVBox *vbox4 = new QVBox( vbox5 ); vbox4->setBackgroundMode( PaletteButton ); +// vbox4->setMargin(4); +// libString = new QLabel( tr(" Media Library"), vbox4 ); +// libString->setBackgroundMode( QButton::PaletteButton ); +// libString->setFont( QFont( "Helvetica", 8, QFont::Bold ) ); + + QHBox *hbox6 = new QHBox( vbox4 ); hbox6->setBackgroundMode( PaletteButton ); + + tabWidget = new QTabWidget( hbox6, "tabWidget" ); + tabWidget->setTabShape(QTabWidget::Triangular); + + + QWidget *pTab; + pTab = new QWidget( tabWidget, "pTab" ); + playlistView = new QListView( pTab, "Videoview" ); + playlistView->setMinimumSize(236,260); + tabWidget->insertTab( pTab,"Playlist"); // Add the playlist area - QVBox *vbox3 = new QVBox( vbox5 ); vbox3->setBackgroundMode( PaletteButton ); - d->playListFrame = vbox3; - QLabel *plString = new QLabel( tr(" PlayList"), vbox3 ); - plString->setBackgroundMode( QButton::PaletteButton ); - plString->setFont( QFont( "Helvetica", 8, QFont::Bold ) ); + QVBox *vbox3 = new QVBox( pTab ); vbox3->setBackgroundMode( PaletteButton ); + d->playListFrame = vbox3; + d->playListFrame ->setMinimumSize(235,260); QHBox *hbox2 = new QHBox( vbox3 ); hbox2->setBackgroundMode( PaletteButton ); - d->selectedFiles = new PlayListSelection( hbox2 ); - QVBox *vbox1 = new QVBox( hbox2 ); vbox1->setBackgroundMode( PaletteButton ); - -#ifndef BUTTONS_ON_TOOLBAR - d->tbPlay = new ToolButton( vbox1, tr( "Play" ), "mpegplayer/play", mediaPlayerState, SLOT(setPlaying(bool)), TRUE ); - QVBox *stretch1 = new QVBox( vbox1 ); stretch1->setBackgroundMode( PaletteButton ); // add stretch -#endif - new ToolButton( vbox1, tr( "Move Up" ), "mpegplayer/up", d->selectedFiles, SLOT(moveSelectedUp()) ); - new ToolButton( vbox1, tr( "Remove" ), "mpegplayer/cut", d->selectedFiles, SLOT(removeSelected()) ); - new ToolButton( vbox1, tr( "Move Down" ), "mpegplayer/down", d->selectedFiles, SLOT(moveSelectedDown()) ); - QVBox *stretch2 = new QVBox( vbox1 ); stretch2->setBackgroundMode( PaletteButton ); // add stretch -#ifndef BUTTONS_ON_TOOLBAR - d->tbShuffle = new ToolButton( vbox1, tr( "Randomize" ), "mpegplayer/shuffle", mediaPlayerState, SLOT(setShuffled(bool)), TRUE ); -#endif + d->selectedFiles = new PlayListSelection( hbox2); + QVBox *vbox1 = new QVBox( hbox2 ); vbox1->setBackgroundMode( PaletteButton ); + + QVBox *stretch1 = new QVBox( vbox1 ); stretch1->setBackgroundMode( PaletteButton ); // add stretch + new ToolButton( vbox1, tr( "Move Up" ), "mpegplayer/up", d->selectedFiles, SLOT(moveSelectedUp()) ); + new ToolButton( vbox1, tr( "Remove" ), "mpegplayer/cut", d->selectedFiles, SLOT(removeSelected()) ); + new ToolButton( vbox1, tr( "Move Down" ), "mpegplayer/down", d->selectedFiles, SLOT(moveSelectedDown()) ); + QVBox *stretch2 = new QVBox( vbox1 ); stretch2->setBackgroundMode( PaletteButton ); // add stretch + + QWidget *aTab; + aTab = new QWidget( tabWidget, "aTab" ); + audioView = new QListView( aTab, "Audioview" ); + audioView->setMinimumSize(233,260); + audioView->addColumn( "Title",150); + audioView->addColumn("Size", 45); + audioView->addColumn("Media",35); + audioView->setColumnAlignment(1, Qt::AlignRight); + audioView->setColumnAlignment(2, Qt::AlignRight); + tabWidget->insertTab(aTab,"Audio"); +// audioView + Global::findDocuments(&files, "audio/*"); + QListIterator<DocLnk> dit( files.children() ); + QString storage; + for ( ; dit.current(); ++dit ) { + QListViewItem * newItem; + if(dit.current()->file().find("/mnt/cf") != -1 ) storage="CF"; + else if(dit.current()->file().find("/mnt/card") != -1 ) storage="SD"; + else storage="RAM"; + + newItem= /*(void)*/ new QListViewItem( audioView, dit.current()->name(), QString::number( QFile( dit.current()->file()).size() ), storage); + newItem->setPixmap(0, Resource::loadPixmap( "mpegplayer/musicfile" )); + } +// videowidget + + QWidget *vTab; + vTab = new QWidget( tabWidget, "vTab" ); + videoView = new QListView( vTab, "Videoview" ); + videoView->setMinimumSize(233,260); + + videoView->addColumn("Title",150); + videoView->addColumn("Size",45); + videoView->addColumn("Media",35); + videoView->setColumnAlignment(1, Qt::AlignRight); + videoView->setColumnAlignment(2, Qt::AlignRight); + + tabWidget->insertTab( vTab,"Video"); + + Global::findDocuments(&vFiles, "video/*"); + QListIterator<DocLnk> Vdit( vFiles.children() ); + for ( ; Vdit.current(); ++Vdit ) { + if( Vdit.current()->file().find("/mnt/cf") != -1 ) storage="CF"; + else if( Vdit.current()->file().find("/mnt/card") != -1 ) storage="SD"; + else storage="RAM"; + QListViewItem * newItem; + newItem= /*(void)*/ new QListViewItem( videoView, Vdit.current()->name(), QString::number( QFile( Vdit.current()->file()).size() ), storage); + newItem->setPixmap(0, Resource::loadPixmap( "mpegplayer/videofile" )); + } + + +// d->tbPlay = new ToolButton( vbox1, tr( "Play" ), "mpegplayer/play", mediaPlayerState, SLOT(setPlaying(bool)), TRUE ); +// d->tbShuffle = new ToolButton( vbox1, tr( "Randomize" ), "mpegplayer/shuffle", mediaPlayerState, SLOT(setShuffled(bool)), TRUE ); // add the library area - QVBox *vbox4 = new QVBox( vbox5 ); vbox4->setBackgroundMode( PaletteButton ); - QLabel *libString = new QLabel( tr(" Media Library"), vbox4 ); - libString->setBackgroundMode( QButton::PaletteButton ); - libString->setFont( QFont( "Helvetica", 8, QFont::Bold ) ); +// d->files->setBackgroundMode( PaletteButton ); +// QVBox *vbox7 = new QVBox( hbox6 ); vbox7->setBackgroundMode( PaletteButton ); - QHBox *hbox6 = new QHBox( vbox4 ); hbox6->setBackgroundMode( PaletteButton ); - d->files = new FileSelector( "video/*;audio/*", hbox6, "Find Media Files", FALSE, FALSE ); - d->files->setBackgroundMode( PaletteButton ); - QVBox *vbox7 = new QVBox( hbox6 ); vbox7->setBackgroundMode( PaletteButton ); +// #ifdef SIDE_BUTTONS +// QVBox *stretch3 = new QVBox( vbox1 ); stretch3->setBackgroundMode( PaletteButton ); // add stretch +// #endif + QPEApplication::setStylusOperation( this, QPEApplication::RightOnHold ); + +// connect( audioView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( playIt( QListViewItem *) ) ); +// connect( videoView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( playIt( QListViewItem *) ) ); -#ifdef SIDE_BUTTONS - new ToolButton( vbox7, tr( "Add to Playlist" ), "mpegplayer/add_to_playlist", d->selectedFiles, SLOT(addSelected()) ); - new ToolButton( vbox7, tr( "Remove from Playlist" ), "mpegplayer/remove_from_playlist", d->selectedFiles, SLOT(removeSelected()) ); - QVBox *stretch3 = new QVBox( vbox1 ); stretch3->setBackgroundMode( PaletteButton ); // add stretch -#endif + connect( audioView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( addToSelection( QListViewItem *) ) ); + connect( videoView, SIGNAL( clicked( QListViewItem *) ), this, SLOT( addToSelection( QListViewItem *) ) ); - connect( d->files, SIGNAL( fileSelected( const DocLnk & ) ), this, SLOT( addToSelection( const DocLnk & ) ) ); + connect( audioView, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint&, int ) ), + this, SLOT( addToSelection( QListViewItem *, const QPoint&, int )) ); + connect( videoView, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint&, int ) ), + this, SLOT( addToSelection( QListViewItem *, const QPoint&, int )) ); + + connect( playlistView, SIGNAL( pressed( QListViewItem *) ), this, SLOT( playIt( QListViewItem *) ) ); + connect( tabWidget, SIGNAL (currentChanged(QWidget*)),this,SLOT(tabChanged(QWidget*))); + // connect( d->files, SIGNAL( fileSelected( const DocLnk & ) ), this, SLOT( addToSelection( const DocLnk & ) ) ); + // connect( d->files, SIGNAL( fileSelected( const DocLnk & ) ), this, SLOT( addToSelection( const DocLnk & ) ) ); connect( mediaPlayerState, SIGNAL( playingToggled( bool ) ), d->tbPlay, SLOT( setOn( bool ) ) ); connect( mediaPlayerState, SIGNAL( loopingToggled( bool ) ), d->tbLoop, SLOT( setOn( bool ) ) ); connect( mediaPlayerState, SIGNAL( shuffledToggled( bool ) ), d->tbShuffle, SLOT( setOn( bool ) ) ); - connect( mediaPlayerState, SIGNAL( fullscreenToggled( bool ) ), d->tbFull, SLOT( setOn( bool ) ) ); - connect( mediaPlayerState, SIGNAL( scaledToggled( bool ) ), d->tbScale, SLOT( setOn( bool ) ) ); - connect( mediaPlayerState, SIGNAL( fullscreenToggled( bool ) ), d->tbScale, SLOT( setEnabled( bool ) ) ); + +// connect( mediaPlayerState, SIGNAL( fullscreenToggled( bool ) ), fullScreenButton, SLOT( setOn( bool ) ) ); +// connect( mediaPlayerState, SIGNAL( scaledToggled( bool ) ), scaleButton, SLOT( setEnabled( bool ) ) ); +// connect( mediaPlayerState, SIGNAL( fullscreenToggled( bool ) ), fullScreenButton, SLOT( setEnabled( bool ) ) ); + connect( mediaPlayerState, SIGNAL( playlistToggled( bool ) ), this, SLOT( setPlaylist( bool ) ) ); setCentralWidget( vbox5 ); Config cfg( "MediaPlayer" ); readConfig( cfg ); initializeStates(); } PlayListWidget::~PlayListWidget() { Config cfg( "MediaPlayer" ); writeConfig( cfg ); if ( d->current ) - delete d->current; + delete d->current; delete d; } void PlayListWidget::initializeStates() { + d->tbPlay->setOn( mediaPlayerState->playing() ); d->tbLoop->setOn( mediaPlayerState->looping() ); d->tbShuffle->setOn( mediaPlayerState->shuffled() ); - d->tbFull->setOn( mediaPlayerState->fullscreen() ); - d->tbScale->setOn( mediaPlayerState->scaled() ); - d->tbScale->setEnabled( mediaPlayerState->fullscreen() ); - setPlaylist( mediaPlayerState->playlist() ); +// d->tbFull->setOn( mediaPlayerState->fullscreen() ); +// d->tbScale->setOn( mediaPlayerState->scaled() ); +// d->tbScale->setEnabled( mediaPlayerState->fullscreen() ); +// setPlaylist( mediaPlayerState->playlist() ); } void PlayListWidget::readConfig( Config& cfg ) { cfg.setGroup("PlayList"); int noOfFiles = cfg.readNumEntry("NumberOfFiles", 0 ); for ( int i = 0; i < noOfFiles; i++ ) { - QString entryName; - entryName.sprintf( "File%i", i + 1 ); - QString linkFile = cfg.readEntry( entryName ); - DocLnk lnk( linkFile ); - if ( lnk.isValid() ) + QString entryName; + entryName.sprintf( "File%i", i + 1 ); + QString linkFile = cfg.readEntry( entryName ); + DocLnk lnk( linkFile ); + if ( lnk.isValid() ) d->selectedFiles->addToSelection( lnk ); } } void PlayListWidget::writeConfig( Config& cfg ) const { cfg.setGroup("PlayList"); int noOfFiles = 0; d->selectedFiles->first(); do { - const DocLnk *lnk = d->selectedFiles->current(); - if ( lnk ) { - QString entryName; - entryName.sprintf( "File%i", noOfFiles + 1 ); - cfg.writeEntry( entryName, lnk->linkFile() ); - // if this link does exist, add it so we have the file - // next time... - if ( !QFile::exists( lnk->linkFile() ) ) { - // the way writing lnks doesn't really check for out - // of disk space, but check it anyway. - if ( !lnk->writeLink() ) { - QMessageBox::critical( 0, tr("Out of space"), - tr( "There was a problem saving " - "the playlist.\n" - "Your playlist " - "may be missing some entries\n" - "the next time you start it." ) - ); - } - } - noOfFiles++; - } + const DocLnk *lnk = d->selectedFiles->current(); + if ( lnk ) { + QString entryName; + entryName.sprintf( "File%i", noOfFiles + 1 ); + cfg.writeEntry( entryName, lnk->linkFile() ); + // if this link does exist, add it so we have the file + // next time... + if ( !QFile::exists( lnk->linkFile() ) ) { + // the way writing lnks doesn't really check for out + // of disk space, but check it anyway. + if ( !lnk->writeLink() ) { + QMessageBox::critical( 0, tr("Out of space"), + tr( "There was a problem saving " + "the playlist.\n" + "Your playlist " + "may be missing some entries\n" + "the next time you start it." ) + ); + } + } + noOfFiles++; + } } while ( d->selectedFiles->next() ); cfg.writeEntry("NumberOfFiles", noOfFiles ); } void PlayListWidget::addToSelection( const DocLnk& lnk ) { - d->setDocumentUsed = FALSE; + d->setDocumentUsed = FALSE; if ( mediaPlayerState->playlist() ) d->selectedFiles->addToSelection( lnk ); else - mediaPlayerState->setPlaying( TRUE ); + mediaPlayerState->setPlaying( TRUE ); +} + + +void PlayListWidget::addToSelection( QListViewItem *it ,const QPoint & p, int index) { + qDebug("add"); +// d->selectedFiles->addToSelection( lnk ); + // } +// else +// mediaPlayerState->setPlaying( TRUE ); +// } void PlayListWidget::clearList() { while ( first() ) - d->selectedFiles->removeSelected(); + d->selectedFiles->removeSelected(); } void PlayListWidget::addAllToList() { DocLnkSet files; Global::findDocuments(&files, "video/*;audio/*"); QListIterator<DocLnk> dit( files.children() ); for ( ; dit.current(); ++dit ) d->selectedFiles->addToSelection( **dit ); } @@ -300,149 +403,291 @@ void PlayListWidget::addAllMusicToList() { void PlayListWidget::addAllVideoToList() { DocLnkSet files; Global::findDocuments(&files, "video/*"); QListIterator<DocLnk> dit( files.children() ); for ( ; dit.current(); ++dit ) d->selectedFiles->addToSelection( **dit ); } void PlayListWidget::setDocument(const QString& fileref) { if ( fileref.isNull() ) { - QMessageBox::critical( 0, tr( "Invalid File" ), tr( "There was a problem in getting the file." ) ); - return; + QMessageBox::critical( 0, tr( "Invalid File" ), tr( "There was a problem in getting the file." ) ); + return; } if ( mediaPlayerState->playlist() ) - addToSelection( DocLnk( fileref ) ); + addToSelection( DocLnk( fileref ) ); else { - d->setDocumentUsed = TRUE; - if ( d->current ) - delete d->current; - d->current = new DocLnk( fileref ); + d->setDocumentUsed = TRUE; + if ( d->current ) + delete d->current; + d->current = new DocLnk( fileref ); } mediaPlayerState->setPlaying( FALSE ); mediaPlayerState->setPlaying( TRUE ); } void PlayListWidget::setActiveWindow() { // When we get raised we need to ensure that it switches views char origView = mediaPlayerState->view(); mediaPlayerState->setView( 'l' ); // invalidate mediaPlayerState->setView( origView ); // now switch back } void PlayListWidget::useSelectedDocument() { d->setDocumentUsed = FALSE; } const DocLnk *PlayListWidget::current() { if ( mediaPlayerState->playlist() ) - return d->selectedFiles->current(); + return d->selectedFiles->current(); else if ( d->setDocumentUsed && d->current ) { - return d->current; + return d->current; } else - return d->files->selected(); + return d->files->selected(); } bool PlayListWidget::prev() { if ( mediaPlayerState->playlist() ) { - if ( mediaPlayerState->shuffled() ) { - const DocLnk *cur = current(); - int j = 1 + (int)(97.0 * rand() / (RAND_MAX + 1.0)); - for ( int i = 0; i < j; i++ ) { - if ( !d->selectedFiles->next() ) - d->selectedFiles->first(); - } - if ( cur == current() ) - if ( !d->selectedFiles->next() ) - d->selectedFiles->first(); - return TRUE; - } else { - if ( !d->selectedFiles->prev() ) { - if ( mediaPlayerState->looping() ) { - return d->selectedFiles->last(); - } else { - return FALSE; - } - } - return TRUE; - } + if ( mediaPlayerState->shuffled() ) { + const DocLnk *cur = current(); + int j = 1 + (int)(97.0 * rand() / (RAND_MAX + 1.0)); + for ( int i = 0; i < j; i++ ) { + if ( !d->selectedFiles->next() ) + d->selectedFiles->first(); + } + if ( cur == current() ) + if ( !d->selectedFiles->next() ) + d->selectedFiles->first(); + return TRUE; + } else { + if ( !d->selectedFiles->prev() ) { + if ( mediaPlayerState->looping() ) { + return d->selectedFiles->last(); + } else { + return FALSE; + } + } + return TRUE; + } } else { - return mediaPlayerState->looping(); + return mediaPlayerState->looping(); } } bool PlayListWidget::next() { if ( mediaPlayerState->playlist() ) { - if ( mediaPlayerState->shuffled() ) { - return prev(); - } else { - if ( !d->selectedFiles->next() ) { - if ( mediaPlayerState->looping() ) { - return d->selectedFiles->first(); - } else { - return FALSE; - } - } - return TRUE; - } + if ( mediaPlayerState->shuffled() ) { + return prev(); + } else { + if ( !d->selectedFiles->next() ) { + if ( mediaPlayerState->looping() ) { + return d->selectedFiles->first(); } else { - return mediaPlayerState->looping(); + return FALSE; + } + } + return TRUE; + } + } else { + return mediaPlayerState->looping(); } } bool PlayListWidget::first() { if ( mediaPlayerState->playlist() ) - return d->selectedFiles->first(); + return d->selectedFiles->first(); else - return mediaPlayerState->looping(); + return mediaPlayerState->looping(); } bool PlayListWidget::last() { if ( mediaPlayerState->playlist() ) - return d->selectedFiles->last(); + return d->selectedFiles->last(); else - return mediaPlayerState->looping(); + return mediaPlayerState->looping(); } void PlayListWidget::saveList() { QString filename; // pseudo code // filename = QLineEdit->getText(); Config cfg( filename + ".playlist" ); writeConfig( cfg ); } void PlayListWidget::loadList() { QString filename; // pseudo code // filename = FileSelector->openFile( "*.playlist" ); Config cfg( filename + ".playlist" ); readConfig( cfg ); } void PlayListWidget::setPlaylist( bool shown ) { if ( shown ) - d->playListFrame->show(); + d->playListFrame->show(); else - d->playListFrame->hide(); + d->playListFrame->hide(); } void PlayListWidget::setView( char view ) { if ( view == 'l' ) - showMaximized(); + showMaximized(); else - hide(); + hide(); +} + +void PlayListWidget::addSelected() { +// QMessageBox::message("Note","Bozo the clown thinks\nthere's something actually here"); + int tabPage=tabWidget->currentPageIndex(); + switch (tabPage) { + case 0: //playlist + break; + case 1: { //audio + addToSelection( audioView->selectedItem() ); + } + break; + case 2: { // video + addToSelection( videoView->selectedItem() ); + } + break; + }; +} + +void PlayListWidget::removeSelected() { + d->selectedFiles->removeSelected( ); +} + + +void PlayListWidget::playIt( QListViewItem *it) { + d->setDocumentUsed = FALSE; + + if(it) { + qDebug("playit"); + int tabPage=tabWidget->currentPageIndex(); + switch (tabPage) { + case 1: { + DocLnkSet files; + QListIterator<DocLnk> dit( files.children() ); + for ( ; dit.current(); ++dit ) { + if( dit.current()->name() == it->text(0)) { + setDocument( dit.current()->name()); + } + } + } + break; + case 2: { + DocLnkSet vFiles; + QListIterator<DocLnk> dit( vFiles.children() ); + for ( ; dit.current(); ++dit ) { + qDebug(dit.current()->name()); + if( dit.current()->name() == it->text(0)) { + qDebug(it->text(0)); + setDocument( dit.current()->name()); + } + } + } + break; + }; + } +} + +void PlayListWidget::addToSelection( QListViewItem *it) { + d->setDocumentUsed = FALSE; + + if(it) { + qDebug("add to selection"); + int tabPage=tabWidget->currentPageIndex(); + switch (tabPage) { + case 1: { + QListIterator<DocLnk> dit( files.children() ); + for ( ; dit.current(); ++dit ) { + if( dit.current()->name() == it->text(0)) { + d->selectedFiles->addToSelection( **dit ); + } + } + } + break; + case 2: { + QListIterator<DocLnk> dit( vFiles.children() ); + for ( ; dit.current(); ++dit ) { + qDebug(dit.current()->name()); + if( dit.current()->name() == it->text(0)) { + d->selectedFiles->addToSelection( **dit ); + } + } + } + break; + case 0: + break; + }; + tabWidget->setCurrentPage(0); +// mediaPlayerState->setPlaying( TRUE ); + } +} + +void PlayListWidget::tabChanged(QWidget *widg) { + + int tabPage=tabWidget->currentPageIndex(); + switch (tabPage) { + case 0: + { + d->tbRemoveFromList->setEnabled(TRUE); + d->tbAddToList->setEnabled(FALSE); + } + break; + case 1: + { + d->tbRemoveFromList->setEnabled(FALSE); + d->tbAddToList->setEnabled(TRUE); + } + break; + case 2: + { + d->tbRemoveFromList->setEnabled(FALSE); + d->tbAddToList->setEnabled(TRUE); + } + break; + }; +} + +void PlayListWidget::cancelMenuTimer() { + if( menuTimer->isActive() ) + menuTimer->stop(); +} + +void PlayListWidget::showFileMenu() { + +} + +void PlayListWidget::contentsMousePressEvent( QMouseEvent * e ) +{ +// QListView::contentsMousePressEvent( e ); + menuTimer->start( 750, TRUE ); +} + + +void PlayListWidget::contentsMouseReleaseEvent( QMouseEvent * e ) +{ +// QListView::contentsMouseReleaseEvent( e ); + menuTimer->stop(); } +// void PlayListWidget::setFullScreen() { +// mediaPlayerState->toggleFullscreen( ); +// } +// void PlayListWidget::setScaled() { +// mediaPlayerState->toggleScaled(); +// } diff --git a/core/multimedia/opieplayer/playlistwidget.h b/core/multimedia/opieplayer/playlistwidget.h index 6976641..3a52dd5 100644 --- a/core/multimedia/opieplayer/playlistwidget.h +++ b/core/multimedia/opieplayer/playlistwidget.h @@ -14,55 +14,84 @@ ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef PLAY_LIST_WIDGET_H #define PLAY_LIST_WIDGET_H #include <qmainwindow.h> #include <qpe/applnk.h> +#include <qtabwidget.h> +#include <qtimer.h> class PlayListWidgetPrivate; class Config; - +class QListViewItem; +class QListView; +class QPoint; +class QAction; +class QLabel; class PlayListWidget : public QMainWindow { Q_OBJECT public: PlayListWidget( QWidget* parent=0, const char* name=0, WFlags fl=0 ); ~PlayListWidget(); - + QTabWidget * tabWidget; + QAction *fullScreenButton, *scaleButton; + DocLnkSet files; + DocLnkSet vFiles; + QListView *audioView, *videoView, *playlistView; + QLabel *libString; // retrieve the current playlist entry (media file link) const DocLnk *current(); void useSelectedDocument(); + QTimer * menuTimer; public slots: void setDocument( const QString& fileref ); void addToSelection( const DocLnk& ); // Add a media file to the playlist + void addToSelection( QListViewItem* ); // Add a media file to the playlist + void addToSelection( QListViewItem*, const QPoint&,int ); // Add a media file to the playlist void setActiveWindow(); // need to handle this to show the right view void setPlaylist( bool ); // Show/Hide the playlist void setView( char ); void clearList(); void addAllToList(); void addAllMusicToList(); void addAllVideoToList(); void saveList(); // Save the playlist void loadList(); // Load a playlist + void playIt( QListViewItem *); bool first(); bool last(); bool next(); bool prev(); + void addSelected(); + void removeSelected(); + void tabChanged(QWidget*); +/* void setFullScreen(); */ +/* void setScaled(); */ +protected: + void contentsMousePressEvent( QMouseEvent * e ); + void contentsMouseReleaseEvent( QMouseEvent * e ); private: void initializeStates(); void readConfig( Config& cfg ); void writeConfig( Config& cfg ) const; PlayListWidgetPrivate *d; // Private implementation data + +protected slots: + void cancelMenuTimer(); + void showFileMenu(); + + }; #endif // PLAY_LIST_WIDGET_H diff --git a/core/multimedia/opieplayer/videowidget.cpp b/core/multimedia/opieplayer/videowidget.cpp index f3974a0..1f128a4 100644 --- a/core/multimedia/opieplayer/videowidget.cpp +++ b/core/multimedia/opieplayer/videowidget.cpp @@ -9,31 +9,31 @@ ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qpe/resource.h> +#include "mediaplayerplugininterface.h" #include <qwidget.h> #include <qpainter.h> #include <qpixmap.h> #include <qslider.h> #include <qdrawutil.h> #include "videowidget.h" -#include "mediaplayerplugininterface.h" #include "mediaplayerstate.h" #ifdef Q_WS_QWS # define USE_DIRECT_PAINTER # include <qdirectpainter_qws.h> # include <qgfxraster_qws.h> #endif extern MediaPlayerState *mediaPlayerState; @@ -57,367 +57,367 @@ MediaButton videoButtons[] = { { 5+3*32+xo, 200+yo, TRUE, FALSE, FALSE, 2 }, // pause { 5+4*32+xo, 200+yo, FALSE, FALSE, FALSE, 3 }, // next { 5+5*32+xo, 200+yo, FALSE, FALSE, FALSE, 8 }, // playlist { 5+6*32+xo, 200+yo, TRUE, FALSE, FALSE, 9 } // fullscreen }; static const int numButtons = (sizeof(videoButtons)/sizeof(MediaButton)); VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) : QWidget( parent, name, f ), scaledWidth( 0 ), scaledHeight( 0 ) { - setCaption( tr("MediaPlayer") ); + setCaption( tr("OpiePlayer") ); setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); pixmaps[0] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButton0a" ) ); pixmaps[1] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaButton0b" ) ); pixmaps[2] = new QPixmap( Resource::loadPixmap( "mpegplayer/mediaControls0" ) ); currentFrame = new QImage( 220 + 2, 160, (QPixmap::defaultDepth() == 16) ? 16 : 32 ); slider = new QSlider( Qt::Horizontal, this ); slider->setMinValue( 0 ); slider->setMaxValue( 1 ); slider->setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); slider->setFocusPolicy( QWidget::NoFocus ); slider->setGeometry( QRect( 7, 250, 220, 20 ) ); - connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); - connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); + connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); + connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) ); connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) ); connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) ); connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) ); // Intialise state setLength( mediaPlayerState->length() ); setPosition( mediaPlayerState->position() ); setFullscreen( mediaPlayerState->fullscreen() ); setPaused( mediaPlayerState->paused() ); setPlaying( mediaPlayerState->playing() ); } VideoWidget::~VideoWidget() { for ( int i = 0; i < 3; i++ ) - delete pixmaps[i]; + delete pixmaps[i]; delete currentFrame; } static bool videoSliderBeingMoved = FALSE; void VideoWidget::sliderPressed() { videoSliderBeingMoved = TRUE; } void VideoWidget::sliderReleased() { videoSliderBeingMoved = FALSE; if ( slider->width() == 0 ) - return; + return; long val = long((double)slider->value() * mediaPlayerState->length() / slider->width()); mediaPlayerState->setPosition( val ); } void VideoWidget::setPosition( long i ) { updateSlider( i, mediaPlayerState->length() ); } void VideoWidget::setLength( long max ) { updateSlider( mediaPlayerState->position(), max ); } void VideoWidget::setView( char view ) { if ( view == 'v' ) { - makeVisible(); + makeVisible(); } else { - // Effectively blank the view next time we show it so it looks nicer - scaledWidth = 0; - scaledHeight = 0; - hide(); + // Effectively blank the view next time we show it so it looks nicer + scaledWidth = 0; + scaledHeight = 0; + hide(); } } void VideoWidget::updateSlider( long i, long max ) { // Will flicker too much if we don't do this if ( max == 0 ) - return; + return; int width = slider->width(); int val = int((double)i * width / max); if ( !mediaPlayerState->fullscreen() && !videoSliderBeingMoved ) { - if ( slider->value() != val ) - slider->setValue( val ); - if ( slider->maxValue() != width ) - slider->setMaxValue( width ); + if ( slider->value() != val ) + slider->setValue( val ); + if ( slider->maxValue() != width ) + slider->setMaxValue( width ); } } void VideoWidget::setToggleButton( int i, bool down ) { if ( down != videoButtons[i].isDown ) - toggleButton( i ); + toggleButton( i ); } void VideoWidget::toggleButton( int i ) { videoButtons[i].isDown = !videoButtons[i].isDown; QPainter p(this); paintButton ( &p, i ); } void VideoWidget::paintButton( QPainter *p, int i ) { int x = videoButtons[i].xPos; int y = videoButtons[i].yPos; int offset = 10 + videoButtons[i].isDown; p->drawPixmap( x, y, *pixmaps[videoButtons[i].isDown] ); p->drawPixmap( x + 1 + offset, y + offset, *pixmaps[2], 9 * videoButtons[i].controlType, 0, 9, 9 ); } void VideoWidget::mouseMoveEvent( QMouseEvent *event ) { for ( int i = 0; i < numButtons; i++ ) { - int x = videoButtons[i].xPos; - int y = videoButtons[i].yPos; - if ( event->state() == QMouseEvent::LeftButton ) { - // The test to see if the mouse click is inside the circular button or not - // (compared with the radius squared to avoid a square-root of our distance) - int radius = 16; - QPoint center = QPoint( x + radius, y + radius ); - QPoint dXY = center - event->pos(); - int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); - bool isOnButton = dist <= (radius * radius); - if ( isOnButton != videoButtons[i].isHeld ) { - videoButtons[i].isHeld = isOnButton; - toggleButton(i); - } - } else { - if ( videoButtons[i].isHeld ) { - videoButtons[i].isHeld = FALSE; - if ( !videoButtons[i].isToggle ) - setToggleButton( i, FALSE ); - switch (i) { - case VideoPlay: mediaPlayerState->setPlaying(videoButtons[i].isDown); return; - case VideoStop: mediaPlayerState->setPlaying(FALSE); return; - case VideoPause: mediaPlayerState->setPaused(videoButtons[i].isDown); return; - case VideoNext: mediaPlayerState->setNext(); return; - case VideoPrevious: mediaPlayerState->setPrev(); return; - case VideoPlayList: mediaPlayerState->setList(); return; - case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return; - } - } - } + int x = videoButtons[i].xPos; + int y = videoButtons[i].yPos; + if ( event->state() == QMouseEvent::LeftButton ) { + // The test to see if the mouse click is inside the circular button or not + // (compared with the radius squared to avoid a square-root of our distance) + int radius = 16; + QPoint center = QPoint( x + radius, y + radius ); + QPoint dXY = center - event->pos(); + int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); + bool isOnButton = dist <= (radius * radius); + if ( isOnButton != videoButtons[i].isHeld ) { + videoButtons[i].isHeld = isOnButton; + toggleButton(i); + } + } else { + if ( videoButtons[i].isHeld ) { + videoButtons[i].isHeld = FALSE; + if ( !videoButtons[i].isToggle ) + setToggleButton( i, FALSE ); + switch (i) { + case VideoPlay: mediaPlayerState->setPlaying(videoButtons[i].isDown); return; + case VideoStop: mediaPlayerState->setPlaying(FALSE); return; + case VideoPause: mediaPlayerState->setPaused(videoButtons[i].isDown); return; + case VideoNext: mediaPlayerState->setNext(); return; + case VideoPrevious: mediaPlayerState->setPrev(); return; + case VideoPlayList: mediaPlayerState->setList(); return; + case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return; + } + } + } } } void VideoWidget::mousePressEvent( QMouseEvent *event ) { mouseMoveEvent( event ); } void VideoWidget::mouseReleaseEvent( QMouseEvent *event ) { if ( mediaPlayerState->fullscreen() ) { - mediaPlayerState->setFullscreen( FALSE ); - makeVisible(); + mediaPlayerState->setFullscreen( FALSE ); + makeVisible(); } else { - mouseMoveEvent( event ); + mouseMoveEvent( event ); } } void VideoWidget::makeVisible() { if ( mediaPlayerState->fullscreen() ) { - setBackgroundMode( QWidget::NoBackground ); - showFullScreen(); - resize( qApp->desktop()->size() ); - slider->hide(); + setBackgroundMode( QWidget::NoBackground ); + showFullScreen(); + resize( qApp->desktop()->size() ); + slider->hide(); } else { - setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); - showNormal(); - showMaximized(); - slider->show(); + setBackgroundPixmap( Resource::loadPixmap( "mpegplayer/metalFinish" ) ); + showNormal(); + showMaximized(); + slider->show(); } } void VideoWidget::paintEvent( QPaintEvent * ) { QPainter p( this ); if ( mediaPlayerState->fullscreen() ) { - // Clear the background - p.setBrush( QBrush( Qt::black ) ); - p.drawRect( rect() ); + // Clear the background + p.setBrush( QBrush( Qt::black ) ); + p.drawRect( rect() ); - // Draw the current frame - //p.drawImage( ); // If using directpainter we won't have a copy except whats on the screen + // Draw the current frame + //p.drawImage( ); // If using directpainter we won't have a copy except whats on the screen } else { - // draw border - qDrawShadePanel( &p, 4, 15, 230, 170, colorGroup(), TRUE, 5, NULL ); + // draw border + qDrawShadePanel( &p, 4, 15, 230, 170, colorGroup(), TRUE, 5, NULL ); - // Clear the movie screen first - p.setBrush( QBrush( Qt::black ) ); - p.drawRect( 9, 20, 220, 160 ); + // Clear the movie screen first + p.setBrush( QBrush( Qt::black ) ); + p.drawRect( 9, 20, 220, 160 ); - // draw current frame (centrally positioned from scaling to maintain aspect ratio) - p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight ); + // draw current frame (centrally positioned from scaling to maintain aspect ratio) + p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight ); - // draw the buttons - for ( int i = 0; i < numButtons; i++ ) - paintButton( &p, i ); + // draw the buttons + for ( int i = 0; i < numButtons; i++ ) + paintButton( &p, i ); - // draw the slider - slider->repaint( TRUE ); + // draw the slider + slider->repaint( TRUE ); } } void VideoWidget::closeEvent( QCloseEvent* ) { mediaPlayerState->setList(); } bool VideoWidget::playVideo() { bool result = FALSE; int stream = 0; int sw = mediaPlayerState->curDecoder()->videoWidth( stream ); int sh = mediaPlayerState->curDecoder()->videoHeight( stream ); int dd = QPixmap::defaultDepth(); int w = height(); int h = width(); ColorFormat format = (dd == 16) ? RGB565 : BGRA8888; if ( mediaPlayerState->fullscreen() ) { #ifdef USE_DIRECT_PAINTER - QDirectPainter p(this); - - if ( ( qt_screen->transformOrientation() == 3 ) && - ( ( dd == 16 ) || ( dd == 32 ) ) && ( p.numRects() == 1 ) ) { - - w = 320; - h = 240; - - if ( mediaPlayerState->scaled() ) { - // maintain aspect ratio - if ( w * sh > sw * h ) - w = sw * h / sh; - else - h = sh * w / sw; - } else { - w = sw; - h = sh; - } - - w--; // we can't allow libmpeg to overwrite. - QPoint roff = qt_screen->mapToDevice( p.offset(), QSize( qt_screen->width(), qt_screen->height() ) ); - - int ox = roff.x() - height() + 2 + (height() - w) / 2; - int oy = roff.y() + (width() - h) / 2; - int sx = 0, sy = 0; - - uchar* fp = p.frameBuffer() + p.lineStep() * oy; - fp += dd * ox / 8; - uchar **jt = new uchar*[h]; - for ( int i = h; i; i-- ) { - jt[h - i] = fp; - fp += p.lineStep(); - } - - result = mediaPlayerState->curDecoder()->videoReadScaledFrame( jt, sx, sy, sw, sh, w, h, format, 0) == 0; - - delete [] jt; - } else { + QDirectPainter p(this); + + if ( ( qt_screen->transformOrientation() == 3 ) && + ( ( dd == 16 ) || ( dd == 32 ) ) && ( p.numRects() == 1 ) ) { + + w = 320; + h = 240; + + if ( mediaPlayerState->scaled() ) { + // maintain aspect ratio + if ( w * sh > sw * h ) + w = sw * h / sh; + else + h = sh * w / sw; + } else { + w = sw; + h = sh; + } + + w--; // we can't allow libmpeg to overwrite. + QPoint roff = qt_screen->mapToDevice( p.offset(), QSize( qt_screen->width(), qt_screen->height() ) ); + + int ox = roff.x() - height() + 2 + (height() - w) / 2; + int oy = roff.y() + (width() - h) / 2; + int sx = 0, sy = 0; + + uchar* fp = p.frameBuffer() + p.lineStep() * oy; + fp += dd * ox / 8; + uchar **jt = new uchar*[h]; + for ( int i = h; i; i-- ) { + jt[h - i] = fp; + fp += p.lineStep(); + } + + result = mediaPlayerState->curDecoder()->videoReadScaledFrame( jt, sx, sy, sw, sh, w, h, format, 0) == 0; + + delete [] jt; + } else { #endif - QPainter p(this); - - w = 320; - h = 240; - - if ( mediaPlayerState->scaled() ) { - // maintain aspect ratio - if ( w * sh > sw * h ) - w = sw * h / sh; - else - h = sh * w / sw; - } else { - w = sw; - h = sh; - } - - int bytes = ( dd == 16 ) ? 2 : 4; - QImage tempFrame( w, h, bytes << 3 ); - result = mediaPlayerState->curDecoder()->videoReadScaledFrame( tempFrame.jumpTable(), - 0, 0, sw, sh, w, h, format, 0) == 0; - if ( result && mediaPlayerState->fullscreen() ) { - - int rw = h, rh = w; - QImage rotatedFrame( rw, rh, bytes << 3 ); - - ushort* in = (ushort*)tempFrame.bits(); - ushort* out = (ushort*)rotatedFrame.bits(); - int spl = rotatedFrame.bytesPerLine() / bytes; - for (int x=0; x<h; x++) { - if ( bytes == 2 ) { - ushort* lout = out++ + (w - 1)*spl; - for (int y=0; y<w; y++) { - *lout=*in++; - lout-=spl; - } - } else { - ulong* lout = ((ulong *)out)++ + (w - 1)*spl; - for (int y=0; y<w; y++) { - *lout=*((ulong*)in)++; - lout-=spl; - } - } - } - - p.drawImage( (240 - rw) / 2, (320 - rh) / 2, rotatedFrame, 0, 0, rw, rh ); - } + QPainter p(this); + + w = 320; + h = 240; + + if ( mediaPlayerState->scaled() ) { + // maintain aspect ratio + if ( w * sh > sw * h ) + w = sw * h / sh; + else + h = sh * w / sw; + } else { + w = sw; + h = sh; + } + + int bytes = ( dd == 16 ) ? 2 : 4; + QImage tempFrame( w, h, bytes << 3 ); + result = mediaPlayerState->curDecoder()->videoReadScaledFrame( tempFrame.jumpTable(), + 0, 0, sw, sh, w, h, format, 0) == 0; + if ( result && mediaPlayerState->fullscreen() ) { + + int rw = h, rh = w; + QImage rotatedFrame( rw, rh, bytes << 3 ); + + ushort* in = (ushort*)tempFrame.bits(); + ushort* out = (ushort*)rotatedFrame.bits(); + int spl = rotatedFrame.bytesPerLine() / bytes; + for (int x=0; x<h; x++) { + if ( bytes == 2 ) { + ushort* lout = out++ + (w - 1)*spl; + for (int y=0; y<w; y++) { + *lout=*in++; + lout-=spl; + } + } else { + ulong* lout = ((ulong *)out)++ + (w - 1)*spl; + for (int y=0; y<w; y++) { + *lout=*((ulong*)in)++; + lout-=spl; + } + } + } + + p.drawImage( (240 - rw) / 2, (320 - rh) / 2, rotatedFrame, 0, 0, rw, rh ); + } #ifdef USE_DIRECT_PAINTER - } + } #endif } else { - w = 220; - h = 160; + w = 220; + h = 160; - // maintain aspect ratio - if ( w * sh > sw * h ) - w = sw * h / sh; - else - h = sh * w / sw; + // maintain aspect ratio + if ( w * sh > sw * h ) + w = sw * h / sh; + else + h = sh * w / sw; - result = mediaPlayerState->curDecoder()->videoReadScaledFrame( currentFrame->jumpTable(), 0, 0, sw, sh, w, h, format, 0) == 0; + result = mediaPlayerState->curDecoder()->videoReadScaledFrame( currentFrame->jumpTable(), 0, 0, sw, sh, w, h, format, 0) == 0; - QPainter p( this ); + QPainter p( this ); - // Image changed size, therefore need to blank the possibly unpainted regions first - if ( scaledWidth != w || scaledHeight != h ) { - p.setBrush( QBrush( Qt::black ) ); - p.drawRect( 9, 20, 220, 160 ); - } + // Image changed size, therefore need to blank the possibly unpainted regions first + if ( scaledWidth != w || scaledHeight != h ) { + p.setBrush( QBrush( Qt::black ) ); + p.drawRect( 9, 20, 220, 160 ); + } - scaledWidth = w; - scaledHeight = h; + scaledWidth = w; + scaledHeight = h; - if ( result ) { - p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight ); - } + if ( result ) { + p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight ); + } } return result; } diff --git a/core/multimedia/opieplayer/wavplugin/Makefile.in b/core/multimedia/opieplayer/wavplugin/Makefile.in index bcbe7f2..a46b925 100644 --- a/core/multimedia/opieplayer/wavplugin/Makefile.in +++ b/core/multimedia/opieplayer/wavplugin/Makefile.in @@ -91,19 +91,21 @@ listaddonentmodules: REQUIRES= ####### Sub-libraries ###### Combined headers ####### Compile wavplugin.o: wavplugin.cpp \ - wavplugin.h + wavplugin.h \ + ../mediaplayerplugininterface.h wavpluginimpl.o: wavpluginimpl.cpp \ wavplugin.h \ + ../mediaplayerplugininterface.h \ wavpluginimpl.h diff --git a/core/multimedia/opieplayer/wavplugin/wavplugin.cpp b/core/multimedia/opieplayer/wavplugin/wavplugin.cpp index a6bd974..7f63b3b 100644 --- a/core/multimedia/opieplayer/wavplugin/wavplugin.cpp +++ b/core/multimedia/opieplayer/wavplugin/wavplugin.cpp @@ -8,300 +8,302 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +// L.J.Potter added changes Fri 02-15-2002 + #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <qfile.h> #include "wavplugin.h" -//#define debugMsg(a) qDebug(a) +//#define debugMsg(a) qDebug(a) #define debugMsg(a) struct RiffChunk { char id[4]; Q_UINT32 size; char data[4]; }; struct ChunkData { Q_INT16 formatTag; Q_INT16 channels; Q_INT32 samplesPerSec; Q_INT32 avgBytesPerSec; Q_INT16 blockAlign; Q_INT16 wBitsPerSample; }; -const int sound_buffer_size = 4096; +const int sound_buffer_size = 512; // 4096; // you got to be kidding right? class WavPluginData { public: QFile *input; int wavedata_remaining; ChunkData chunkdata; RiffChunk chunk; uchar data[sound_buffer_size+32]; // +32 to handle badly aligned input data int out,max; int samples_due; int samples; WavPluginData() { - max = out = sound_buffer_size; - wavedata_remaining = 0; - samples_due = 0; - samples = -1; + max = out = sound_buffer_size; + wavedata_remaining = 0; + samples_due = 0; + samples = -1; } // expands out samples to the frequency of 44kHz bool add( short *output, long count, long& done, bool stereo ) { - done = 0; + done = 0; + qApp->processEvents(); - if ( input == 0 ) { - qDebug("no input"); - return FALSE; - } + if ( input == 0 ) { + qDebug("no input"); + return FALSE; + } while ( count ) { int l,r; if ( getSample(l, r) == FALSE ) { - qDebug("didn't get sample"); - return FALSE; - } - samples_due += 44100; - while ( count && (samples_due > chunkdata.samplesPerSec) ) { - *output++ = l; - if ( stereo ) - *output++ = r; + qDebug("didn't get sample"); + return FALSE; + } + samples_due += chunkdata.samplesPerSec; + while ( count && (samples_due > chunkdata.samplesPerSec) ) { + *output++ = l; + if ( stereo ) + *output++ = r; samples_due -= chunkdata.samplesPerSec; count--; - done++; + done++; } } - return TRUE; } bool initialise() { - if ( input == 0 ) - return FALSE; - - wavedata_remaining = -1; - - while ( wavedata_remaining == -1 ) { - // Keep reading chunks... - const int n = sizeof(chunk) - sizeof(chunk.data); - int t = input->readBlock( (char*)&chunk, n ); - if ( t != n ) { - if ( t == -1 ) - return FALSE; - return TRUE; - } - if ( qstrncmp(chunk.id,"data",4) == 0 ) { - samples = wavedata_remaining = chunk.size; - } else if ( qstrncmp(chunk.id,"RIFF",4) == 0 ) { - char d[4]; - if ( input->readBlock(d,4) != 4 ) { - return FALSE; - } - if ( qstrncmp(d,"WAVE",4) != 0 ) { - // skip - if ( chunk.size > 1000000000 || !input->at(input->at()+chunk.size-4) ) { - return FALSE; - } - } - } else if ( qstrncmp(chunk.id,"fmt ",4) == 0 ) { - if ( input->readBlock((char*)&chunkdata,sizeof(chunkdata)) != sizeof(chunkdata) ) { - return FALSE; - } + if ( input == 0 ) + return FALSE; + + wavedata_remaining = -1; + + while ( wavedata_remaining == -1 ) { + // Keep reading chunks... + const int n = sizeof(chunk) - sizeof(chunk.data); + int t = input->readBlock( (char*)&chunk, n ); + if ( t != n ) { + if ( t == -1 ) + return FALSE; + return TRUE; + } + if ( qstrncmp(chunk.id,"data",4) == 0 ) { + samples = wavedata_remaining = chunk.size; + } else if ( qstrncmp(chunk.id,"RIFF",4) == 0 ) { + char d[4]; + if ( input->readBlock(d,4) != 4 ) { + return FALSE; + } + if ( qstrncmp(d,"WAVE",4) != 0 ) { + // skip + if ( chunk.size > 1000000000 || !input->at(input->at()+chunk.size-4) ) { + return FALSE; + } + } + } else if ( qstrncmp(chunk.id,"fmt ",4) == 0 ) { + if ( input->readBlock((char*)&chunkdata,sizeof(chunkdata)) != sizeof(chunkdata) ) { + return FALSE; + } #define WAVE_FORMAT_PCM 1 - if ( chunkdata.formatTag != WAVE_FORMAT_PCM ) { - qDebug("WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag); - return FALSE; - } - } else { - // ignored chunk - if ( chunk.size > 1000000000 || !input->at(input->at()+chunk.size) ) { - return FALSE; - } - } - } // while - - return TRUE; + if ( chunkdata.formatTag != WAVE_FORMAT_PCM ) { + qDebug("WAV file: UNSUPPORTED FORMAT %d",chunkdata.formatTag); + return FALSE; + } + } else { + // ignored chunk + if ( chunk.size > 1000000000 || !input->at(input->at()+chunk.size) ) { + return FALSE; + } + } + } // while + qDebug("bits %d", chunkdata.wBitsPerSample); + return TRUE; } // gets a sample from the file bool getSample(int& l, int& r) { - l = r = 0; - - if ( input == 0 ) - return FALSE; - - if ( (wavedata_remaining < 0) || !max ) - return FALSE; - - if ( out >= max ) { - max = input->readBlock( (char*)data, (uint)QMIN(sound_buffer_size,wavedata_remaining) ); - - wavedata_remaining -= max; - - out = 0; - if ( max <= 0 ) { - max = 0; - return TRUE; - } - } - if ( chunkdata.wBitsPerSample == 8 ) { - l = (data[out++] - 128) * 128; - } else { - l = ((short*)data)[out/2]; - out += 2; - } - if ( chunkdata.channels == 1 ) { - r = l; - } else { - if ( chunkdata.wBitsPerSample == 8 ) { - r = (data[out++] - 128) * 128; - } else { - r = ((short*)data)[out/2]; - out += 2; - } - } - return TRUE; + l = r = 0; + + if ( input == 0 ) + return FALSE; + + if ( (wavedata_remaining < 0) || !max ) + return FALSE; + + if ( out >= max ) { + max = input->readBlock( (char*)data, (uint)QMIN(sound_buffer_size,wavedata_remaining) ); + + wavedata_remaining -= max; + + out = 0; + if ( max <= 0 ) { + max = 0; + return TRUE; + } + } + if ( chunkdata.wBitsPerSample == 8 ) { + l = (data[out++] - 128) * 128; + } else { + l = ((short*)data)[out/2]; + out += 2; + } + if ( chunkdata.channels == 1 ) { + r = l; + } else { + if ( chunkdata.wBitsPerSample == 8 ) { + r = (data[out++] - 128) * 128; + } else { + r = ((short*)data)[out/2]; + out += 2; + } + } + return TRUE; } // getSample }; WavPlugin::WavPlugin() { d = new WavPluginData; d->input = 0; } WavPlugin::~WavPlugin() { close(); delete d; } bool WavPlugin::isFileSupported( const QString& path ) { - debugMsg( "WavPlugin::isFileSupported" ); +// qDebug( "WavPlugin::isFileSupported" ); char *ext = strrchr( path.latin1(), '.' ); // Test file extension if ( ext ) { - if ( strncasecmp(ext, ".raw", 4) == 0 ) - return TRUE; - if ( strncasecmp(ext, ".wav", 4) == 0 ) - return TRUE; - if ( strncasecmp(ext, ".wave", 4) == 0 ) - return TRUE; + if ( strncasecmp(ext, ".raw", 4) == 0 ) + return TRUE; + if ( strncasecmp(ext, ".wav", 4) == 0 ) + return TRUE; + if ( strncasecmp(ext, ".wave", 4) == 0 ) + return TRUE; } return FALSE; } bool WavPlugin::open( const QString& path ) { - debugMsg( "WavPlugin::open" ); +// qDebug( "WavPlugin::open" ); d->max = d->out = sound_buffer_size; d->wavedata_remaining = 0; d->samples_due = 0; d->input = new QFile( path ); if ( d->input->open(IO_ReadOnly) == FALSE ) { - qDebug("couldn't open file"); - delete d->input; - d->input = 0; - return FALSE; + qDebug("couldn't open file"); + delete d->input; + d->input = 0; + return FALSE; } d->initialise(); return TRUE; } bool WavPlugin::close() { - debugMsg( "WavPlugin::close" ); +// qDebug( "WavPlugin::close" ); d->input->close(); delete d->input; d->input = 0; return TRUE; } bool WavPlugin::isOpen() { - debugMsg( "WavPlugin::isOpen" ); +// qDebug( "WavPlugin::isOpen" ); return ( d->input != 0 ); } int WavPlugin::audioStreams() { - debugMsg( "WavPlugin::audioStreams" ); +// qDebug( "WavPlugin::audioStreams" ); return 1; } int WavPlugin::audioChannels( int ) { - debugMsg( "WavPlugin::audioChannels" ); - return 2; // ### Always scale audio to stereo samples +// qDebug( "WavPlugin::audioChannels" ); + return d->chunkdata.channels;// 2; // ### Always scale audio to stereo samples } int WavPlugin::audioFrequency( int ) { - debugMsg( "WavPlugin::audioFrequency" ); - return 44100; // ### Always scale to frequency of 44100 +// qDebug( "WavPlugin::audioFrequency %d", d->chunkdata.samplesPerSec ); + return d->chunkdata.samplesPerSec; //44100; // ### Always scale to frequency of 44100 } int WavPlugin::audioSamples( int ) { - debugMsg( "WavPlugin::audioSamples" ); - return d->samples * 2 / d->chunkdata.channels; // ### Scaled samples will be made stereo, - // Therefore if source is mono we will double the number of samples +// qDebug( "WavPlugin::audioSamples" ); + return d->samples / d->chunkdata.channels/2; // ### Scaled samples will be made stereo, + // Therefore if source is mono we will double the number of samples } bool WavPlugin::audioSetSample( long, int ) { - debugMsg( "WavPlugin::audioSetSample" ); +// qDebug( "WavPlugin::audioSetSample" ); return FALSE; } long WavPlugin::audioGetSample( int ) { - debugMsg( "WavPlugin::audioGetSample" ); +// qDebug( "WavPlugin::audioGetSample" ); return 0; } /* bool WavPlugin::audioReadSamples( short *, int, long, int ) { debugMsg( "WavPlugin::audioReadSamples" ); return FALSE; } bool WavPlugin::audioReReadSamples( short *, int, long, int ) { debugMsg( "WavPlugin::audioReReadSamples" ); @@ -313,22 +315,27 @@ bool WavPlugin::audioReadMonoSamples( short *output, long samples, long& samples debugMsg( "WavPlugin::audioReadMonoSamples" ); return !d->add( output, samples, samplesMade, FALSE ); } bool WavPlugin::audioReadStereoSamples( short *output, long samples, long& samplesMade, int ) { debugMsg( "WavPlugin::audioReadStereoSamples" ); return !d->add( output, samples, samplesMade, TRUE ); } */ bool WavPlugin::audioReadSamples( short *output, int channels, long samples, long& samplesMade, int ) { - debugMsg( "WavPlugin::audioReadSamples" ); +// qDebug( "WavPlugin::audioReadSamples" ); return d->add( output, samples, samplesMade, channels != 1 ); } double WavPlugin::getTime() { - debugMsg( "WavPlugin::getTime" ); +// qDebug( "WavPlugin::getTime" ); return 0.0; } +int WavPlugin::audioBitsPerSample( int ) { +// qDebug( "WavPlugin::audioFormat %d", d->chunkdata.wBitsPerSample ); + return d->chunkdata.wBitsPerSample; // +} + diff --git a/core/multimedia/opieplayer/wavplugin/wavplugin.h b/core/multimedia/opieplayer/wavplugin/wavplugin.h index 64635ca..6afd67e 100644 --- a/core/multimedia/opieplayer/wavplugin/wavplugin.h +++ b/core/multimedia/opieplayer/wavplugin/wavplugin.h @@ -8,65 +8,73 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +// L.J.Potter added changes Fri 02-15-2002 + #ifndef WAV_PLUGIN_H #define WAV_PLUGIN_H #include <qstring.h> #include <qapplication.h> -#include "mediaplayerplugininterface.h" +#include "../mediaplayerplugininterface.h" + + +// #define OLD_MEDIAPLAYER_API class WavPluginData; class WavPlugin : public MediaPlayerDecoder { public: WavPlugin(); ~WavPlugin(); const char *pluginName() { return "WavPlugin"; } const char *pluginComment() { return "This is a simple plugin for playing wav files"; } double pluginVersion() { return 1.0; } bool isFileSupported( const QString& ); bool open( const QString& ); bool close(); bool isOpen(); - //const QString &fileInfo() { return strInfo = qApp->translate( "MediaPlayer", "No Information Available", "media plugin text" ); } - const QString &fileInfo() { return strInfo = QString(""); } + const QString &fileInfo() { return strInfo = ""; } // If decoder doesn't support audio then return 0 here int audioStreams(); int audioChannels( int stream ); int audioFrequency( int stream ); + int audioBitsPerSample( int stream ); int audioSamples( int stream ); bool audioSetSample( long sample, int stream ); long audioGetSample( int stream ); - //bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream ); - //bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream ); +#ifdef OLD_MEDIAPLAYER_API + bool audioReadMonoSamples( short *output, long samples, long& samplesRead, int stream ); + bool audioReadStereoSamples( short *output, long samples, long& samplesRead, int stream ); + bool audioReadSamples( short *output, int channel, long samples, int stream ); + bool audioReReadSamples( short *output, int channel, long samples, int stream ); +#else bool audioReadSamples( short *output, int channels, long samples, long& samplesRead, int stream ); - //bool audioReadSamples( short *output, int channel, long samples, int stream ); - //bool audioReReadSamples( short *output, int channel, long samples, int stream ); +#endif // If decoder doesn't support video then return 0 here int videoStreams() { return 0; } int videoWidth( int ) { return 0; } int videoHeight( int ) { return 0; } double videoFrameRate( int ) { return 0.0; } int videoFrames( int ) { return 0; } bool videoSetFrame( long, int ) { return FALSE; } long videoGetFrame( int ) { return 0; } bool videoReadFrame( unsigned char **, int, int, int, int, ColorFormat, int ) { return FALSE; } bool videoReadScaledFrame( unsigned char **, int, int, int, int, int, int, ColorFormat, int ) { return FALSE; } bool videoReadYUVFrame( char *, char *, char *, int, int, int, int, int ) { return FALSE; } @@ -78,20 +86,22 @@ public: bool setSMP( int ) { return FALSE; } bool setMMX( bool ) { return FALSE; } // Capabilities bool supportsAudio() { return TRUE; } bool supportsVideo() { return FALSE; } bool supportsYUV() { return FALSE; } bool supportsMMX() { return TRUE; } bool supportsSMP() { return FALSE; } bool supportsStereo() { return TRUE; } bool supportsScaling() { return FALSE; } + long getPlayTime() { return -1; } + private: WavPluginData *d; QString strInfo; }; #endif |