-rw-r--r-- | core/multimedia/opieplayer/audiodevice.cpp | 76 | ||||
-rw-r--r-- | core/multimedia/opieplayer/audiowidget.cpp | 35 | ||||
-rw-r--r-- | core/multimedia/opieplayer/audiowidget.h | 13 | ||||
-rw-r--r-- | core/multimedia/opieplayer/mediaplayer.cpp | 59 | ||||
-rw-r--r-- | core/multimedia/opieplayer/mediaplayerstate.h | 2 |
5 files changed, 92 insertions, 93 deletions
diff --git a/core/multimedia/opieplayer/audiodevice.cpp b/core/multimedia/opieplayer/audiodevice.cpp index 020f6be..136e06c 100644 --- a/core/multimedia/opieplayer/audiodevice.cpp +++ b/core/multimedia/opieplayer/audiodevice.cpp @@ -32,32 +32,22 @@ #include <errno.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> -// #endif #if defined(Q_WS_X11) || defined(Q_WS_QWS) #include <fcntl.h> #include <sys/ioctl.h> #include <sys/soundcard.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #endif -// #if defined(Q_OS_WIN32) -// static const int expectedBytesPerMilliSecond = 2 * 2 * 44000 / 1000; -// static const int timerResolutionMilliSeconds = 30; -// static const int sound_fragment_bytes = timerResolutionMilliSeconds * expectedBytesPerMilliSecond; -// #else # if defined(QT_QWS_IPAQ) static const int sound_fragment_shift = 14; # else static const int sound_fragment_shift = 16; # endif static const int sound_fragment_bytes = (1<<sound_fragment_shift); @@ -98,39 +88,21 @@ unsigned int AudioDevicePrivate::leftVolume = 0; unsigned int AudioDevicePrivate::rightVolume = 0; void AudioDevice::getVolume( unsigned int& leftVolume, unsigned int& rightVolume, bool &muted ) { muted = AudioDevicePrivate::muted; unsigned int volume; -// #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" ); -// waveOutClose( handle ); -// leftVolume = volume & 0xFFFF; -// rightVolume = volume >> 16; -// #else int mixerHandle = open( "/dev/mixer", O_RDWR ); if ( mixerHandle >= 0 ) { if(ioctl( mixerHandle, MIXER_READ(0), &volume )==-1) perror("ioctl(\"MIXER_READ\")"); close( mixerHandle ); } else 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 ) { @@ -139,28 +111,12 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume, leftVolume = 0; rightVolume = 0; } else { leftVolume = ( (int) leftVolume < 0 ) ? 0 : (( leftVolume > 0xFFFF ) ? 0xFFFF : leftVolume ); 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" ); -// 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); @@ -187,13 +143,12 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume, QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << muted; #endif } - AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) { qDebug("creating new audio device"); QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE; d = new AudioDevicePrivate; d->frequency = f; d->channels = chs; @@ -263,21 +218,17 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) { AudioDevice::~AudioDevice() { qDebug("destryo audiodevice"); QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE; -// #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 # endif delete d->unwrittenBuffer; delete d; -//#endif QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE; } void AudioDevice::volumeChanged( bool muted ) @@ -285,26 +236,12 @@ void AudioDevice::volumeChanged( bool muted ) AudioDevicePrivate::muted = muted; } 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" ); -// // 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; @@ -335,15 +272,12 @@ 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 ); } if ( d->can_GETOSPACE ) { @@ -362,28 +296,18 @@ unsigned int AudioDevice::canWrite() const } 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; -// } -// 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; } return buffered; -//#endif } diff --git a/core/multimedia/opieplayer/audiowidget.cpp b/core/multimedia/opieplayer/audiowidget.cpp index d20d560..ef7c8dc 100644 --- a/core/multimedia/opieplayer/audiowidget.cpp +++ b/core/multimedia/opieplayer/audiowidget.cpp @@ -143,20 +143,20 @@ AudioWidget::AudioWidget(QWidget* parent, const char* name, WFlags f) : 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( viewChanged(char) ), this, SLOT( setView(char) ) ); connect( mediaPlayerState, SIGNAL( loopingToggled(bool) ), this, SLOT( setLooping(bool) ) ); - connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) ); +// 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() ); setLooping( mediaPlayerState->fullscreen() ); - setPaused( mediaPlayerState->paused() ); +// setPaused( mediaPlayerState->paused() ); setPlaying( mediaPlayerState->playing() ); } AudioWidget::~AudioWidget() { @@ -360,27 +360,44 @@ void AudioWidget::mouseMoveEvent( QMouseEvent *event ) { toggleButton(i); switch (i) { case AudioVolumeUp: qDebug("more clicked"); emit moreClicked(); return; - case AudioVolumeDown: emit lessClicked(); return; + case AudioVolumeDown: + qDebug("less clicked"); + emit lessClicked(); + return; + case AudioForward: + emit forwardClicked(); + return; + case AudioBack: + emit backClicked(); + 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 AudioPlay: + if( mediaPlayerState->isPaused ) { + mediaPlayerState->setPaused( FALSE ); + return; + } else if( !mediaPlayerState->isPaused ) { + mediaPlayerState->setPaused( TRUE ); + return; + } +// case AudioPlay: mediaPlayerState->setPlaying(audioButtons[i].isDown); return; case AudioStop: mediaPlayerState->setPlaying(FALSE); return; - case AudioPause: mediaPlayerState->setPaused(audioButtons[i].isDown); 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; @@ -460,22 +477,22 @@ void AudioWidget::keyReleaseEvent( QKeyEvent *e) mediaPlayerState->setPlaying(TRUE); // toggleButton(0); } } break; case Key_Down: //volume - toggleButton(6); +// toggleButton(6); emit lessClicked(); emit lessReleased(); - toggleButton(6); +// toggleButton(6); break; case Key_Up: //volume - toggleButton(5); +// toggleButton(5); emit moreClicked(); emit moreReleased(); - toggleButton(5); +// toggleButton(5); break; case Key_Right: //next in playlist // toggleButton(3); mediaPlayerState->setNext(); // toggleButton(3); break; diff --git a/core/multimedia/opieplayer/audiowidget.h b/core/multimedia/opieplayer/audiowidget.h index c686741..96bc55c 100644 --- a/core/multimedia/opieplayer/audiowidget.h +++ b/core/multimedia/opieplayer/audiowidget.h @@ -33,21 +33,22 @@ #include <opie/oticker.h> class QPixmap; enum AudioButtons { - AudioPlay, + AudioPlay=0, AudioStop, - AudioPause, AudioNext, AudioPrevious, AudioVolumeUp, AudioVolumeDown, AudioLoop, - AudioPlayList + AudioPlayList, + AudioForward, + AudioBack }; //#define USE_DBLBUF class AudioWidget : public QWidget { @@ -58,25 +59,29 @@ public: void setTickerText( const QString &text ) { songInfo.setText( text ); } bool isStreaming; public slots: void updateSlider( long, long ); void sliderPressed( ); void sliderReleased( ); - void setPaused( bool b) { setToggleButton( AudioPause, b ); } +// void setPaused( bool b) { setToggleButton( AudioPause, b ); } void setLooping( bool b) { setToggleButton( AudioLoop, b ); } void setPlaying( bool b) { setToggleButton( AudioPlay, b ); } void setPosition( long ); void setLength( long ); void setView( char ); signals: void moreClicked(); void lessClicked(); void moreReleased(); void lessReleased(); void sliderMoved(long); + void forwardClicked(); + void backClicked(); + void forwardReleased(); + void backReleased(); protected: void doBlank(); void doUnblank(); void paintEvent( QPaintEvent *pe ); void showEvent( QShowEvent *se ); diff --git a/core/multimedia/opieplayer/mediaplayer.cpp b/core/multimedia/opieplayer/mediaplayer.cpp index b0963cf..4f3823a 100644 --- a/core/multimedia/opieplayer/mediaplayer.cpp +++ b/core/multimedia/opieplayer/mediaplayer.cpp @@ -103,20 +103,22 @@ void MediaPlayer::setPlaying( bool play ) { mediaPlayerState->setPlaying( FALSE ); return; } if ( ((currentFile->file()).left(4) != "http") && !QFile::exists( currentFile->file() ) ) { QMessageBox::critical( 0, tr( "File not found"), - tr( "The following file was not found: <i>" ) + currentFile->file() + "</i>" ); + tr( "The following file was not found: <i>" ) + + currentFile->file() + "</i>" ); mediaPlayerState->setPlaying( FALSE ); return; } if ( !mediaPlayerState->newDecoder( currentFile->file() ) ) { QMessageBox::critical( 0, tr( "No decoder found"), - tr( "Sorry, no appropriate decoders found for this file: <i>" ) + currentFile->file() + "</i>" ); + tr( "Sorry, no appropriate decoders found for this file: <i>" ) + + currentFile->file() + "</i>" ); mediaPlayerState->setPlaying( FALSE ); return; } if ( !loopControl->init( currentFile->file() ) ) { QMessageBox::critical( 0, tr( "Error opening file"), @@ -173,25 +175,76 @@ void MediaPlayer::startDecreasingVolume() { void MediaPlayer::startIncreasingVolume() { volumeDirection = +1; startTimer( 100 ); AudioDevice::increaseVolume(); + } +bool drawnOnScreenDisplay = FALSE; +unsigned int onScreenDisplayVolume = 0; +const int yoff = 110; void MediaPlayer::stopChangingVolume() { killTimers(); + + // Get rid of the on-screen display stuff + drawnOnScreenDisplay = FALSE; + onScreenDisplayVolume = 0; + int w = audioUI->width(); + int h = audioUI->height(); + audioUI->repaint( (w - 200) / 2, h - yoff, 200 + 9, 70, FALSE ); } void MediaPlayer::timerEvent( QTimerEvent * ) { +// qDebug("timer"); if ( volumeDirection == +1 ) - AudioDevice::increaseVolume(); + AudioDevice::increaseVolume(); else if ( volumeDirection == -1 ) AudioDevice::decreaseVolume(); + + // Display an on-screen display volume + unsigned int l, r, v; bool m; + AudioDevice::getVolume( l, r, m ); + v = ((l + r) * 11) / (2*0xFFFF); + + if ( drawnOnScreenDisplay && onScreenDisplayVolume == v ) { +// qDebug("returning %d, %d, %d, %d", v, l, r, m); + return; + } + + int w = audioUI->width(); + int h = audioUI->height(); + + if ( drawnOnScreenDisplay ) { + if ( onScreenDisplayVolume > v ) + audioUI->repaint( (w - 200) / 2 + v * 20 + 0, h - yoff + 40, + (onScreenDisplayVolume - v) * 20 + 9, 30, FALSE ); + } + + drawnOnScreenDisplay = TRUE; + onScreenDisplayVolume = v; + + QPainter p( audioUI ); + p.setPen( QColor( 0x10, 0xD0, 0x10 ) ); + p.setBrush( QColor( 0x10, 0xD0, 0x10 ) ); + + QFont f; + f.setPixelSize( 20 ); + f.setBold( TRUE ); + p.setFont( f ); + p.drawText( (w - 200) / 2, h - yoff + 20, tr("Volume") ); + + for ( unsigned int i = 0; i < 10; i++ ) { + if ( v > i ) + p.drawRect( (w - 200) / 2 + i * 20 + 0, h - yoff + 40, 9, 30 ); + else + p.drawRect( (w - 200) / 2 + i * 20 + 3, h - yoff + 50, 3, 10 ); + } } void MediaPlayer::keyReleaseEvent( QKeyEvent *e) { switch ( e->key() ) { ////////////////////////////// Zaurus keys case Key_Home: diff --git a/core/multimedia/opieplayer/mediaplayerstate.h b/core/multimedia/opieplayer/mediaplayerstate.h index 26185c5..1c65599 100644 --- a/core/multimedia/opieplayer/mediaplayerstate.h +++ b/core/multimedia/opieplayer/mediaplayerstate.h @@ -30,12 +30,13 @@ class Config; class MediaPlayerState : public QObject { Q_OBJECT public: MediaPlayerState( QObject *parent, const char *name ); ~MediaPlayerState(); + bool isPaused; bool isStreaming; bool fullscreen() { return isFullscreen; } bool scaled() { return isScaled; } bool looping() { return isLooping; } bool shuffled() { return isShuffled; } @@ -98,13 +99,12 @@ signals: private: bool isFullscreen; bool isScaled; bool isLooping; bool isShuffled; bool usePlaylist; - bool isPaused; bool isPlaying; long curPosition; long curLength; char curView; MediaPlayerDecoder *decoder; |