summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/audiodevice.cpp
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/audiodevice.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/audiodevice.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/audiodevice.cpp b/core/multimedia/opieplayer/audiodevice.cpp
index ad44abb..e0989d0 100644
--- a/core/multimedia/opieplayer/audiodevice.cpp
+++ b/core/multimedia/opieplayer/audiodevice.cpp
@@ -182,103 +182,111 @@ void AudioDevice::setVolume( unsigned int leftVolume, unsigned int rightVolume,
182 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << muted; 182 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << muted;
183#endif 183#endif
184} 184}
185 185
186 186
187 187
188 188
189AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) { 189AudioDevice::AudioDevice( unsigned int f, unsigned int chs, unsigned int bps ) {
190 qDebug("creating new audio device"); 190 qDebug("creating new audio device");
191 d = new AudioDevicePrivate; 191 d = new AudioDevicePrivate;
192 d->frequency = f; 192 d->frequency = f;
193 d->channels = chs; 193 d->channels = chs;
194 d->bytesPerSample = bps; 194 d->bytesPerSample = bps;
195 qDebug("%d",bps); 195 qDebug("%d",bps);
196 int format=0; 196 int format=0;
197 if( bps == 8) format = AFMT_U8; 197 if( bps == 8) format = AFMT_U8;
198 else if( bps <= 0) format = AFMT_S16_LE; 198 else if( bps <= 0) format = AFMT_S16_LE;
199 else format = AFMT_S16_LE; 199 else format = AFMT_S16_LE;
200 qDebug("AD- freq %d, channels %d, b/sample %d, bitrate %d",f,chs,bps,format); 200 qDebug("AD- freq %d, channels %d, b/sample %d, bitrate %d",f,chs,bps,format);
201 connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( volumeChanged(bool) ) ); 201 connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( volumeChanged(bool) ) );
202 202
203 int fragments = 0x10000 * 8 + sound_fragment_shift; 203 int fragments = 0x10000 * 8 + sound_fragment_shift;
204 int capabilities = 0; 204 int capabilities = 0;
205 205
206 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE;
207
206#ifdef KEEP_DEVICE_OPEN 208#ifdef KEEP_DEVICE_OPEN
207 if ( AudioDevicePrivate::dspFd == 0 ) { 209 if ( AudioDevicePrivate::dspFd == 0 ) {
208#endif 210#endif
209 if ( ( d->handle = ::open( "/dev/dsp", O_WRONLY ) ) < 0 ) { 211 if ( ( d->handle = ::open( "/dev/dsp", O_WRONLY ) ) < 0 ) {
210 perror("open(\"/dev/dsp\") sending to /dev/null instead"); 212 perror("open(\"/dev/dsp\") sending to /dev/null instead");
211 d->handle = ::open( "/dev/null", O_WRONLY ); 213 d->handle = ::open( "/dev/null", O_WRONLY );
212 } 214 }
213#ifdef KEEP_DEVICE_OPEN 215#ifdef KEEP_DEVICE_OPEN
214 AudioDevicePrivate::dspFd = d->handle; 216 AudioDevicePrivate::dspFd = d->handle;
215 } else { 217 } else {
216 d->handle = AudioDevicePrivate::dspFd; 218 d->handle = AudioDevicePrivate::dspFd;
217 } 219 }
218#endif 220#endif
219 221
220 if(ioctl( d->handle, SNDCTL_DSP_GETCAPS, &capabilities )==-1) 222 if(ioctl( d->handle, SNDCTL_DSP_GETCAPS, &capabilities )==-1)
221 perror("ioctl(\"SNDCTL_DSP_GETCAPS\")"); 223 perror("ioctl(\"SNDCTL_DSP_GETCAPS\")");
222 if(ioctl( d->handle, SNDCTL_DSP_SETFRAGMENT, &fragments )==-1) 224 if(ioctl( d->handle, SNDCTL_DSP_SETFRAGMENT, &fragments )==-1)
223 perror("ioctl(\"SNDCTL_DSP_SETFRAGMENT\")"); 225 perror("ioctl(\"SNDCTL_DSP_SETFRAGMENT\")");
224 if(ioctl( d->handle, SNDCTL_DSP_SETFMT, & format )==-1) 226 if(ioctl( d->handle, SNDCTL_DSP_SETFMT, & format )==-1)
225 perror("ioctl(\"SNDCTL_DSP_SETFMT\")"); 227 perror("ioctl(\"SNDCTL_DSP_SETFMT\")");
226 qDebug("freq %d", d->frequency); 228 qDebug("freq %d", d->frequency);
227 if(ioctl( d->handle, SNDCTL_DSP_SPEED, &d->frequency )==-1) 229 if(ioctl( d->handle, SNDCTL_DSP_SPEED, &d->frequency )==-1)
228 perror("ioctl(\"SNDCTL_DSP_SPEED\")"); 230 perror("ioctl(\"SNDCTL_DSP_SPEED\")");
229 qDebug("channels %d",d->channels); 231 qDebug("channels %d",d->channels);
230 if ( ioctl( d->handle, SNDCTL_DSP_CHANNELS, &d->channels ) == -1 ) { 232 if ( ioctl( d->handle, SNDCTL_DSP_CHANNELS, &d->channels ) == -1 ) {
231 d->channels = ( d->channels == 1 ) ? 2 : d->channels; 233 d->channels = ( d->channels == 1 ) ? 2 : d->channels;
232 if(ioctl( d->handle, SNDCTL_DSP_CHANNELS, &d->channels )==-1) 234 if(ioctl( d->handle, SNDCTL_DSP_CHANNELS, &d->channels )==-1)
233 perror("ioctl(\"SNDCTL_DSP_CHANNELS\")"); 235 perror("ioctl(\"SNDCTL_DSP_CHANNELS\")");
234 } 236 }
235 237
236 d->bufferSize = sound_fragment_bytes; 238 d->bufferSize = sound_fragment_bytes;
237 d->unwrittenBuffer = new char[d->bufferSize]; 239 d->unwrittenBuffer = new char[d->bufferSize];
238 d->unwritten = 0; 240 d->unwritten = 0;
239 d->can_GETOSPACE = TRUE; // until we find otherwise 241 d->can_GETOSPACE = TRUE; // until we find otherwise
240 242
241 //if ( chs != d->channels ) qDebug( "Wanted %d, got %d channels", chs, d->channels ); 243 //if ( chs != d->channels ) qDebug( "Wanted %d, got %d channels", chs, d->channels );
242 //if ( f != d->frequency ) qDebug( "wanted %dHz, got %dHz", f, d->frequency ); 244 //if ( f != d->frequency ) qDebug( "wanted %dHz, got %dHz", f, d->frequency );
243 //if ( capabilities & DSP_CAP_BATCH ) qDebug( "Sound card has local buffer" ); 245 //if ( capabilities & DSP_CAP_BATCH ) qDebug( "Sound card has local buffer" );
244 //if ( capabilities & DSP_CAP_REALTIME )qDebug( "Sound card has realtime sync" ); 246 //if ( capabilities & DSP_CAP_REALTIME )qDebug( "Sound card has realtime sync" );
245 //if ( capabilities & DSP_CAP_TRIGGER ) qDebug( "Sound card has precise trigger" ); 247 //if ( capabilities & DSP_CAP_TRIGGER ) qDebug( "Sound card has precise trigger" );
246 //if ( capabilities & DSP_CAP_MMAP ) qDebug( "Sound card can mmap" ); 248 //if ( capabilities & DSP_CAP_MMAP ) qDebug( "Sound card can mmap" );
249 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE;
250
247} 251}
248 252
249 253
250AudioDevice::~AudioDevice() { 254AudioDevice::~AudioDevice() {
251 qDebug("destryo audiodevice"); 255 qDebug("destryo audiodevice");
256 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << TRUE;
257
252#ifdef Q_OS_WIN32 258#ifdef Q_OS_WIN32
253 waveOutClose( (HWAVEOUT)d->handle ); 259 waveOutClose( (HWAVEOUT)d->handle );
254#else 260#else
255# ifndef KEEP_DEVICE_OPEN 261# ifndef KEEP_DEVICE_OPEN
256 close( d->handle ); // Now it should be safe to shut the handle 262 close( d->handle ); // Now it should be safe to shut the handle
257# endif 263# endif
258 delete d->unwrittenBuffer; 264 delete d->unwrittenBuffer;
259 delete d; 265 delete d;
260#endif 266#endif
267 QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE;
268
261} 269}
262 270
263 271
264void AudioDevice::volumeChanged( bool muted ) 272void AudioDevice::volumeChanged( bool muted )
265{ 273{
266 AudioDevicePrivate::muted = muted; 274 AudioDevicePrivate::muted = muted;
267} 275}
268 276
269 277
270void AudioDevice::write( char *buffer, unsigned int length ) 278void AudioDevice::write( char *buffer, unsigned int length )
271{ 279{
272#ifdef Q_OS_WIN32 280#ifdef Q_OS_WIN32
273 // returns immediately and (to be implemented) emits completedIO() when finished writing 281 // returns immediately and (to be implemented) emits completedIO() when finished writing
274 WAVEHDR *lpWaveHdr = (WAVEHDR *)malloc( sizeof(WAVEHDR) ); 282 WAVEHDR *lpWaveHdr = (WAVEHDR *)malloc( sizeof(WAVEHDR) );
275 // maybe the buffer should be copied so that this fool proof, but its a performance hit 283 // maybe the buffer should be copied so that this fool proof, but its a performance hit
276 lpWaveHdr->lpData = buffer; 284 lpWaveHdr->lpData = buffer;
277 lpWaveHdr->dwBufferLength = length; 285 lpWaveHdr->dwBufferLength = length;
278 lpWaveHdr->dwFlags = 0L; 286 lpWaveHdr->dwFlags = 0L;
279 lpWaveHdr->dwLoops = 0L; 287 lpWaveHdr->dwLoops = 0L;
280 waveOutPrepareHeader( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ); 288 waveOutPrepareHeader( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) );
281 // waveOutWrite returns immediately. the data is sent in the background. 289 // waveOutWrite returns immediately. the data is sent in the background.
282 if ( waveOutWrite( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ) ) 290 if ( waveOutWrite( (HWAVEOUT)d->handle, lpWaveHdr, sizeof(WAVEHDR) ) )
283 qDebug( "failed to write block to audio device" ); 291 qDebug( "failed to write block to audio device" );
284 // emit completedIO(); 292 // emit completedIO();