/* Lock for communication with decoder thread */
vlc_mutex_t lock;
- vlc_cond_t wait;
+ vlc_cond_t wait_request;
+ vlc_cond_t wait_acknowledge;
/* -- These variables need locking on write(only) -- */
aout_instance_t *p_aout;
p_owner->b_paused = false;
p_owner->b_buffering = false;
p_owner->b_flushing = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_request );
vlc_mutex_unlock( &p_owner->lock );
vlc_thread_join( p_dec );
p_owner->b_paused = b_paused;
p_owner->pause.i_date = i_date;
p_owner->pause.i_ignore = 0;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_request );
DecoderOutputChangePause( p_dec, b_paused, i_date );
p_owner->b_buffering = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_request );
vlc_mutex_unlock( &p_owner->lock );
}
p_owner->b_buffering = false;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_request );
vlc_mutex_unlock( &p_owner->lock );
}
while( vlc_object_alive( p_dec ) && p_owner->b_buffering && !p_owner->buffer.b_full )
{
block_FifoWake( p_owner->p_fifo );
- vlc_cond_wait( &p_owner->wait, &p_owner->lock );
+ vlc_cond_wait( &p_owner->wait_acknowledge, &p_owner->lock );
}
vlc_mutex_unlock( &p_owner->lock );
{
vout_NextPicture( p_owner->p_vout, pi_duration );
p_owner->pause.i_ignore++;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_request );
}
}
else
/* */
vlc_mutex_init( &p_owner->lock );
- vlc_cond_init( &p_owner->wait );
+ vlc_cond_init( &p_owner->wait_request );
+ vlc_cond_init( &p_owner->wait_acknowledge );
p_owner->b_fmt_description = false;
es_format_Init( &p_owner->fmt_description, UNKNOWN_ES, 0 );
/* Monitor for flush end */
p_owner->b_flushing = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_request );
/* Send a special block */
block_t *p_null = DecoderBlockFlushNew();
/* */
while( vlc_object_alive( p_dec ) && p_owner->b_flushing )
- vlc_cond_wait( &p_owner->wait, &p_owner->lock );
-}
-
-static void DecoderSignalFlushed( decoder_t *p_dec )
-{
- decoder_owner_sys_t *p_owner = p_dec->p_owner;
-
- vlc_mutex_lock( &p_owner->lock );
-
- if( p_owner->b_flushing )
- {
- p_owner->b_flushing = false;
- vlc_cond_signal( &p_owner->wait );
- }
-
- vlc_mutex_unlock( &p_owner->lock );
+ vlc_cond_wait( &p_owner->wait_acknowledge, &p_owner->lock );
}
static void DecoderSignalBuffering( decoder_t *p_dec, bool b_full )
{
if( b_full )
p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
vlc_mutex_unlock( &p_owner->lock );
if( !p_owner->b_buffering || !p_owner->buffer.b_full )
break;
}
- vlc_cond_wait( &p_owner->wait, &p_owner->lock );
+ vlc_cond_wait( &p_owner->wait_request, &p_owner->lock );
}
if( pb_reject )
p_audio->start_date - p_owner->buffer.p_audio->start_date > DECODER_MAX_BUFFERING_AUDIO_DURATION )
{
p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
}
vlc_mutex_unlock( &p_owner->lock );
break;
}
- vlc_cond_timedwait( &p_owner->wait, &p_owner->lock, i_deadline );
+ vlc_cond_timedwait( &p_owner->wait_request, &p_owner->lock, i_deadline );
vlc_mutex_unlock( &p_owner->lock );
}
p_picture->date - p_owner->buffer.p_picture->date > DECODER_MAX_BUFFERING_VIDEO_DURATION )
{
p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
}
b_first_buffered = p_owner->buffer.p_picture != NULL;
if( p_owner->buffer.i_count > 0 )
{
p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
}
if( p_owner->buffer.i_count > 0 )
{
p_owner->buffer.b_full = true;
- vlc_cond_signal( &p_owner->wait );
+ vlc_cond_signal( &p_owner->wait_acknowledge );
}
}
vlc_mutex_lock( &p_owner->lock );
DecoderFlushBuffering( p_dec );
- vlc_mutex_unlock( &p_owner->lock );
- DecoderSignalFlushed( p_dec );
+ if( p_owner->b_flushing )
+ {
+ p_owner->b_flushing = false;
+ vlc_cond_signal( &p_owner->wait_acknowledge );
+ }
+ vlc_mutex_unlock( &p_owner->lock );
}
+
/**
* Decode a block
*
vlc_object_release( p_owner->p_packetizer );
}
- vlc_cond_destroy( &p_owner->wait );
+ vlc_cond_destroy( &p_owner->wait_acknowledge );
+ vlc_cond_destroy( &p_owner->wait_request );
vlc_mutex_destroy( &p_owner->lock );
vlc_object_detach( p_dec );