summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/audiodevice.cpp
Side-by-side diff
Diffstat (limited to 'core/multimedia/opieplayer/audiodevice.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/audiodevice.cpp155
1 files changed, 69 insertions, 86 deletions
diff --git a/core/multimedia/opieplayer/audiodevice.cpp b/core/multimedia/opieplayer/audiodevice.cpp
index 7b3700a..9a10eb4 100644
--- a/core/multimedia/opieplayer/audiodevice.cpp
+++ b/core/multimedia/opieplayer/audiodevice.cpp
@@ -1,5 +1,5 @@
/**********************************************************************
-** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
-** This file is part of the Qtopia Environment.
+** This file is part of Qtopia Environment.
**
@@ -19,4 +19,6 @@
**********************************************************************/
+// L.J.Potter added better error code Fri 02-15-2002 14:37:47
#include <stdlib.h>
+#include <stdio.h>
#include <qpe/qpeapplication.h>
@@ -108,3 +110,3 @@ void AudioDevice::getVolume( unsigned int& leftVolume, unsigned int& rightVolume
if ( waveOutGetVolume( handle, (LPDWORD)&volume ) )
- qDebug( "get volume of audio device failed" );
+// qDebug( "get volume of audio device failed" );
waveOutClose( handle );
@@ -115,6 +117,7 @@ void AudioDevice::getVolume( unsigned int& leftVolume, unsigned int& rightVolume
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;
@@ -128,9 +131,9 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume,
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 );
}
@@ -149,3 +152,3 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume,
if ( waveOutSetVolume( handle, volume ) )
- qDebug( "set volume of audio device failed" );
+// qDebug( "set volume of audio device failed" );
waveOutClose( handle );
@@ -160,6 +163,8 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume,
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
@@ -188,41 +193,13 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
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;
@@ -233,7 +210,7 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
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 {
@@ -243,9 +220,16 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
- 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\")");
}
@@ -257,4 +241,4 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
- //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" );
@@ -263,3 +247,2 @@ AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
//if ( capabilities & DSP_CAP_MMAP ) qDebug( "Sound card can mmap" );
-#endif
}
@@ -272,3 +255,3 @@ AudioDevice::~AudioDevice() {
# 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
@@ -299,3 +282,3 @@ void AudioDevice::write( char *buffer, unsigned int length )
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();
@@ -305,5 +288,5 @@ void AudioDevice::write( char *buffer, unsigned int length )
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;
}
@@ -343,23 +326,23 @@ unsigned int AudioDevice::canWrite() const
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;
}
@@ -373,4 +356,4 @@ int AudioDevice::bytesWritten() {
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;
}
@@ -380,4 +363,4 @@ int AudioDevice::bytesWritten() {
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;
}