-/*****************************************************************************
- * ESDThread: asynchronous thread used to DMA the data to the device
- *****************************************************************************/
-static int ESDThread( aout_instance_t * p_aout )
-{
- struct aout_sys_t * p_sys = p_aout->output.p_sys;
-
- while ( !p_aout->b_die )
- {
- aout_buffer_t * p_buffer;
- mtime_t next_date = 0;
- int i_tmp, i_size;
- byte_t * p_bytes;
-
- if( !p_sys->b_initialized )
- {
- msleep( THREAD_SLEEP );
- continue;
- }
-
- if ( p_aout->output.output.i_format != AOUT_FMT_SPDIF )
- {
- /* Get the presentation date of the next write() operation. It
- * is equal to the current date + esd latency */
- /* FIXME: wtf ? it works better with a - here */
- next_date = -(mtime_t)esd_get_latency(esd_open_sound(NULL))
- * 1000000
- / aout_FormatToByterate( &p_aout->output.output,
- p_aout->output.output.i_rate );
- next_date += mdate();
- }
-
- p_buffer = aout_OutputNextBuffer( p_aout, next_date );
-
- if ( p_buffer != NULL )
- {
- p_bytes = p_buffer->p_buffer;
- i_size = aout_FormatToSize( &p_aout->output.output,
- p_buffer->i_nb_samples );
- }
- else
- {
- i_size = aout_FormatToSize( &p_aout->output.output,
- DEFAULT_FRAME_SIZE );
- p_bytes = alloca( i_size );
- memset( p_bytes, 0, i_size );
- }
-
- i_tmp = write( p_sys->i_fd, p_bytes, i_size );
-
- if( i_tmp < 0 )
- {
- msg_Err( p_aout, "write failed (%s)", strerror(errno) );
- }
-
- if ( p_buffer != NULL )
- {
- aout_BufferFree( p_buffer );
- }
- }
-
- return 0;
-}
-