summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/audiodevice.cpp76
-rw-r--r--core/multimedia/opieplayer/audiowidget.cpp35
-rw-r--r--core/multimedia/opieplayer/audiowidget.h13
-rw-r--r--core/multimedia/opieplayer/mediaplayer.cpp59
-rw-r--r--core/multimedia/opieplayer/mediaplayerstate.h2
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;