From: Thibaut M. <tma...@no...> - 2003-04-06 19:51:22
|
Hi Miguel, On Thursday 03 April 2003 22:08, Miguel Freitas wrote: > On Thu, 2003-04-03 at 16:34, Thibaut Mattern wrote: > > I don't know if it's normal or not, but it's a known issue. > > I'm trying to improve seeking speed, and this write() call is > > problematic. I propose to add a new function to audio drivers to return > > the number of byte or frame that could be written without blocking (i > > guess this info is available for oss and alsa). > > comments ? > > even when the api provides such info, we would still need to check if > all drivers do implement it and if they do it right. it's not uncommon > to find that these "more advanced" features of oss drivers (such as > poll/select) are completely broken on some cards. are you sure that the SNDCTL_DSP_GETOSPACE command is not suitable ? It does'nt look like an "advanced" feature. (mplayer uses it, i guess it's well tested) =46rom audio_out.h : /* * write audio data to output buffer=20 * audio driver must sync sample playback with metronom * return value:=20 * 1 =3D> audio samples were processed ok * 0 =3D> audio samples were not yet processed,=20 * call write_audio_data with the _same_ samples again */ int (*write)(ao_driver_t *this, int16_t* audio_data, uint32_t num_samples); The returned value is not checked in the ao_loop. What about returning 0 if the buffer can't be written without blocking and= =20 adding a simple while loop in ao_loop ? something like that : pthread_mutex_lock( &this->driver_lock ); while (!this->driver->write (this->driver, mem, step_frame )) { pthread_mutex_unlock( &this->driver_lock ); usleep(10000); pthread_mutex_lock( &this->driver_lock ); } pthread_mutex_unlock( &this->driver_lock ); > have you tried to just break the sample buffer and send smaller chunks > to the sound card? we might use rate to calculate the maximum time we > want it to block waiting. it works, but i guess there is a little performance hit. > regards, > > Miguel cheers, thibaut |