return NULL;
}
#else
+ VLC_UNUSED (p_resource); VLC_UNUSED (p_sout); VLC_UNUSED (psz_sout);
return NULL;
#endif
}
if( p_resource->p_vout_free || i_vout_active > 0 || !b_recycle )
{
if( b_recycle )
- msg_Dbg( p_resource->p_parent, "detroying vout (already one saved or active)" );
+ msg_Dbg( p_resource->p_parent, "destroying vout (already one saved or active)" );
vout_CloseAndRelease( p_vout );
}
else
{
audio_output_t *p_aout;
- vlc_mutex_lock( &p_resource->lock );
- if( p_resource->b_aout_busy )
- {
- vlc_mutex_unlock( &p_resource->lock );
- msg_Dbg( p_resource->p_parent, "creating extra audio output" );
- return aout_New( p_resource->p_parent );
- }
-
+ vlc_mutex_lock( &p_resource->lock_hold );
p_aout = p_resource->p_aout;
- if( p_aout == NULL )
+
+ if( p_aout == NULL || p_resource->b_aout_busy )
{
msg_Dbg( p_resource->p_parent, "creating audio output" );
+ vlc_mutex_unlock( &p_resource->lock_hold );
+
p_aout = aout_New( p_resource->p_parent );
+ if( p_aout == NULL )
+ return NULL; /* failed */
+
+ vlc_mutex_lock( &p_resource->lock_hold );
+ if( p_resource->p_aout == NULL )
+ p_resource->p_aout = p_aout;
}
else
msg_Dbg( p_resource->p_parent, "reusing audio output" );
- if( p_aout != NULL )
+ if( p_resource->p_aout == p_aout )
{
- vlc_mutex_lock( &p_resource->lock_hold );
- p_resource->p_aout = p_aout;
- vlc_mutex_unlock( &p_resource->lock_hold );
-
+ assert( !p_resource->b_aout_busy );
p_resource->b_aout_busy = true;
- vlc_object_hold( p_aout );
}
- vlc_mutex_unlock( &p_resource->lock );
+ vlc_mutex_unlock( &p_resource->lock_hold );
return p_aout;
}
{
assert( p_aout != NULL );
- vlc_mutex_lock( &p_resource->lock );
+ vlc_mutex_lock( &p_resource->lock_hold );
if( p_aout == p_resource->p_aout )
{
assert( p_resource->b_aout_busy );
p_resource->b_aout_busy = false;
msg_Dbg( p_resource->p_parent, "keeping audio output" );
- vlc_object_release( p_aout );
p_aout = NULL;
}
else
msg_Dbg( p_resource->p_parent, "destroying extra audio output" );
- vlc_mutex_unlock( &p_resource->lock );
+ vlc_mutex_unlock( &p_resource->lock_hold );
if( p_aout != NULL )
aout_Destroy( p_aout );
vlc_mutex_lock( &p_resource->lock_hold );
p_aout = p_resource->p_aout;
- if( p_aout )
+ if( p_aout != NULL )
vlc_object_hold( p_aout );
vlc_mutex_unlock( &p_resource->lock_hold );
return p_aout;
}
-static void input_resource_TerminateAout( input_resource_t *p_resource )
+void input_resource_ResetAout( input_resource_t *p_resource )
{
- audio_output_t *p_aout;
+ audio_output_t *p_aout = NULL;
- vlc_mutex_lock( &p_resource->lock );
vlc_mutex_lock( &p_resource->lock_hold );
- p_aout = p_resource->p_aout;
+ if( !p_resource->b_aout_busy )
+ p_aout = p_resource->p_aout;
+
p_resource->p_aout = NULL;
- vlc_mutex_unlock( &p_resource->lock_hold );
p_resource->b_aout_busy = false;
- vlc_mutex_unlock( &p_resource->lock );
+ vlc_mutex_unlock( &p_resource->lock_hold );
if( p_aout != NULL )
aout_Destroy( p_aout );
void input_resource_Terminate( input_resource_t *p_resource )
{
input_resource_TerminateSout( p_resource );
- input_resource_TerminateAout( p_resource );
+ input_resource_ResetAout( p_resource );
input_resource_TerminateVout( p_resource );
}